1703869061
1703869062
注:区块包含指向前面一个区块的指针和指向最近的满足哈希值<目标/4的指针。这个原理可以重复运用,比如一个第三层级的指针指向满足哈希值<目标值/16[2]
1703869063
1703869064
这就意味着如果找到某种方法可以知道哪些区块满足哈希值<目标值/4,仅验证这些区块(或者区块的头部)就可以使用1/4的工作量完成全部任务。如何找到哪些区块满足哈希值<目标值/4呢?其实答案在区块本身。图10.7显示,每个区块包含指向前面一个区块的指针,以及指向最近的满足哈希值<目标/4的指针。
1703869065
1703869066
可以压低目标值到多小?是否可以选择很大的数,让目标值变得非常小?答案是否定的。这种方式的原理就像矿池,却是反方向的操作。在矿池里,矿池管理员验证大家的份额,也就是验证这些难度系数低(比较高的目标值)的区块。矿工找到比区块更多的份额,所以矿池管理员必须多做一道验证程序的工作。这样做的好处就是,能够比较精准地估计矿工的哈希算力——估计值的方差较小。
1703869067
1703869068
我们来看相反的交易。随着估算建造整个区块链的工作的减少,估算值就有很大的方差。例如,假设N=4,在没有使用跳表的方案下,会检测到有4个区块满足哈希值<目标值。如果一个恶意的竞争对手要欺骗我们,他需要花4倍于我们找到一个区块的平均工作量才能办到。
1703869069
1703869070
假设这个竞争对手只做了一半的工作。可以算出,竞争对手有14%的机会能找到4个区块满足哈希值<目标值。相反,在跳表方案下用4作为倍数,竞争对手的任务变成需要找到一个区块,满足哈希值<目标值/4。在这种情况下,懒惰的只做了一半工作的竞争对手,却有40%的机会骗过我们,而不仅仅是14%。
1703869071
1703869072
[1]跳表是一种随机化的数据结构,目前开源软件Redis和LevelDB都有用到它。——译者注
1703869073
1703869074
[2]16是2的1+3次方。——译者注,以此类推。
1703869075
1703869076
1703869077
1703869078
1703869080
区块链技术驱动金融:数字货币与智能合约技术 10.7 以太坊和智能合约
1703869081
1703869082
我们已经介绍了几种用比特币的脚本语言写出有趣的应用的方法,如有托管功能的支付交易。我们也看到比特币脚本语言的一些瓶颈:只有很少的指令,并不符合图灵计算的标准。因此,很多新的另类币增添与应用程序相关的特殊功能。域名币是第一个尝试,后来又有许多加密货币,类似于比特币但是支持赌博、股票发行、市场预测等。
1703869083
1703869084
设想我们不需要为了每个应用程序,每次都建设一套新的系统,而是创造出一个加密货币系统,以支持所有未来可以想象到的任何应用。这就是所谓的图灵完备——据我们理解,满足图灵完备标准的编程语言,可以让你写出图灵机可以完成的任意功能,它可计算的函数和图灵机可计算的函数是完全相同的。因此,每一图灵完备的编程语言——包括我们熟悉的Java、Python和Lisp——都是图灵等价的。如果不考虑实际中的简单性和表现,图灵完备是我们在编程语言有关表达能力上需要的最好的性质。
1703869085
1703869086
从某种程度上讲,今天加密货币的发展使人回想起20世纪40年代早期计算机发展的时代:在第二次世界大战时,建造大量的复杂的只有某种特定功能的计算器(比如用于暴力破解密码的机器和海军用于确定发射弹道轨道的机器),这些工作促使研究专家致力于建造第一个可重复编程的通用计算机。任何可预见的应用程序都可以使用该计算机(见图10.8)。
1703869087
1703869088
1703869089
1703869090
1703869091
图10.8 在布莱切利园(Bletchley Park)博物馆重建的炸弹机(Bombe)
1703869092
1703869093
注:炸弹机是一个由阿兰·图灵(Alan Turing)设计的特殊功能的高级计算机,用于破解德国的英格玛(Enigma)密码。通用计算机取代类似炸弹机的精巧装备,以太币能否也能像这样取代特殊功能的另类币呢?
1703869094
1703869095
以太币(Ethereum)是一种雄心勃勃的另类币,致力于提供一种满足图灵计算要求的可编程语言,用这种语言可以编写脚本或者合约。虽然有其他方案可以做到这一点,但是以太坊无疑是最引人注目的:它使用了几个创新的技术,成功地完成了众筹,在几个月内筹资两千万美元,并且采用激进的参数,比如使用较短的产生区块的时间参数。以太坊系统本身很复杂,需要再编写一本新的教材才能完整阐述,本节只做简要讨论。
1703869096
1703869097
智能合约编程模式
1703869098
1703869099
智能合约最初是用来指使用计算机系统(或者其他自动化方式)来执行合约。例如,你可以把自动售货机看成一个销售商品的智能合约,执行的就是你和机器主人之间关于如何购买一个糖果的合约。
1703869100
1703869101
在以太坊体系,一个合约就是一个存在区块链里的程序。任何人支付一点费用,就可以用特定的操作将他的程序上传,建立一个以太坊合约。这个合约是用字节码(bytecode)写的,可以被特殊的以太坊专用虚拟机(Ethereum-specific Virtual Machine,简称EVM)执行。一旦合约上传,便永远存在在区块链里。智能合约有它自己的资金账户,其他用户可以调用程序里面开放的应用程序编程接口(API),合约可以收发款项。
1703869102
1703869103
一个简单的例子:以太坊中的域名币
1703869104
1703869105
我们说以太坊可以用来执行任何特定应用的另类币功能。举个简单的例子,我们可以展示使用一个简单的以太坊合约,来构建出域名币形式的功能。
1703869106
1703869107
图10.9 所示就是一个构建的案例。它是以“稳健”语言(Solidity)编写,“稳健”是以太坊里用于定义合约的高级编程语言。这个合约产生一个原始的域名/数值(name/value)储存配对或者注册名。名字永远连着数字。这个合约定义了一个数字变量——注册表(registryTable), 里面有32比特长字节和公开密钥的配对关系。初始时期,每个字节都对应着空地址0×0000000…000。这个合约同时定义了单一入口点,叫“用户名称”(claimName)。这个入口点只接受名字参数。首先,这个合约确认调用这个合约的人已经支付了至少10个wei。wei是在以太坊里最小的货币单位。如果没有支付10wei, 合约自动终止并发出错误信号(“throw”的编程命令就做这些)。如果足够的wei已经发出而且这个名字还没有被注册,那么这个名字就和调用的地址永久地联系在一起。
1703869108
1703869109
1703869110
[
上一页 ]
[ :1.703869061e+09 ]
[
下一页 ]