当我们在Bitcoin 上生一个transaction 时,会拿到一个raw transaction,长长一串的不知道代表什么意思,我们拿去呼叫decoderawtransaction RPC 才会看到他的样貌,在拿的到utxo 的情况下实作本地端创建raw transaction 时,常常会出现问题,而学会看懂transaction 的结构可以有效地帮忙debug,所以也就顺便做个笔记以免以后忘记了。
而Gcoin是一个从Bitcoin衍生出来的区块链技术,如果不了解Gcoin的基本架构,想要了解更多的可以去看看这里。Gcoin在transaction的结构上其实和Bitcoin长的很类似,唯独Gcoin transaction会多两个原本Bitcoin transaction没有的栏位
- type:在Gcoin,transaction有分为七种型态,分别是NORMAL LICENSE MINT VOTE BANVOTE MATCH CANCEL,前面三个为比较常见的型态。
- color: 因为Gcoin 有多货币功能,可以允许issuer 发行自己的货币,不像Bitcoin 只有一种货币在流通,所以在做交易的时候也需要写清楚是用哪一个货币来做流通。
以下为一个raw transaction,从1FPWFMPvYNTBx3fJYVmbFyhKtfi4QPQ6MY送了100个color 1到17Ca1G5PFHBNd6sARgtYQKRK7PnCsM4uSn
01000000018eff490c3dac592caf4954ad1e142e6e8d8fbb427909bb18d7271e7d66dcf9d4000000001976a9149dd353a079ad3b149e00dcc9f6a62f399d3d1c8f88acffffffff0200e40b54020000001976a9144400e18b93766b106220343dbd37d4135501d6da88ac01000000003bbf15f08623001976a9149dd353a079ad3b149e00dcc9f6a62f399d3d1c8f88ac010000000000000000000000
让我们来了解一下这一串乱码在干什么,它是由以下所组成的
- 4 个bytes 的version,这边表明这个transaction 是遵照哪一个规则,但其实就是 1
- 1 个byte 为transaction input 的数量
- 32 个bytes 的transaction hash,代表着我们准备要花掉的那笔transaction output
- 4个bytes为上一个transaction的第几个output,3和4整合起来的意思就是我们现在要准备去花掉transaction hash为8eff490c3dac592caf4954ad1e142e6e8d8fbb427909bb18d7271e7d66dcf9d4的第0个output
- 1 byte 为unlocking script 的长度,0x19 换算成十进位是25 (bytes)
- 25 bytes 的unlocking script,它的意义在于要满足准备花掉的output 的条件,而这条件就是那个output 的locking script,而现在你会发现他长得跟自己output 的locking script 很像或一样,但这只是暂时的,等到这个transaction 经过签名之后,这个栏位的值就会被改成真正可以满足前一个output 的locking script
- 4 bytes 的sequence,通常就设为0xffffffff
- 1 byte 为transaction output 的数量
- 8 bytes 为第一个output 交易的金额
- 1 byte 为locking script 的长度,0x19 换算成十进位是25 (bytes)
- 25 bytes 的locking script,它的用处顾名思义就是定义这个output 要被花掉的条件,如果有人要用掉这个output,他就必须要有相对应的unlocking script 来解锁
- 4 bytes 为第一个output 交易的color,代表我们这个output 是在交易color 1,而这个是在Bitcoin 上没有的
- 8 bytes 为第二个output 交易的金额
- 1 byte 为locking script 的长度,0x19 换算成十进位是25 (bytes)
- 25 bytes 为locking script,他的用处跟第11 点一样
- 4 bytes 为第二个output 交易的color,代表我们这个output 也是在交易color 1,这个Bitcoin 上没有
- 4 bytes 的locktime,这个数字是表示这个transaction 最早可以多早进到blockchain,如果是0 的话代表希望立刻执行不想要有拖延,如果是介于0 到5 亿,这个值就代表着区块高度,区块链没有长到这个区块高度就不要把这个transaction 收进去,最后如果是大于5 亿的值就代表是一个Unix Epoch timestamp,没到这个时间就不要把这个transaction 收进去
- 最后4 bytes 为type,在这边是0,即NORMAL transaction type,这是Bitcoin 上没有的
可以发现,除了第12, 16 和18 点之外,其实Gcoin transaction 和Bitcoin transaction 是长一样的,另外在input 的unlocking script 跟output 的locking script 会另外做介绍。而以下是这个范例完整的拆解
01000000 // version 01 // vin number /* vin */ 8eff490c3dac592caf4954ad1e142e6e8d8fbb427909bb18d7271e7d66dcf9d4 // transaction hash 00000000 // index 19 // length of unlocking script 76a9149dd353a079ad3b149e00dcc9f6a62f399d3d1c8f88ac // unlocking script ffffffff // sequence /* vin end */ 02 // vout number /* vout */ 00e40b5402000000 // amount 19 // length of locking script 76a9144400e18b93766b106220343dbd37d4135501d6da88ac // locking script 01000000 // color 003bbf15f0862300 // amount 19 // length of locking script 76a9149dd353a079ad3b149e00dcc9f6a62f399d3d1c8f88ac // locking script 01000000 // color /* vout end */ 00000000 // locktime 00000000 // transaction type
比较需要注意的是,不管是Bitcoin 还是Gcoin 在transaction 里面的表达方式为little endian,以第一个output 交易的金额为例,00e40b5402000000 转成数字之后就是10000000000,而version color 等其他栏位的表达方式也是要透过这样的转换,如果直接把十六进位转成十进位会发现出来的数字是很奇怪的。
另外刚刚转出来的数字10000000000 单位为satoshi,虽然在Gcoin 里没有BTC 这个货币了(当然你也可以创一个license 叫做BTC),但Gcoin 还是沿用了satoshi 的概念来代表货币最小的单位,所以上面的例子我们可以说是10000000000 satoshi color 1 或100 个color 1。
以上就是Gcoin transaction 的拆解。
原文地址:点我