本节内容非常重要,如果你不能很好的掌握本节内容,你无法真正理解比特币的运行原理,请务必要学习清楚。

比特币的交易模型为UTXO(unspend transaction output),即只记录未花费的比特币输出,每次交易花费的是之前的某一个或多个输出。

什么是UTXO?

以下借用一下网上的图

我们在现实世界中的支付系统是基于账户模型的,也就是说每一个人都有一个账户,支付就是在不同的账户中加加减减,类似如下:

UTXO的实现,图示如下:

从上面的图中可以看出,比特币存储的实际是一笔又一笔的交易,最后永远只有未花费过的交易输出,也就是UTXO。

这种设计是由中本聪原创,相对于传统的账户模型,具有以下好处:

1.账户数据库会不断膨胀,因为账户不会被删除,而UTXO数据库体积会小很多。

2.由于只有未花费的输出会被保留,所以每一个比特币用户可以拥有几乎无限多的地址,提高了匿名性。

3.UTXO为高并发的交易带来可能,试想传统的账户模型,每个人的账户交易必须是线性的,无法并发。而现在每个人可能拥有多个UTXO,可同时发起多笔交易,实现了并发。

另外有一种特殊的交易,称为Coinbase交易,即矿工挖出的比特币,该交易没有输入,只有输出(Coinbase交易我们将在挖矿章节讨论),本节内容均以非coinbase交易举例。

比特币交易解码后的内容

从解码的内容可以看到,比特币的交易是由输入与输出组成的,而不是账户地址。

