Nervos Fans

比特币脚本指南(二)

2018-07-06  本文已影响2人  526ba0512193

比特币脚本交易:幕后故事

交易代码长这样:

好比Alice想给Bob发0.0015 BTC。

根据上面若干交易条件: 交易输入0.0015770 BTC。

交易细节用代码表示的话,是这样的:

Image courtesy: djp3 youtube channel.  

第一行代码是交易名称,也就是输入、输出金额的哈希值。

Vin_sz 代表输入数据的数量,Alice只动用了之前的一笔交易,因此为1。

Vin_sz为2,因为只有一笔输出给Bob和一笔找零给Alice。

以下为输入数据:

上面说了,Alice只动用了之前的一笔交易(好比说是TX(0)),因此vin_sz 为 1

输入数据下方是Alice的签名数据。

最下边的是输出数据:

前半部分数据表示Bob收到0.0015 BTC。

后半部分表示0.00005120 BTC是给Alice的找零。

做个计算题:

上面说过Alice的输入数据是0.0015770 BTC, Bob收到0.0015 BTC,0.00005120 BTC给Alice找零。

0.0015770 > 0.00155120(0.0015 + 0.00005120)

这里的差额就是给矿工的交易费了。

仔细看看交易输出

如上所述,交易中的每个输入都会成为输出。输出又包含花出去跟没花出去的,没出去的就成了找零。 因此,找零也叫UTXO,交易未花费输出(Unspent Transaction Output)的简写,意思是:没关系,这次没花出去,可以留着以后花。

每个交易输出包括两部分:

• 该输出的值。

• 一个加密谜题,有几种叫法:锁定脚本、见证脚本或者脚本公钥。 接收方想要花掉这个输出(也就是转账方转过来的这笔钱),需要解开这个谜题。谜题的编码语言,正是比特币脚本。

下面,我们检查下交易的输出,认一认各个输出的各个部分。代码部分摘自《精通比特币》。

“vout": [

{

"value": 0.01500000,

"scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"

},

{

"value": 0.08450000,

"scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",

}

]

代码中有两个输出。

一个输出的值是0.015 BTC,另一个是0.0845 BTC。 解锁0.015BTC对应的锁定脚本是这个:

“scriptPubKey”: “OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG”

仔细看看交易输入

为了凑输入,用户钱包要过一遍里边的UTXOs, 然后选出满足交易条件的UTXOs。

好比,Alice想转0.15 BTC给Bob,UTXO集长这样:

• UTXO A = 0.09 BTC

• UTXO B = 0.2 BTC

• UTXO C = 0.005 BTC

选A、B。 剩下的找零,会变成下次交易UTXO集中的一员。

现在看一下输入的代码。

“vin": [

{

"txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",

"vout": 0,

"scriptSig" : "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",

"sequence": 4294967295

}

]

输入脚本包括:

• txid:交易ID,指该UTXO来自哪一笔先前的交易。

• vout:指使用的先前交易的输出。 假设先前交易有两个UTXO,第一个UTXO被标记为0, 第二个UTXO被标记为1。 代码中用的正是第一个UTXO。

• scriptSig:之前提到,每个UTXO都包含一个锁定脚本。 scriptSig中包含解锁脚本所需的数据。

• 序列:包含序列是为了帮助人们在交易确认并打包前更新交易数据。了解即可。

交易序列化

交易在网络传播的过程中,是序列化的。

序列化过程中,数据结构内部表征被转换为可以一次传输一个字节的格式,也叫字节流。

前两节中,交易的例子很简单,一个输入一个输出。若将交易序列化并以十六进制格式存储,是什么样子?

0100000001186f9f998a5aa6f048e51dd8419a14d8a0f1a8a2836dd73

4d2804fe65fa35779000000008b483045022100884d142d86652a3f47

ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039

ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813

01410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade84

16ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc1

7b4a10fa336a8d752adfffffffff0260e31600000000001976a914ab6

8025513c3dbd2f7b92a94e0581f5d50f654e788acd0ef800000000000

1976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac 00000000

是的,就长这样,真不是用脚打出来的。

但是不要害怕。 这个十六进制流中,藏着输入和输出数据。

输出序列化

交易输出部分的序列化包括:

图片来自精通比特币

我们知道哪些输出数据?

两个输出值

一个输出值是0.015 BTC,或者150万聪

十六进制中,1500000是16 e3 60。用little-endian编码时,是60 e3 16

脚本公钥长度为25字节,十六进制中是19

那么,来找找十六进制流中的输出数据:

0100000001186f9f998a5aa6f048e51dd8419a14d8a0f1a8a2836dd73

4d2804fe65fa35779000000008b483045022100884d142d86652a3f47

ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039

ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813 01410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade84

16ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc1

7b4a10fa336a8d752adfffffffff0260e31600000000001976a914ab68025513c3dbd2f7b92a94e0581f5d50f654e788acd0ef8000000000001976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac 00000000

输入序列化

输入的序列化包括:

能不能找到Alice交易的输出?

0100000001186f9f998a5aa6f048e51dd8419a14d8a0f1a8a2836dd734d2804fe65fa35779000000008b483045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039 ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e381301410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adfffffffff0260e31600000000001976a914ab6

8025513c3dbd2f7b92a94e0581f5d50f654e788acd0ef800000000000

1976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac 00000000

已知UTXO只有在解锁后才能使用。已知输入值中scriptSig可以帮助解锁。具体什么操作流程呢?

记住这个问题。

未完待续

上一篇 下一篇

猜你喜欢

热点阅读