BTC-实现

区块链是去中心化的账本,比特币采用的是基于交易的账本模式(transaction-based ledger),只记录了转账交易和铸币交易,并没有直接记录每个账户上有多少钱。如果想知道某个比特币账户上有多少钱,要通过交易记录来推算。

UTXO

比特币中的全结点要维护一个叫UTXO(Unspent Transaction Output)的数据结构,即未花费交易的输出。一个交易可能有多个输出,被花掉的就不在UTXO里了。如下图中A转账给B和C的交易,B的已经花出去了,也就不在UTXO里了,而C的还没花出去,就在UTXO里。

UTXO集合中的每个元素要给出产生这个输出的交易的哈希值,以及它在这个交易中是第几个输出。用这两个信息就可以定位到一个确定的交易中确定的输出。

使用UTXO可以用来快速检测双花攻击,想知道新发布的交易是不是合法的,要查一下全结点存在内存中的UTXO。要花掉的币只有在这个UTXO这个集合里才是合法的,否则要么是不存在的,要么是已经花过了的。

随着交易的发布,每个交易会消耗掉一些输出,同时也会产生一些新的输出。例如下图例子中B将5个BTC给D,这消耗掉了前面A把5个BTC给B的输出,但产生了新的B把5个BTC给D的输出,这个输出会保存在UTXO里。

在这里插入图片描述

如果一个账户从交易中获得比特币之后,不花出去,那么这些输出就要一直保存在UTXO里。有的人是一直不花,比如中本聪,有的是把密钥丢了没法花,但不论怎样这些没消耗掉的交易输出都要一直存在UTXO里,目前的大小是能保存在一个普通服务器内存中的。

交易中 total inputs=total output

每个交易可以有若干输入和若干输出,所有输入的金额之和要等于所有输出的金额之和。

第二个激励机制:交易费(transaction fee)

有些交易的总输入可能略微大于总输出,如可能总输出是1个BTC,总输出是0.99个BTC,这之中的差额就作为记账费给了获得记账权的那个结点。

这样设计是因为仅仅为获得记账权的节点给予出块奖励是不够的,获得记账权的节点为什么要把某些交易记下来?这样做对他有什么好处呢?一个节点完全可以只打包自己的交易,记录别人的交易不仅要去验证其合法性,而且一个区块装的交易多了,在网络上传输的带宽也会比较多,在网络上传输的速度也会慢。这里的差额作为记账费就解决了这个给别人记账的动机的问题。

这里0.01个BTC已经是很大的交易费了,也有一些很简单的交易是没有交易费的,也就是完全符合total inputs=total outputstotal inputs=total outputs

目前来讲矿工挖矿,主要的目的还是为了第一个激励机制——得到出块奖励。因为出块奖励是要逐渐减少的,每隔21万个区块就要减半,比特币系统的平均出块时间是10分钟,大约每隔4年出块奖励就会减半。到很多年之后,出块奖励变得很小,这时候交易费就成为主要动机了。

除了比特币系统这样基于交易的账本模式(transaction-based ledger),还有一些系统是基于账户的模式(account-based ledger),比如后面要学的以太坊。在这种模式中系统要显式的记录每个账户中有多少个币。
比特币系统的这种模式,隐私保护性比较好,但会带来一些代价,如转账交易要说明币的来源(币是从之前的哪个交易的哪个输出中来的)以防止双花攻击。

一个区块的例子

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值