美文网首页
比特币买汉堡之4--交易数据

比特币买汉堡之4--交易数据

作者: 梁波林 | 来源:发表于2016-05-23 16:47 被阅读286次

    Bitcoin=比特币网络或概念,bitcoin=比特币单位

    在小明用比特币买汉堡的交易数据是什么样子的,怎么记录到比特币网络中去呢?

    1.首先要理解比特币交易的概念

    交易数据是Bitcoin中所有应用数据的容器/载体

    Bitcoin的所有数据=(矿工产生的)区块头+(应用产生的)交易数据记录

    区块链中的数据

    用会计角度来理解,一个比特币交易相当于记录了一个会计账套,符合复式记账的原理:有借必有贷,借贷必相符。而且可以是多借多贷。(会计)借=(Bitcoin)input,(会计)贷=(Bitcoin)output。

    记账的主体,贷方是账号,而借方可理解为一个指针,指向一个且仅一个来源交易的哪一个贷方。

    “来源交易”必是一笔已被区块链确认的交易,哪一个贷方指的是多贷中的第几贷。

    事实上,在区块链的交易中不直接记录借方账号,要得到借方账号,就要查来源交易的贷方信息。

    只有发行bitcoin的矿工奖励交易(每区块的第一笔交易)没有来源,没有借方,只有贷方。

    一笔交易的一个贷方只能被指定一次(消费一次),即当一笔交易中的一个贷方被其它某一个确认的交易的借方指定后,即视为已使用/消费,以防止重复支付。

    账户余额=SUM(所有未被消的交易中的地址为本账号的贷方金额)

    借方不能指定本交易中的贷方作为来源,必须是已确认的交易中的贷方。

    Bitcoin交易关系图

    TX0--借源账户:100k,贷账户1:40k,贷账户2:50k(,贷源账户:10k)

    TX1--借账户1:40k, 贷账户3:30k(,贷账户1:10k)

    TX2--借账户2:50k,贷账户4:20k,贷账户5:20k(,贷账户2:10k)

    图中其实少画了一个找零的output--由于源交易的一个贷方必须被一次性全部使用,超出消费额度的金额将在新交易中用一个贷方返还给源账户。如果忘记加找零的output,超出部分将全部作为交易费给挖到该区块的矿工(一般交易费只需0.0001BTC)。即:

    SUM(借方金额)-SUM(贷方金额)=交易费

    小明买汉堡包的过程中发生的4笔Bitcoin交易如下图所示:

    小明买汉堡包过程的交易

    2.接下来看看交易的数据的内容

    交易数据是一串字节流,数据结构的解析见《官网参考手册》或可以参见这里

    交易数据中几个关键数据:

    1. 交易ID(TXID,字段名:txid)

    用于唯一标识Bitcoin中的一笔交易,同时也作为防篡改的校验码,因为它就是通过对整个数据包(hex)进行散列的结果,也称TxHash。

    TXID=Tx Hash = SHA256(SHA256(hex))

    2. 签名脚本(signature script,字段名:scriptSig)

    每一个INPUT(上面所言的借方)都要提供一个对应的签名脚本,用以验证是否可以花费来源交易的指定输出。

    这有点类似于在银行取款时输入密码验证和签字确认的过程,但要复杂许多,支持的支付方式也灵活许多(类似简单的智能合约)。

    一方面,要验证你是指定输出的合法支配者(提供解锁指定输出的锁的参数)

    一方面,确认花费指定输出是你的意愿,并锁定输入,防篡改(包含输入数据的校验)

    例如:针对P2PKH的输出,签名脚本需要包含的数据有:

    1.完整的公钥数据;2.利用secp256k1算法,依据私钥和交易数据生成的签名数据。

    一个例子(json格式):

    "scriptSig" : {

    "asm" : "3046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d401 03cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4",

    "hex" : "493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4"

    }

    根据交易类型,交易的所有输入输出都可以要求签名确认,签名确认的过程有三种方式:

    SIGHASH_ALL(缺省),立即对所有输入输出都确认,立即发起交易

    SIGHASH_NONE,仅对所有输入进行了确认,形成的交易数据包交给后续处理人填入或变更输出地址,再发起交易。

    SIGHASH_SINGLE,仅对本人相关的部分输入输出进行了确认,其它交给相关的人员填写完毕后再发起交易

    3. 公钥脚本(Pubkey scripts,字段名:scriptPubKey)

    给交易的输出上锁。提供一个脚本,结合消费方提供的签明脚本进行计算匹配,匹配通过则为解锁成功。

    实际上是为了限定输出的使用条件,如最常见的是:只要是指定私钥的持有者就可以消费。

    还可以是更复杂的,如:

    A可以约定必须由收款人B和担保人C同时签名才能支配某笔比特币(担保交易)

    也可以约定B、C、D中任意两人签名就能支配(联名账户)

    A可以约定B必须在一年后才能动用某笔比特币(延时支付)

    也可以约定任何人都能支配(撒钱)

    或者都不能支配(烧钱)。

    还有:担保交易、连带合同、第三方仲裁、多方签名等多种交易类型。

    可以参考这里

    下面是一个例子(已解析为json格式):

    "scriptPubKey" : {

    "asm" : "OP_DUP OP_HASH160 7514080ab2fcac0764de3a77d10cb790c71c74c2 OP_EQUALVERIFY OP_CHECKSIG",

    "hex" : "76a9147514080ab2fcac0764de3a77d10cb790c71c74c288ac",

    "reqSigs" : 1,

    "type" : "pubkeyhash",

    "addresses" : [

    "1Bg44FZsoTeYteRykC1XHz8facWYKhGvQ8"

    ]

    }

    3. 发起交易

    发起交易很简单,就是把构造好的交易数据(字节流格式),通过Bitcoin应用(如Bitcoin qt等)向Bitcoin进行广播。

    所有收到交易广播的节点(矿工),经过验证合法后,收录在本地将要进行挖矿的新区块中。

    如果一个矿工挖矿成功,那么这个区块就会被Bitcoin确认,区块里的交易就生效了。

    而其它挖矿失败的节点,则放弃区块,新建一个区块将未被确认的交易收录,重新进行挖矿。

    相关文章

      网友评论

          本文标题:比特币买汉堡之4--交易数据

          本文链接:https://www.haomeiwen.com/subject/ppfnrttx.html