主页 > imtoken官网版 > 谈谈我对比特币脚本的理解
谈谈我对比特币脚本的理解
锁定脚本和解锁脚本
比特币脚本存在的意义在于让每一笔交易合法化。 这种合法化不是人工审查的,而是通过脚本自动验证的。
脚本分为锁定脚本和解锁脚本。 锁定脚本和UTXO对应,一个UTXO包含一个锁定脚本。
当要用到这个UTXO的时候,比如alice在给bob转账的时候需要引用这个UTXO,从而产生一笔交易。 只有当交易被验证时,它才能在比特币网络中传播(传播后可以由矿工添加到区块链中,这部分不再详细描述。)
验证需要的是解锁脚本。
从上面的流程可以看出,锁定脚本是关联UTXO的,而解锁脚本是关联某笔交易的。
锁定脚本称为scriptPubKey,解锁脚本称为ScriptSig。
脚本以什么形式存在? 其实就是一堆命令加参数。
图片
上图中dup、hash160等为命令,sig、pubk为参数。
脚本语言执行原理
脚本执行流程基于堆栈模型。 这和我大学数据结构课上讲的表达式求值的实现逻辑很像。
输入形式:表达式,如2*(3+4)
输出格式:运算结果
其中2、3、4相当于脚本中的参数比特币的理解,而*、+号是脚本的命令。
实现逻辑是基于栈结构的,先入栈,再出栈,决定如何操作。
比特币脚本也实现了类似的逻辑,而且更简单(没有优先级)。
图片
上图是一个非常简单的脚本,就是判断2加3是否等于5。下面将详细介绍一个实际的比特币交易脚本的执行过程。
数字签名和验证
Bitcoin Script 的认证机制使用了数字签名的概念。 这部分知识是一个单独的部分,基于非对称密钥算法,不特定于比特币脚本。 这部分如果要详细解释,会占用很多篇幅,这里不再赘述。 不懂的请自行参考。
比特币地址是如何产生的
在继续之前,您需要了解公钥和比特币地址之间的关系:
以公钥K为输入,计算其SHA256哈希值,并根据此结果计算RIPEMD160哈希值
十六进制得到一个长度为 160 位(20 字节)的数字:
A = RIPEMD160(SHA256(K))
式中,K为公钥,A为生成的比特币地址。
比特币交易示例
假设alice要付给bob 0.015个比特币,alice会使用一个UTXO(假设是单一输入,单一输出)比特币的理解,这个UTXO有一个锁定脚本来为交易设置一个“障碍”。
锁定脚本如下:
OP_DUP OP_HASH160 be10f0a78f5ac63e8746f7f2e62a5663eed05788 OP_EQUALVERIFY OP_CHECKSIG
bob如果想收到这个比特币(换种说法是bob可以参考输出),他必须给一个解锁脚本,然后解锁脚本和锁定脚本的组合结果为真来确认交易有效。
解锁脚本如下:
3046022100ba1427639c9f67f2ca1088d0140318a98cb1e84f604dc90ae00ed7a5f9c61cab02210094233d018f2f014a5864c9e0795f13735780cafd51b950f503534a6af246aca301
03a63ab88e75116b313c6de384496328df2656156b8ac48c75505cd20a4890f5ab
它看起来像是一串数字,但实际上是“签名”和“公钥”(sig & pubkey)的组合。 签名是用bob的私钥加密交易信息的结果,公钥是指bob的公钥。
因为只有 bob 知道私钥,所以只有他才能想出正确的签名。
下面是脚本执行的过程:
图片
图片
一个几十字节的简单脚本就完成了对交易的验证,确保转账的合法性。
比特币脚本的变体
上面介绍的例子都是基于比特币最基本的P2PKH交易类型。 现在比特币核心已经升级了很多版本,脚本的验证机制也发生了很大的变化。 比如现在广泛使用的多重签名脚本。 尽管这些变体脚本变得越来越复杂,但基本思想都是基于以上原则。
参考
[1] Andreas M. Antonopoulos
[2]