
每个节点。智能合约是一种旨在以信息化方式传播每个节点,验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行,智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。
待字闺中开发了一门区块链方面的课程:《深入浅出ETH原理与智能合约开发》,马良老师讲授。此文集记录我的学习笔记。
课程共8节课。其中,前四课讲ETH原理,后四课讲智能合约。
第四课分为三部分:
这篇文章是第四课第一部分的学习笔记:Ethash算法。
这节课介绍的是以太坊非常核心的挖矿算法。
在介绍Ethash算法之前,先讲一些背景知识。其实区块链技术主要是解决一个共识的问题,而共识是一个层次很丰富的概念,这里把范畴缩小,只讨论区块链中的共识。
什么是共识?
在区块链中,共识是指哪个节点有记账权。网络中有多个节点,理论上都有记账权,首先面临的问题就是,到底谁来记帐。另一个问题,交易一定是有顺序的,即谁在前,前在后。这样可以解决双花问题。区块链中的共识机制就是解决这两个问题,谁记帐和交易的顺序。
什么是工作量证明算法
为了决定众多节点中谁来记帐,可以有多种方案。其中,工作量证明就让节点去算一个哈希值,满足难度目标值的胜出。这个过程只能通过枚举计算,谁算的快,谁获胜的概率大。收益跟节点的工作量有关,这就是工作量证明算法。
为什么要引入工作量证明算法?
Hash Cash 由Adam Back 在1997年发表,中本聪首次在比特币中应用来解决共识问题。
它最初用来解决垃圾邮件问题。
其主要设计思想是通过暴力搜索,找到一种Block头部组合(通过调整nonce)使得嵌套的SHA256单向散列值输出小于一个特定的值(Target)。
这个算法是计算密集型算法,一开始从CPU挖矿,转而为GPU,转而为FPGA,转而为ASIC,从而使得算力变得非常集中。
算力集中就会带来一个问题,若有一个矿池的算力达到51%,则它就会有作恶的风险。这是比特币等使用工作量证明算法的系统的弊端。而以太坊则吸取了这个教训,进行了一些改进,诞生了Ethash算法。
Ethash算法吸取了比特币的教训,专门设计了非常不利用计算的模型,它采用了I/O密集的模型,I/O慢,计算再快也没用。这样,对专用集成电路则不是那么有效。
该算法对GPU友好。一是考虑如果只支持CPU,担心易被木马攻击;二是现在的显存都很大。
轻型客户端的算法不适于挖矿,易于验证;快速启动
算法中,主要依赖于Keccake256 。
数据源除了传统的Block头部,还引入了随机数阵列DAG(有向非循环图)(Vitalik提出)
种子值很小。根据种子值生成缓存值,缓存层的初始值为16M,每个世代增加128K。
在缓存层之下是矿工使用的数据值,数据层的初始值是1G,每个世代增加8M。整个数据层的大小是128Bytes的素数倍。
框架主要分为两个部分,一是DAG的生成,二是用Hashimoto来计算最终的结果。
DAG分为三个层次,种子层,缓存层,数据层。三个层次是逐渐增大的。
种子层很小,依赖上个世代的种子层。
缓存层的第一个数据是根据种子层生成的,后面的根据前面的一个来生成,它是一个串行化的过程。其初始大小是16M,每个世代增加128K。每个元素64字节。
数据层就是要用到的数据,其初始大小1G,现在约2个G,每个元素128字节。数据层的元素依赖缓存层的256个元素。
整个流程是内存密集型。
首先是头部信息和随机数结合在一起,做一个Keccak运算,获得初始的单向散列值Mix[0],128字节。然后,通过另外一个函数,映射到DAG上,获取一个值,再与Mix[0]混合得到Mix[1],如此循环64次,得到Mix[64],128字节。
接下来经过后处理过程,得到 mix final 值,32字节。(这个值在前面两个小节《 009:GHOST协议 》、《 010:搭建测试网络 》都出现过)
再经过计算,得出结果。把它和目标值相比较,小于则挖矿成功。
难度值大,目标值小,就越难(前面需要的 0 越多)。
这个过程也是挖矿难,验证容易。
为防止矿机,mix function函数也有更新过。
难度公式见课件截图。
根据上一个区块的难度,来推算下一个。
从公式看出,难度由三部分组成,首先是上一区块的难度,然后是线性部分,最后是非线性部分。
非线性部分也叫难度炸d,在过了一个特定的时间节点后,难度是指数上升。如此设计,其背后的目的是,在以太坊的项目周期中,在大都会版本后的下一个版本中,要转换共识,由POW变为POW、POS混合型的协议。基金会的意思可能是使得挖矿变得没意思。
难度曲线图显示,2017年10月,难度有一个大的下降,奖励也由5个变为3个。
本节主要介绍了Ethash算法,不足之处,请批评指正。
通常,验证智能合约的正确性,分为动态分析和静态分析两个阶段。
动态分析就是执行代码或模拟执行代码,以期望发现并解决任何bug。需要创建测试计划和用例,并对每个测试用例进行测试。但测试并不使全面覆盖的,所以,动态分析还不能构成正确性证明。
而静态分析包括Review代码,以证明某些属性。通常被提及的形式验证法也依赖于静态分析。如果,合约通过从验证某些属性的前置条件开始,经过执行一系列指令后,总是可以分别获得其他属性的状态。逻辑和结果总是完全一致,就是正确的。运行这样的智能合约,基本上是不会出现错误的。
在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成。合约位于以太坊区块链上的一个特殊地址。uint storedData; 这行代码声明了一个状态变量,变量名为storedData,类型为 uint (256bits无符号整数)。你可以认为它就像数据库里面的一个存储单元,跟管理数据库一样,可以通过调用函数查询和修改它。在以太坊中,通常只有合约 的拥有者才能这样做。在这个例子中,函数 set 和 get 分别用于修改和查询变量的值。
跟很多其他语言一样,访问状态变量时,不需要在前面增加 this 这样的前缀。
这个合约还无法做很多事情(受限于以太坊的基础设施),仅仅是允许任何人储存一个数字。而且世界上任何一个人都可以来存取这个数字,缺少一个(可靠 的)方式来保护你发布的数字。任何人都可以调用set方法设置一个不同的数字覆盖你发布的数字。但是你的数字将会留存在区块链的历史上。稍后我们会学习如 何增加一个存取限制,使得只有你才能修改这个数字。
代币的例子
接下来的合约将实现一个形式最简单的加密货币。空中取币不再是一个魔术,当然只有创建合约的人才能做这件事情(想用其他货币发行模式也很简单,只是实现细节上的差异)。而且任何人都可以发送货币给其他人,不需要注册用户名和密码,只要有一对以太坊的公私钥即可。
注意
对于在线solidity环境来说,这不是一个好的例子。如果你使用在线solidity环境 来尝试这个例子。调用函数时,将无法改变from的地址。所以你只能扮演铸币者的角色,可以铸造货币并发送给其他人,而无法扮演其他人的角色。这点在线 solidity环境将来会做改进。
常有人问,什么是智能合约 那么一定得先了解什么是“合约”。
什么是智能合约?
智能合约(Smart Contract)是上世纪90年代由密码学家尼克·萨博提出的理念,由于当时缺乏可信的执行环境,智能合约没有被应用和发展, 直到 以太坊 的出现,才让智能合约得以“复活”。
那智能合约到底是什么呢?简单来说智能合约就是用计算机语言取代了法律语言记录条款并由程序自动执行的合约。换句话说,智能合约就是传统合约的数字化版本,跑在区块链网络上,由程序自动执行。
自动售货机、ATM取款机, 在某种程度上都可以被理解为执行智能合约的机器 ,但这都不是真正意义上的智能合约
设计阶段的智能合约安全注意事项
考虑威胁建模和安全设计
What:从开发生命周期的一开始就实施识别系统的潜在威胁并确定其优先级的具体方案是很重要的 —— 智能合约开发人员应确定要在开发中实施的所有安全控制以及应在开发中检查的所有威胁测试、审计和监控。所有的安全假设,包括攻击的预期复杂程度和手段,都应在设计阶段明确定义和阐明。
How:遵循已知的威胁建模实践。如果开发团队没有内部安全专业知识,那么它应该在设计阶段的早期与安全顾问合作。在设计系统时采用「攻击者」的心态,并假设任何个人、硬件或服务都可能受到攻击。
智能合约有哪些特点
与传统的合约相比,智能合约有三大特点:
1、合约内容公开透明
智能合约部署在区块链上,其合约内容自然是公开透明的。
2、合约内容不可篡改
同样,因为部署在区块链上原因,智能合约的内容是无法被修改的。
3、永久运行
运行在区块链上的智能合约,同样被区块链上网络节点共同维护,只要区块链在,智能合约就能永久的运行下去。有种“链在合约就在”的兄弟情义之感。
有区块链三大特点加持的智能合约,与传统的合约相比主要有如下优势
智能合约是用计算机语言取代了法律语言记录条款、由程序自动执行的合约。 部署在区块上的它,也具备了区块链的数据公开透明、不可篡改、永久运行的特点。
与传统的合约相比, 智能合约有去信任、安全、高效、无需第三方仲裁的优点 。但智能合约并不完美,而且也不智能或者说它的智能程度很低。
文章中提到智能合约的执行无需第三方机构裁决,同时又提到,当执行条件涉及到外部信息时,智能合约无法感知 ,需要对智能合约输入相关的信息,才能触发智能合约去执行裁决
不论你是否接受,未来终将改变。
区块链技术给数字经济时代带来了巨变的曙光。
这种巨变在互联网近50年的历史上曾发生过两次。第一次巨变是全球性的联
网……第二次巨变是全球性的应用……第三次巨变正在蕴酿。
————摘自《腾讯区块链方案白皮书》
当第一次读到这段时,完全不敢想象这是一家世界级企业对一项新技术的评价,
瞬间引起了我的兴趣。“巨变”是什么含义?就是说完全有可能颠覆我们现有的
经济结构和认知,彻底改变我们的生活方式。
一种从2009年才诞生的比特币技术中 抽象而来的block chain(区块链)技术,
居然获得了这么高的评价,这难道不是很神奇的一件事么?不管这件事会不会发
生,已经令人非常激动了,我们正在迎接一项变革并且可能参与其中,不是任何
时代的人都有这种机会,何其幸运!
不论你是否接受,未来终将改变。全球众多经济学家、企业家、国家政要都在推
崇区块链,声称区块链技术将重塑商业、货币和世界,将颠覆互联网、银行、证
券、保险、物流、电力、制造、会计税收、法律服务、文化创业、医药卫生等众
多行业。
虽然说到“区块链”,大家都会提到“去中心化”,也举了很多形象的例子。但
是我是一个较真的人,希望能够找到大家做出这种判断,背后的逻辑到底是什
么?就需要搞懂一切推断背后的本质,就需要了解区块链的核心技术逻辑。
阅读了一些书籍和资料之后,抛开“比特币”不说,要了解区块链,有两个核心
名词:共识机制、智能合约。
共识机制是区块链技术的核心,要搞清楚”共识机制“,就不得不提著名的“拜
占庭将军问题”,拜占庭将军问题由莱斯利·兰伯特提出的点对点通信中的基本
问题,主要是用于分析在分布式节点传输信息时如何保持数据的一致,即共识这
个问题。
拜占庭将军问题
一组拜占庭将军分别各率领一支军队共同围困一座城市。为了简化问题,将各支
军队的行动策略限定为进攻或撤离两种。
因为部分军队进攻部分军队撤离可能会造成灾难性后果,因此各位将军必须通过
投票来达成一致策略,即所有军队一起进攻或所有军队一起撤离。因为各位将军
分处城市不同方向,他们只能通过信使互相联系。
在投票过程中每位将军都将自己投票给进攻还是撤退的信息通过信使分别通知其
他所有将军,这样一来每位将军根据自己的投票和其他所有将军送来的信息就可
以知道共同的投票结果而决定行动策略。
系统的问题在于,将军中可能出现叛徒,他们不仅可能向较为糟糕的策略投票,
还可能选择性地发送投票信息。这样各支军队的一致协同就遭到了破坏。由于将
军之间需要通过信使通讯,叛变将军可能通过伪造信件来以其他将军的身份发送
假投票。而即使在保证所有将军忠诚的情况下,也不能排除信使被敌人截杀,甚
至被敌人间谍替换等情况。因此很难通过保证人员可靠性及通讯可靠性来解决问
题。
假始那些忠诚的将军仍然能通过多数决来决定他们的战略,便称达到了拜占庭容
错。
拜占庭将军问题被认为是容错性问题中最难的问题类型之一。在一个有n个节点的
系统中,每一个节点都有一个输入的值,其中一些节点具有故障,甚至是恶意
的。
在分布式计算中,不同的计算机通过通讯交换信息达成共识而按照同一套协作策
略行动。但有时候,系统中的成员计算机可能出错而发送错误的信息,用于传递
信息的通讯网络也可能导致信息损坏,使得网络中不同的成员关于全体协作的策
略得出不同结论,从而破坏系统一致性。
但是中本聪在设计比特币系统时应用的“工作量证明链”(PoW)模型很好的解决
了共识问题,至于什么是“PoW”,感兴趣的可以研究下。
智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在
上面执行这些承诺的协议。一个合约就是存在区块链里的程序。合约的参与双方
将达成的协议提前安装到区块链系统中。在双方的约定完成后,开始执行合约,
不能修改。至于合约执行所需要的“燃料”,也就是手续费,也需要提前支付。
智能合约可以解决日常生活中常见的违约问题,如果应用到各行业中,可以避免
违约的信用问题。
在区块链出现之前,商业领域的信任关系通常要依赖于正直、诚信的个人、中介
机构或其他组织才能建立起来。在区块链这个新兴的领域中,信任关系的建立是
基于网络,甚至是网络上的某个对象。由区块链驱动的智能合约将会要求双方遵
守他们的承诺。
在区块链体系中,共识机制和智能合约,保证了数据的真实性和合约执行力,实
现“去中心化”。当然还有很多技术层面的东西没有说到,感兴趣的可以深入了
解下。
虽然大部分人对于区块链的认知还停留在比特币、各种代币上,也就是对金融行
业的变革。但是了解区块链核心逻辑后,结合自己所在的行业“区块链 +”,区
块链的各行业的应用刚进前半场,相信都会想到很多好的创新方向。
or
usage:cleos create account [OPTIONS] creator name OwnerKey [ActiveKey]
or
Tips:
This command created a new token SYS with a precision of 4 decimals and a maximum supply of 10000000000000 SYS It also designates alice as the issuer To create this token, the contract requires the permission of the eosiotoken account For this reason, -p eosiotoken@active was passed to authorize this action
以上就是关于智能合约调用时间全部的内容,包括:智能合约调用时间、011:Ethash算法|《ETH原理与智能合约开发》笔记、如何查询智能合约的真实性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)