智能合约与逆波兰表达式
卜以寒
发表于 2022-12-26 03:22:28
142
0
0
为什么是中缀,而不是前缀、后缀、上缀、下缀?2 }1 C0 |4 c# Z0 N) Y
中缀因为操作符都在中间位置,那能放到后面去么?当然可以了。
( `4 C4 n1 y5 r4 [
这种把操作符置后的方式叫逆波兰表达式,即 RPN,更通俗的叫法是后缀表达式。
中缀表达式怎么和后缀表达式对应呢?
: v; ?& O) i3 R4 P
后缀表达式有什么优点?
相较于前缀表达式更易于转换,最左边一定为运算资源。+ i' e1 o& L! Z7 [6 _, r
不用括号,依靠运算顺序就能确定运算符的优先级,运算更简洁。0 N! t) @( m+ Y
更符合计算机的计算方式。 计算机通过从左至右读取后缀表达式,就可以将遇到的运算对象压入栈,在遇到运算符时就弹出运算资源,完成计算,再将结果压入栈。最后留在栈中的就是计算结果。$ E' L- P! T% @3 R, x! `$ j5 G
6 V, ]5 v6 E) Q' a2 o# J" |0 Y
来点小例子,展示后缀表达式的神奇与方便。
" U4 a( w/ F/ z% w
计算 1 2 +, 即为中缀表达式的 1+2。. R5 }+ g9 C n3 ^0 S: ^+ \
* N+ i, O1 {" {1 W8 Y9 h8 P0 P
计算1 2 + 4 *,即为中缀表达式的 (1+2)*4,这里不需要括号哦。
0 m$ A: z" J e q, ?6 \* k$ l
开始上正菜了,先从比较简单的比特币解锁脚本说起。+ u* ]6 M/ Q; R7 l1 X8 Q
7 ?3 d! l6 _8 q0 N) P. ]
先看一笔交易,从地址 1K87TMWzsQLzdZb4kUmKAcrCWnQqdVW5QJ 转到
1B3C5xnvS9ijJRiCEMcrZsBS7FerCQwp9x 0.08269623个比特币,假设前一个地址的用户叫Neko,后一个地址的用户叫Sara。大家看它的输出脚本。6 S' C$ Z: J; K# F
1 r& Z' V" w" G1 e
Niko给Sara的地址打钱就写这样的脚本:OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG。/ r! o. w! f5 w( D. b' E$ L" Q ?
Sara怎么花出去呢?ta需要构造好这样的脚本 OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG。
Sara构造好的脚本就是后缀表达式,怎么会呢?请看大B站视频。
智能合约雏形-比特币脚本$ y8 E. T9 _3 ~9 Z7 F% _
$ s/ L, t* j5 T8 x% Q4 H0 ?
智能合约雏形-比特币脚本
/ g8 a% o6 h6 h8 e: c+ V5 ]
智能合约雏形-比特币脚本( b/ Q$ K7 v" r7 o& {: |; Z- o. y
; o7 Y4 ^. R2 j+ \) e
最后的输出结果是True时,说明Sara有权限构建这个交易,新的交易将被发送到网络上,转账成功。. t( F2 s. ^1 I- s
3 u3 G( H$ Y2 o+ m; K8 ?
比特币的转账,不像银行一样,打入银行账户,而是一个个的输出脚本:
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
& |) {9 i5 [# T$ p H( h8 h
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
1 j) n, p4 i/ Q. l0 `$ K2 D6 Z
OP_DUP OP_HASH160 [B] OP_EQUALVERIFY OP_CHECKSIG
1 o& F6 i$ e$ _' n; e. R
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
`9 g4 F1 o! k' e [+ Q7 w0 B) t, H
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG( M+ \: o5 G) `3 C9 `
# 1个地址可以有很多个输出脚本
比特币的地址也不像银行一样有余额的概念,一个地址有多少余额,是看这个地址有多少个输出脚本,把每个输出脚本的余额汇总而成。8 K# Y7 w( o' d' m: B
9 b* M% f( \( Z, g7 G
这就是UTXO模型,Unspent Transaction Output,未花费交易输出。 s: K' m/ \. z. v* z
1 F X3 [3 G+ t0 r4 P8 x
转了这么大圈,回到以太坊智能合约上,以太坊的智能合约语言是Solidity,跟后缀表达式的画风差异很大。我们在使用remix.ethereum.org 把合约部署到区块链上时,部署的是Solidity代码编译后的结果,是object的内容,而object与opcodes是一一对应的。/ x9 J: E; U9 q3 v' J
, H9 T/ X) T' f
咱可以定义OP_DUP为0x76,OP_HASH160 为 0xa9,OP_EQUALVERIFY为0x88,OP_CHECKSIG 为 0xac,那 OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG ,就转为了 76 a9 88 ac。" q8 h- a; R7 `% B4 R: B4 ]/ w3 A
而以太坊为了支持智能合约在比特币的基础上做了如下改进:
支持图灵完备的后缀表达式(支持循环),可以做更多的事情,同时也释放出了恶魔。
通过Solidity与后缀表达式转换
: ^( L+ T; `( A
还有最重要的一点,不在使用UTXO模型,而是使用Account模型,每次执行合约时,记录当前的数据状态。
% N1 y8 z* r* ]
比特币验证了区块链的可行性,以太坊引入了智能合约,强烈的冲击传统的经济观念。Bitcoin是伟大的创举,Ethereum是天才的设计,下一个引领风骚会是谁呢?
成为第一个吐槽的人