主页 > token.im钱包下载 > 用比特币买汉堡第四部分——交易数据
用比特币买汉堡第四部分——交易数据
Bitcoin=比特币网络或概念,bitcoin=比特币单位
小明买汉堡的交易数据是什么样子的,又是如何记录在比特币网络中的?
1.先了解比特币交易的概念
交易数据是比特币所有应用数据的容器/载体
所有比特币数据=(矿工产生)区块头+(应用产生)交易数据记录
区块链中的数据
从记账的角度来看,一笔比特币交易相当于记录了一个记账集,符合复式记账原则:有借必有贷用比特币买汉堡,借贷相符。 你可以借更多,借更多。 (会计)借方=(比特币)输入,(会计)贷方=(比特币)输出。
记账的主体,贷方是账号,借方可以理解为指向一笔且唯一一笔来源交易的贷方。
“源交易”必须是经过区块链确认的交易,贷方指的是多笔贷款中的第一笔贷款。
事实上,借记账号并没有直接记录在区块链交易中。 要获得借方账号用比特币买汉堡,需要查询源交易的信用信息。
只有发行比特币的矿工奖励交易(每个区块的第一笔交易)没有来源,没有借方,只有贷方。
一笔交易的贷方只能指定一次(消费一次),即当一笔交易的贷方被另一笔已确认交易的借方指定时,视为已被使用/消费,以防止重复支付。
账户余额=SUM(所有未取消交易中的地址为该账户的贷方金额)
借款人不能指定本次交易中的信用为来源,必须是已确认交易中的信用。
比特币交易图
TX0--借源账户:100k,信用账户1:40k,信用账户2:50k(,信用源账户:10k)
TX1--借方账户1:40k,贷方账户3:30k(,贷方账户1:10k)
TX2--借方账户2:50k,贷方账户4:20k,贷方账户5:20k(,贷方账户2:10k)
实际上,图中少了一个零钱输出——因为源交易的一个credit必须一次用完,超过消费限额的金额会在新的交易中连同credit一起退回源账户。 如果忘记添加零钱输出,超出的部分将作为交易费给挖出区块的矿工(一般交易费仅为0.0001BTC)。 这是:
SUM(借方金额)- SUM(贷方金额)=交易费用
小明买汉堡时发生的四笔比特币交易如下图所示:
小明买汉堡的交易
2、接下来看交易数据的内容
交易数据是一串字节流。 数据结构的分析见《》或这里。
交易数据中的几个关键数据:
1、交易ID(TXID,字段名:txid)
它用于在比特币中唯一标识一笔交易,同时也起到防篡改验证码的作用,因为它是对整个数据包(hex)进行哈希处理的结果,也称为TxHash。
TXID=Tx 哈希 = SHA256(SHA256(十六进制))
2.签名脚本(signature script,字段名:scriptSig)
每一个INPUT(上文提到的借方)都必须提供相应的签名脚本来验证源交易的指定输出是否可以被花费。
这有点类似于从银行取款时输入密码验证和签名确认的过程,但要复杂得多,支持的支付方式也灵活得多(类似于简单的智能合约)。
一方面,验证你是指定输出的合法支配者(提供参数解开指定输出的锁)
一方面确认花费指定的输出是您的意愿,并对输入进行锁定,防篡改(包括输入数据的验证)
例如:对于P2PKH的输出,签名脚本需要包含的数据有:
1. 完整的公钥数据; 2、使用secp256k1算法根据私钥和交易数据生成的签名数据。
一个例子(json格式):
“脚本签名”:{
"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”,
“十六进制”:“76a9147514080ab2fcac0764de3a77d10cb790c71c74c288ac”,
“reqSigs”:1,
“类型”:“公钥哈希”,
“地址”:[
“1Bg44FZsoTeYteRykC1XHz8facWYKhGvQ8”
]
}
3.发起交易
发起交易非常简单,就是通过比特币应用程序(如比特币qt等)将结构化的交易数据(字节流格式)广播给比特币。
所有收到交易广播的节点(矿工)在验证合法后,都包含在新的区块中,在本地进行挖矿。
如果矿工挖矿成功,区块将被比特币确认,区块中的交易将生效。
其他未能挖矿的节点将放弃该块,创建一个新块以包含未确认的交易,然后重新开始挖矿。