经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 区块链 » 查看文章
比特币原理——交易与UTXO
来源:cnblogs  作者:KRDecad3  时间:2019/6/17 8:48:10  对本文有异议

UTXO

UTXO (Unspent Transaction Output) 未花费交易输出

传统的支付系统都是基于账户(account based)的,即:
若A向B转账20元

  1. 判断A的账户余额大于等于20元;
  2. 在B的账户上加20元;
  3. 同时在A的账户上减20元。

使用UTXO模型的加密货币中,某一个“账户”中的余额并不是由一个数字表示,而是当前区块链网络中所有跟当前“账户”有关的UTXO组成。也就是,比特币地址账户中的“余额”实际上并不是比特币,而是“UTXO”。

个人感觉直接看概念不太好理解,举例子更好些。

交易1001:张三通过挖矿得到12.5个比特币(或者叫12.5个UTXO),输出到张三的地址上
交易2001:张三转账给李四2.5个比特币,输入来自交易1001中张三地址的12.5个UTXO,输出包括给李四的2.5比特币还包括10个UTXO回到张三的地址
交易3001:张三和李四分别向王五转2.5个比特币,本次交易的输入来自2001中的两个输出,本次交易的输出分别为王五得到的5个UTXO和张三剩余的7.5个UTXO。

每个区块中的第一个交易都是挖矿所得的比特币,只有输出没有输入,叫做Coinbase。

  1. {
  2. "addr":"14uhqGYDEhqwfdoP59QdLWdt4ha5CHttwQ",
  3. "n":1,
  4. "script":"76a9142ae017a5bd24a3f935897085253e503fbfd66f4e88ac",
  5. "spent":false,
  6. "tx_index":335926477,
  7. "type":0,
  8. "value":21680000
  9. }

上面展示了一个UTXO的json数据,其中包含了当前UTXO所属的交易索引tx_index、交易接收方地址addr以及交易数额value。

交易

UTXO属于交易中的一部分,交易由输入和输出两部分组成。一笔交易的数据格式如下:

  1. {
  2. "txid":"5be7a9e47f56c98e5297a44df52da0475f448ece98bb51489103cdf70653092f",
  3. "hash":"5be7a9e47f56c98e5297a44df52da0475f448ece98bb51489103cdf70653092f",
  4. "version":1,
  5. "size":224,
  6. "vsize":224,
  7. "locktime":0,
  8. "vin": [...],
  9. "vout": [...],
  10. "hex":"0100000001a90b4101e6cbb75e1ff885b6358264627581e9f96db9ae609acec98d72422067000000006b483045022100c42c89eb2b10aeefe27caea63f562837b20290f0a095bda39bec37f2651af56b02204ee4260e81e31947d9297e7e9e027a231f5a7ae5e21015aabfdbdb9c6bbcc76e0121025e6e9ba5111117d49cfca477b9a0a5fba1dfcd18ef91724bc963f709c52128c4ffffffff02a037a0000000000017a91477df4f8c95e3d35a414d7946362460d3844c2c3187e6f6030b000000001976a914aba7915d5964406e8a02c3202f1f8a4a63e95c1388ac00000000",
  11. "blockhash":"0000000000000000000c23ca00756364067ce5e815deb5982969df476bfc0b5c",
  12. "confirmations":5,
  13. "time":1521981077,
  14. "blocktime":1521981077
  15. }

其中“vin”和“vout”就是代表输入和输出。
每笔合法交易中,所有的输入之和必须大于所有的输出之和,其中的差值就是交易手续费。

  1. sum(inputs.vlaue) = sum(outputs.value) + fee

输入

输入如下:

  1. {
  2. "vin":[
  3. {
  4. "txid":"672042728dc9ce9a60aeb96df9e9817562648235b685f81f5eb7cbe601410ba9",
  5. "vout":0,
  6. "scriptSig":{
  7. "asm":"3045022100c42c89eb2b10aeefe27caea63f562837b20290f0a095bda39bec37f2651af56b02204ee4260e81e31947d9297e7e9e027a231f5a7ae5e21015aabfdbdb9c6bbcc76e[ALL] 025e6e9ba5111117d49cfca477b9a0a5fba1dfcd18ef91724bc963f709c52128c4",
  8. "hex":"483045022100c42c89eb2b10aeefe27caea63f562837b20290f0a095bda39bec37f2651af56b02204ee4260e81e31947d9297e7e9e027a231f5a7ae5e21015aabfdbdb9c6bbcc76e0121025e6e9ba5111117d49cfca477b9a0a5fba1dfcd18ef91724bc963f709c52128c4"
  9. },
  10. "sequence":4294967295
  11. }
  12. ]
  13. }

输入数据包含 引用的UTXO所在交易的哈希txid,引用的UTXO索引(从0开始)vout。通过txid和vout两个字段,就可以在区块链上定位到唯一的UTXO。

输出

输出如下:

  1. {
  2. "vout":[
  3. {
  4. "value":0.10500000,
  5. "n":0,
  6. "scriptPubKey":{
  7. "asm":"OP_HASH160 77df4f8c95e3d35a414d7946362460d3844c2c31 OP_EQUAL",
  8. "hex":"a91477df4f8c95e3d35a414d7946362460d3844c2c3187",
  9. "reqSigs":1,
  10. "type":"scripthash",
  11. "addresses":[
  12. "3CcqrGq4oQcfx3u75ijj4tDiqf4HJvhoeP"
  13. ]
  14. }
  15. },
  16. {
  17. "value":1.84809190,
  18. "n":1,
  19. "scriptPubKey":{
  20. "asm":"OP_DUP OP_HASH160 aba7915d5964406e8a02c3202f1f8a4a63e95c13 OP_EQUALVERIFY OP_CHECKSIG",
  21. "hex":"76a914aba7915d5964406e8a02c3202f1f8a4a63e95c1388ac",
  22. "reqSigs":1,
  23. "type":"pubkeyhash",
  24. "addresses":[
  25. "1GedHcxdxq2tab98hqAmREUK9BBYHKznof"
  26. ]
  27. }
  28. }
  29. ]
  30. }

每一个未被使用的vout就是一个UTXO,vout中包含了输出的额度value,以及对应的到账地址。

在每一笔交易中,可以存在多个输入和多个输出,比如一个地址的比特币是由多个地址的转账而来的。每一个UTXO相当于一个面值不可分割的硬币,A拥有一个1比特币的UTXO和一个5比特币的UTXO,当向B转账2比特币时,就会从A的5比特币UTXO花费掉,其中2比特币UTXO给了B,另外3比特币UTXO找零返还给自己。

这张图就是一个地址的多个UTXO作为输入:

这张图是一个地址的UTXO转账一部分,剩余的作为找零,成为发送方的一个新UTXO:

原文链接:http://www.cnblogs.com/KRDecad3/p/11025768.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号