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

比特币的交易模型为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输入input、输出print

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

  2. 四、用户交互(输入input,格式化输出)与运算符

    1.接收用户的输入 在Python3:input会将用户输入的所有内容都存成字符串类型 列: username = input("请输入您的账号:") # "egon&q ...

  3. Python中的输入(input)和输出打印

    目录 最简单的打印 打印数字 打印字符 字符串的格式化输出 python中让输出不换行 以下的都是在Python3.X环境下的 使用 input 函数接收用户的输入,返回的是 str 字符串 最简单的 ...

  4. 比特币原理——交易与UTXO

    UTXO UTXO (Unspent Transaction Output) 未花费交易输出 传统的支付系统都是基于账户(account based)的,即: 若A向B转账20元 判断A的账户余额大于 ...

  5. Angular 个人深究(三)【由Input&Output引起的】

    Angular 个人深究(三)[由Input&Output引起的] 注:最近项目在做别的事情,angular学习停滞了 1.Angular 中 @Input与@Output的使用 //test ...

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

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

  7. Python 基础【第三篇】输入和输出

    这里我们创建一个python(pytest)脚本用于学习测试(以后都为这个文件,不多做解释喽),这个文件必须要有执行权限的哈 1.创建pytest并赋予执行权限 [root@fengyuba_serv ...

  8. word2vec原理(三) 基于Negative Sampling的模型

    word2vec原理(一) CBOW与Skip-Gram模型基础 word2vec原理(二) 基于Hierarchical Softmax的模型 word2vec原理(三) 基于Negative Sa ...

  9. 深入比特币原理(四)——锁定脚本(locking script)与解锁脚本(unlocking script)

    通常比特币都是以虚拟货币的概念出现在大众眼前,实际上比特币是第一个真正的区块链"平台",利用它去中心化.不可篡改.可追溯等特点不光可以实现多种交易模式(如点对点交易.多重签名交易等 ...

随机推荐

  1. Java I/O系统学习系列五:Java序列化机制

    在Java的世界里,创建好对象之后,只要需要,对象是可以长驻内存,但是在程序终止时,所有对象还是会被销毁.这其实很合理,但是即使合理也不一定能满足所有场景,仍然存在着一些情况,需要能够在程序不运行的情 ...

  2. 第一行python代码

    Hello Python 其实和大家一样为了以后多一条生存之路,本人也比较感兴趣python,因为它相比较JAVA来说,实现功能真的太方便了. 万事开头难,python不例外,本人在校过程学习了jav ...

  3. 大宇java面试系列(一):jvm垃圾回收

    1. 说一下 JVM 有哪些垃圾回收算法? 标记-清除算法:标记无用对象,然后进行清除回收.缺点:效率不高,无法清除垃圾碎片. 标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除 ...

  4. Maven和Gradle中配置单元测试框架Spock

    Maven Maven本身不支持其他JVM语言(例如Groovy或Scala).要在Maven项目中使用它,需要使用第三方插件.对于Groovy而言,最好的选择似乎是GMavenPlus(重写不再维护 ...

  5. js在字符串中加入一段字符串

    在这个功能的实现主要是slice()方法的掌握 arrayObject.slice(start,end) start 必需.规定从何处开始选取.如果是负数,那么它规定从数组尾部开始算起的位置.也就是说 ...

  6. [综合] ISE的综合结果

    1.count2 == 7‘d12,会被综合成下面这个样子, 7‘d12就是左边下面这根绿线,等于符号在中间的圆圈里. 2.什么线都不点的时候,也就什么也没被选中, 而一旦我点击了某根线,却发现图里到 ...

  7. 在 ASP.NET Core 项目中使用 MediatR 实现中介者模式

    一.前言  最近有在看 DDD 的相关资料以及微软的 eShopOnContainers 这个项目中基于 DDD 的架构设计,在 Ordering 这个示例服务中,可以看到各层之间的代码调用与我们之前 ...

  8. spark安装配置

    一.下载解压 二.配置 (假设已经配置了Java.Hadoop) 1.环境变量 2.spark配置 进入spark安装目录,复制文件 编辑spark-env.sh文件,在文件中添加如下信息(括号中路径 ...

  9. linux禁用icmp(ping )

    永久禁用: echo net.ipv4.icmp_echo_ignore_all=1 >>/etc/sysctl.conf 永久启用: echo net.ipv4.icmp_echo_ig ...

  10. 理解MySQL数据库事务-隔离性

    Transaction事务是指一个逻辑单元,执行一系列操作的SQL语句. 事务中一组的SQL语句,要么全部执行,要么全部回退.在Oracle数据库中有个名字,叫做transaction ID 在关系型 ...