{    "version": 1,    "locktime": 0,    #交易输入(input)部分"vin": [           {    #输入引用的交易(transaction)HASH"txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",       #引用交易中的UTXO索引(第一个为0,此处代表上述txid交易中的第一个UTXO)"vout": 0,                                    #解锁脚本,用于解锁UTXO的脚本(这是可以花费这笔UTXO的关键信息)"scriptSig": "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",          "sequence": 4294967295            }    ],    #交易输出(output)部分 "vout": [         {    #第一个输出的比特币数量"value": 0.01500000,             #锁定脚本,后续的交易如要使用该输出,必须解锁锁定脚本"scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"          },    {    #第二个输出的比特币数量"value": 0.08450000,             "scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",    }    ]    }

可以从以上内容看出,比特币的交易中实际没有账户余额信息,只有输入(input)与输出(output)两部分信息。

说的更直白一点,比特币的交易类似于现实世界中直接用支票进行交易。如A写给B一张100元的支票,其中A是输入,B是输出。当B需要给C付50元时,B不是去银行兑现支票然后付款给C,而是直接写两张新支票,一张50元给C,一张50元给自己,再将原来100元的支票作废,即完成一次非基于账户模型的支付。

最后附上交易输入输出的内容格式:

输入

输出

交易费

比特币每次交易需要支付交易费给矿工,比特币早期交易费基本为0,但随着交易增多,交易费逐步开始升高。交易费是除产生新比特币外对矿工的另一种激励,在全部比特币被挖出后,矿工的收入将全部来自于交易费。交易费的特点如下:
1.交易费是一种激励,同时也是一种安全机制,使经济上不利于攻击者通过大量交易来淹没网络。
2.交易费是通过字节大小来计算,而不是花费比特币的多少。
3.目前交易均使用动态交易费,交易费的高低会影响交易被矿工处理(加入区块链)的优先级,交易费过低或为0的交易极少会被处理,甚至不会在网络上广播。
4.交易费不会存储在交易信息中,而是通过输出(output)与输入(input)的差值来替代(如果你要自己创建交易必须千万注意输出的金额大小,因为交易的差值无论大小全部会被矿工获得)
   交易费 = SUM(所有输入) - SUM(所有输出)
5.预估当前合适的交易费
访问第三方网站:https://bitcoinfees.earn.com

通过该网站页面可预估当前合适的交易费用,如图中所示当前(2018/2/27)快速确认的手续费为50 satoshis/byte(一般交易大小为226 bytes)

可通过调用该网站提供的HTTP REST API计算不同优先级下的交易费
$ curl https://bitcoinfees.21.co/api/v1/fees/recommended
{"fastestFee":50,"halfHourFee":40,"hourFee":20}
fastestFee:最快确认
halfHourFee:三个块内确认
hourFee:六个块内确认

作者:Aaron

深入比特币原理(三)——交易的输入(input)与输出(output)相关推荐

  1. python输入变量输出常量_Python输入input、输出print

    1.输入input input是用于输入数据给变量.通过键盘输入的是字符串,如果需要其他格式,需要做转换.比如int.float类型数据,int() 如下是一个例子: 如果a不进行int转换,那么输入 ...

  2. python输入格式一个不带小数点_Python输入input、输出print

    1.输入input input是用于输入数据给变量.通过键盘输入的是字符串,如果需要其他格式,需要做转换.比如int.float类型数据,int() 如下是一个例子: 如果a不进行int转换,那么输入 ...

  3. 第五 python中格式化输入input()函数的使用

    一.input的使用 输入: input()函数 input(prompt=None,) #内置函数:从标准的输入流中读取一个字符串,按行读取 input()函数键盘输入的都是字符串类型,即使输入的是 ...

  4. 深入比特币原理(一)——比特币白皮书总结与点评

    2008年,中本聪发布了比特币白皮书<一种点对点的电子现金系统>,从此开启了区块链技术的新天地,虽然中本聪在2011年后销声匿迹,但白皮书中涵盖了中本聪最希望传递的比特币的世界观,对于每一 ...

  5. c语言如何持续输入字符直到指定字符结束_《小白学C》第三章 常用输入输出函数...

    第三章 常用输入/输出函数 与其他高级语言一样, C语言的语句是用来向计算机系统发出操作指令的. 当我们提到输入时,这意味着要向程序填充一些数据.输入可以是以文件的形式或从命令行中进行.C 语言提供了 ...

  6. python输入三个数输出最小值_python之输入一系列整数输出最大值

    在python学习中,我们经常会遇到:编写一个程序,输入若干整数或者是在一串字符中,输出最大值(数)的问题.那么在这里,我给出了几种常见的,也是几种比较常用的方法,希望能给大家的学习带来一定的帮助. ...

  7. 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe. 看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print su ...

  8. 屏幕输出语句_第三章 常用输入/输出函数

    第三章 常用输入/输出函数 与其他高级语言一样, C语言的语句是用来向计算机系统发出操作指令的. 当我们提到输入时,这意味着要向程序填充一些数据.输入可以是以文件的形式或从命令行中进行.C 语言提供了 ...

  9. 带你自学Python系列(十):用户输入input函数详解

    ↑ 点击上方[计算机视觉联盟]关注我们 今天是小编持续更新关于Python的知识总结以及Python实践项目应用的第10天,带你利用零碎时间自学最受欢迎的编程语言之一Python语言.你和小编一起打卡 ...

最新文章

  1. 数据结构----单链表增删改查
  2. mysql字符集相关问题_MySQL 字符集相关问题
  3. 【深度学习】什么是目标检测中的平均精度均值(mAP)?
  4. NVIDIA显示下载Java_大佬们!我的NVIDIA Geforce Experience 一直下载更新怎么办?
  5. c语言解析json数据
  6. MySQL利用UDF执行命令
  7. How to get user parameter settings
  8. 怎么实现阵列装配_第九篇:磁盘阵列和群晖SHR
  9. java string 包含http_Java中使用HttpPost上传文件以及HttpGet进行API请求(包含HttpPost上传文件)...
  10. Linux基础(iptables与firewalld防火墙)
  11. zzulioj 1065:统计数字字符个数
  12. 昆明学院C语言期末考试,昆大c试于题b.doc
  13. 解决微信浏览器无法使用reload()刷新页面
  14. 利用ModelBinder防止XSS一次尝试
  15. 年度最强浏览器插件来袭,打造个人完美生产力
  16. Matlab 之norm函数
  17. 浏览器上模拟qq的消息提示声/网页播放声音
  18. Qt: 信号与槽机制
  19. 使用VSCode打开html文件是空白,在文件夹大小也是0KB解决方法
  20. python训练自己中文语料库_中文语料库构建过程详细教程

热门文章

  1. 视觉SLAM笔记(41) 光流
  2. php curl无视ssl,用Curl实现Post和Get请求,可绕过SSL验证
  3. Dao接口返回数组_JavaScript二进制数组(2)TypedArray视图
  4. 炸掉卡西欧991CNX
  5. error C2662
  6. Tomcat系列(6)——Tomcat处理一个HTTP请求的过程
  7. mysql、sqlserver、oracle各数据类型与java类型对应
  8. mybatis-01
  9. JavaScriptCore全面解析
  10. 前端学习之路之CSS (一)