当我们在Bitcoin 上生一个transaction 时,会拿到一个raw transaction,长长一串的不知道代表什么意思,我们拿去呼叫decoderawtransaction RPC 才会看到他的样貌,在拿的到utxo 的情况下实作本地端创建raw transaction 时,常常会出现问题,而学会看懂transaction 的结构可以有效地帮忙debug,所以也就顺便做个笔记以免以后忘记了。

而Gcoin是一个从Bitcoin衍生出来的区块链技术,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 会另外做介绍。而以下是这个范例完整的拆解

比较需要注意的是,不管是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 的拆解。