智能合约与逆波兰表达式
卜以寒
发表于 2022-12-26 03:22:28
70
0
0
为什么是中缀,而不是前缀、后缀、上缀、下缀?
1 }2 y( j4 @3 e6 z% i: L
中缀因为操作符都在中间位置,那能放到后面去么?当然可以了。
! C0 x% J% I3 F" T1 G3 s% l
这种把操作符置后的方式叫逆波兰表达式,即 RPN,更通俗的叫法是后缀表达式。
L8 [) w) ?% @$ I. f! s
中缀表达式怎么和后缀表达式对应呢?
/ t+ f+ ?' l( Z! _
后缀表达式有什么优点?3 K/ _0 `1 Q3 d, Z& }1 O
' i7 l- n+ t5 ~' X) m
相较于前缀表达式更易于转换,最左边一定为运算资源。
7 C6 Z" F, q: e- U# W+ @
不用括号,依靠运算顺序就能确定运算符的优先级,运算更简洁。
" H0 M( C4 J/ A! w
更符合计算机的计算方式。 计算机通过从左至右读取后缀表达式,就可以将遇到的运算对象压入栈,在遇到运算符时就弹出运算资源,完成计算,再将结果压入栈。最后留在栈中的就是计算结果。6 G; T: o* r) H
来点小例子,展示后缀表达式的神奇与方便。
9 c: I. H* d6 a, ^9 I% C
计算 1 2 +, 即为中缀表达式的 1+2。# r: L7 d5 j0 I" i8 u( Q% Z O
4 @% ]) J, {% J0 [2 v' i. s1 H
计算1 2 + 4 *,即为中缀表达式的 (1+2)*4,这里不需要括号哦。+ U3 d S. v I: X/ g* f9 X. s, D- ] C: Z
开始上正菜了,先从比较简单的比特币解锁脚本说起。
先看一笔交易,从地址 1K87TMWzsQLzdZb4kUmKAcrCWnQqdVW5QJ 转到
1B3C5xnvS9ijJRiCEMcrZsBS7FerCQwp9x 0.08269623个比特币,假设前一个地址的用户叫Neko,后一个地址的用户叫Sara。大家看它的输出脚本。
Niko给Sara的地址打钱就写这样的脚本:OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG。
; i* D: q$ d( z2 L# b
Sara怎么花出去呢?ta需要构造好这样的脚本 OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG。
9 y! `) M% g. ^4 Q* j7 s5 [
Sara构造好的脚本就是后缀表达式,怎么会呢?请看大B站视频。
8 e& b! U8 S* [1 p' Z
智能合约雏形-比特币脚本, ~7 y, }: W) W* G$ w3 E9 j% P; B
智能合约雏形-比特币脚本
! J- J8 K0 ^2 ?2 K' y# c
智能合约雏形-比特币脚本; I* m! m6 M6 u% @8 Q- P
最后的输出结果是True时,说明Sara有权限构建这个交易,新的交易将被发送到网络上,转账成功。
比特币的转账,不像银行一样,打入银行账户,而是一个个的输出脚本:: J( `" m) K5 p# m
" W* E& C4 ]) V" A# w0 `
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
6 ~0 H6 D) ?) p! c0 S3 M
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG. D$ F. ?0 D/ G+ w) U% j
( {. ~/ g. {# e8 Q! p% o5 i
OP_DUP OP_HASH160 [B] OP_EQUALVERIFY OP_CHECKSIG
& n2 Z$ n+ ? z) ~4 }- t$ l
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG/ s) W3 Z9 |5 x7 H# W9 s
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
4 s7 n( `( N/ A3 j! r$ O; f
# 1个地址可以有很多个输出脚本9 q# \. M6 {# y3 W
2 B# V/ S G1 S% T/ T
比特币的地址也不像银行一样有余额的概念,一个地址有多少余额,是看这个地址有多少个输出脚本,把每个输出脚本的余额汇总而成。
这就是UTXO模型,Unspent Transaction Output,未花费交易输出。* b$ D5 m3 s8 D5 g: d" N, E
转了这么大圈,回到以太坊智能合约上,以太坊的智能合约语言是Solidity,跟后缀表达式的画风差异很大。我们在使用remix.ethereum.org 把合约部署到区块链上时,部署的是Solidity代码编译后的结果,是object的内容,而object与opcodes是一一对应的。
. t1 l" p, W/ `
咱可以定义OP_DUP为0x76,OP_HASH160 为 0xa9,OP_EQUALVERIFY为0x88,OP_CHECKSIG 为 0xac,那 OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG ,就转为了 76 a9 88 ac。
而以太坊为了支持智能合约在比特币的基础上做了如下改进:4 [& i2 n# l0 u2 G. e
$ ~& c5 c5 N6 ]% ^6 |
支持图灵完备的后缀表达式(支持循环),可以做更多的事情,同时也释放出了恶魔。
通过Solidity与后缀表达式转换* A+ z* ?% J8 z. S- E/ R _" t
; }, S: b" y' x5 \! J0 W
还有最重要的一点,不在使用UTXO模型,而是使用Account模型,每次执行合约时,记录当前的数据状态。
- Z# R3 _8 Q0 h5 _9 |* B
比特币验证了区块链的可行性,以太坊引入了智能合约,强烈的冲击传统的经济观念。Bitcoin是伟大的创举,Ethereum是天才的设计,下一个引领风骚会是谁呢?/ m* D: y, Y* G: X1 ?
成为第一个吐槽的人