分享 · 2018-12-04 0

以太坊智能合约与逆波兰表达式

beepress10-1563189379
beepress2-1563189379
beepress1-1563189381
beepress1-1563189381
beepress6-1563189382
beepress9-1563189383
beepress5-1563189384
beepress5-1563189385

想必大家对 1+1,3-4,5*6, 8/4,(1+6)*9,1+6*7,这些简单的数学四则运算都不陌生,有时候遇到买菜大姐, 这些菜称称,一共多少钱啊? 8块,给10块,哎这还有3块,找个儿整。人民群众喜闻乐见,耳熟能详的四则运算,有个高级的称呼中缀表达式。

 

以太坊智能合约与逆波兰表达式


为什么是中缀,而不是前缀、后缀、上缀、下缀?

中缀因为操作符都在中间位置,那能放到后面去么?当然可以了。


以太坊智能合约与逆波兰表达式


这种把操作符置后的方式叫逆波兰表达式,即 RPN,更通俗的叫法是后缀表达式。


中缀表达式怎么和后缀表达式对应呢?


以太坊智能合约与逆波兰表达式


后缀表达式有什么优点?

  • 相较于前缀表达式更易于转换,最左边一定为运算资源。

  • 不用括号,依靠运算顺序就能确定运算符的优先级,运算更简洁。

  • 更符合计算机的计算方式。计算机通过从左至右读取后缀表达式,就可以将遇到的运算对象压入栈,在遇到运算符时就弹出运算资源,完成计算,再将结果压入栈。最后留在栈中的就是计算结果。


来点小例子,展示后缀表达式的方便与神奇。


计算 1 2 +

以太坊智能合约与逆波兰表达式


计算 1 2 + 4 *,即为中缀表达式的 (1+2)*4,这里不需要括号哦。


以太坊智能合约与逆波兰表达式


开始上正菜了,先从比较简单的比特币解锁脚本说起。


先看一笔交易,从地址 1K87TMWzsQLzdZb4kUmKAcrCWnQqdVW5QJ 转到

1K87TMWzsQLzdZb4kUmKAcrCWnQqdVW5QJ 14.47个比特币,假设前一个地址的用户叫Neko,后一个地址的用户叫Sara。大家看它的输出脚本。


以太坊智能合约与逆波兰表达式


Niko给Sara的地址打钱就写这样的脚本: OP_DUP OP_HASH160 <Sara公钥的HASH160值> OP_EQUALVERIFY OP_CHECKSIG


Sara怎么花出去呢?ta需要构造好这样的脚本:<Sara签名> <Sara私钥> OP_DUP OP_HASH160 <Sara公钥的HASH160值> OP_EQUALVERIFY OP_CHECKSIG


Sara构造好的脚本就是后缀表达式,怎么会呢?看下面的视频。



最后的输出结果是True时,说明Sara有权限构建这个交易,新的交易将被发送到网络上,转账成功。


比特币的转账,不像银行一样,打入银行账户,而是一个个的输出脚本

OP_DUP OP_HASH160 <Sara公钥的HASH160值> OP_EQUALVERIFY OP_CHECKSIG


OP_DUP OP_HASH160 <Niko公钥的HASH160值> OP_EQUALVERIFY OP_CHECKSIG


OP_DUP OP_HASH160 <Bob公钥的HASH160值> OP_EQUALVERIFY OP_CHECKSIG


OP_DUP OP_HASH160 <Alice公钥的HASH160值> OP_EQUALVERIFY OP_CHECKSIG


OP_DUP OP_HASH160 <Sara公钥的HASH160值> OP_EQUALVERIFY OP_CHECKSIG (1个地址可以有很多个输出脚本)


比特币的地址也不像银行一样有余额的概念,一个地址有多少余额,是看这个地址有多少个输出脚本,把每个输出脚本的余额汇总而成。这就是UTXO模型,Unspent Transaction Output,未花费交易输出


转了这么大圈,回到以太坊智能合约上,以太坊的智能合约语言是Solidity,跟后缀表达式的画风差异很大。
我们在使用 remix.ethereum.org 把合约部署到区块链上时,部署的是Solidity代码编译后的结果,是object的内容,而object与opcodes是一一对应的。


以太坊智能合约与逆波兰表达式


咱可以定义 OP_DUP 为 0x76,OP_HASH160 为 0xa9,OP_EQUALVERIFY 为0x88,OP_CHECKSIG 为 0xac,那 OP_DUP OP_HASH160 <Sara公钥的HASH160值> OP_EQUALVERIFY OP_CHECKSIG ,就转为了

76 a9 <Sara公钥的HASH160值> 88 ac。


而以太坊为了支持智能合约在比特币的基础上做了如下改进:

  • 支持图灵完备的后缀表达式(支持循环),可以做更多的事情,同时也释放出了恶魔。

  • 通过Solidity与后缀表达式转换

  • 还有最重要的一点,不在使用UTXO模型,而是使用Account模型,每次执行合约时,记录当前的数据状态。


比特币验证了区块链的可行性,以太坊引入了智能合约,强烈的冲击传统的经济观念。Bitcoin是伟大的创举,Ethereum是天才的设计,下一个引领风骚会是谁呢?

原文始发于微信公众号(Rebase社区):以太坊智能合约与逆波兰表达式