智能合约与逆波兰表达式
卜以寒
发表于 2022-12-26 03:22:28
137
0
0
$ ^( w% o& G# y
为什么是中缀,而不是前缀、后缀、上缀、下缀?( d' T3 C: |8 F3 q, ?7 E
" v" H U1 J1 c% s
中缀因为操作符都在中间位置,那能放到后面去么?当然可以了。
0 C5 m7 j+ f% Y" _. k2 J* l
这种把操作符置后的方式叫逆波兰表达式,即 RPN,更通俗的叫法是后缀表达式。
中缀表达式怎么和后缀表达式对应呢?
后缀表达式有什么优点?) ~: {1 J2 Q9 x( w% o, L; k
相较于前缀表达式更易于转换,最左边一定为运算资源。- \. u% q- p) A- v* ?
g3 Y% H# E* f2 W8 O% k$ v% z
不用括号,依靠运算顺序就能确定运算符的优先级,运算更简洁。
更符合计算机的计算方式。 计算机通过从左至右读取后缀表达式,就可以将遇到的运算对象压入栈,在遇到运算符时就弹出运算资源,完成计算,再将结果压入栈。最后留在栈中的就是计算结果。/ T& W1 j+ l- f/ v
来点小例子,展示后缀表达式的神奇与方便。: ]$ O/ d3 o% K6 s+ e K$ N
. a( y% j! f# i0 C, I
计算 1 2 +, 即为中缀表达式的 1+2。& h' k0 n. u* K3 }. i, A
8 O/ n/ }9 ]4 @# L9 D% s6 f
计算1 2 + 4 *,即为中缀表达式的 (1+2)*4,这里不需要括号哦。
1 _7 z2 ]7 P' b# t1 O6 C
开始上正菜了,先从比较简单的比特币解锁脚本说起。 c, z8 G, {4 O7 f2 c- g" E" K
R7 J2 N! M% K; [) y7 W
先看一笔交易,从地址 1K87TMWzsQLzdZb4kUmKAcrCWnQqdVW5QJ 转到. J2 _! S K& m& { _9 @1 h
1B3C5xnvS9ijJRiCEMcrZsBS7FerCQwp9x 0.08269623个比特币,假设前一个地址的用户叫Neko,后一个地址的用户叫Sara。大家看它的输出脚本。7 [) i( C* A0 i7 E* s) U: t& J) ?
! Q# {6 [0 w6 p) s1 Y9 }# F F! y+ ~- G0 `
Niko给Sara的地址打钱就写这样的脚本:OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG。
Sara怎么花出去呢?ta需要构造好这样的脚本 OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG。" C) T& ^6 O/ V) }) s( ?, ]
5 y1 q- F* v/ c% R: ^
Sara构造好的脚本就是后缀表达式,怎么会呢?请看大B站视频。
智能合约雏形-比特币脚本, Z* p) G7 H- B- {3 u( ~( B' W
智能合约雏形-比特币脚本
智能合约雏形-比特币脚本
) n. b0 u7 q0 Q% J5 C4 n
最后的输出结果是True时,说明Sara有权限构建这个交易,新的交易将被发送到网络上,转账成功。
比特币的转账,不像银行一样,打入银行账户,而是一个个的输出脚本:+ n" ?0 K5 ], Q! V; y1 d3 A
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG" v* h' U& h2 g9 _2 Z
: k6 i; s+ c, A3 N3 K1 K
OP_DUP OP_HASH160 [B] OP_EQUALVERIFY OP_CHECKSIG
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG! y' q0 c c( p1 q; r, n
0 `% P; s: Y0 t0 D+ v+ H
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG3 P9 p0 {) x7 z5 i5 G5 I
# 1个地址可以有很多个输出脚本 ~0 Z( V- k; [' ^+ M
比特币的地址也不像银行一样有余额的概念,一个地址有多少余额,是看这个地址有多少个输出脚本,把每个输出脚本的余额汇总而成。5 s j3 o' V' Y+ ^2 N9 k
这就是UTXO模型,Unspent Transaction Output,未花费交易输出。
# s) G b8 D3 }2 F2 u3 C" s" U7 r
转了这么大圈,回到以太坊智能合约上,以太坊的智能合约语言是Solidity,跟后缀表达式的画风差异很大。我们在使用remix.ethereum.org 把合约部署到区块链上时,部署的是Solidity代码编译后的结果,是object的内容,而object与opcodes是一一对应的。
" A& D+ K8 D8 y7 O9 H( H7 j7 ?( m
咱可以定义OP_DUP为0x76,OP_HASH160 为 0xa9,OP_EQUALVERIFY为0x88,OP_CHECKSIG 为 0xac,那 OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG ,就转为了 76 a9 88 ac。. h% }2 b- l! q( ]( K9 _/ ~
9 p4 f5 K% P( X, g
而以太坊为了支持智能合约在比特币的基础上做了如下改进:' r4 T; B& W5 l% J0 ?) D
支持图灵完备的后缀表达式(支持循环),可以做更多的事情,同时也释放出了恶魔。
% M2 {9 F- }/ t6 o( }: z2 i
通过Solidity与后缀表达式转换# ?5 r% I1 P5 W3 q
还有最重要的一点,不在使用UTXO模型,而是使用Account模型,每次执行合约时,记录当前的数据状态。
比特币验证了区块链的可行性,以太坊引入了智能合约,强烈的冲击传统的经济观念。Bitcoin是伟大的创举,Ethereum是天才的设计,下一个引领风骚会是谁呢?6 m8 S3 V( J1 W. E4 N0 C
成为第一个吐槽的人