比特币用到的算法知识( 二 )


Transaction Fee = SUM(Input's amount) - SUM(Output's amount)每笔Tx的矿工费必然大于等于零,否则该笔Tx即为非法,不会被网络接收 。
数据块数据块(Block)是存储Block Meta与Tx的地方 。Block的第一笔Tx总是CoinBase Tx,因此Block中的交易数量总是大于等于1,随后是这段时间内网络广播出来的Tx 。
找到合适的Block是一件非常困难的事情,需要通过大量的数学计算才能发现,该计算过程称为“挖矿” 。首个发现者,会得到一些比特币作为奖励 。
数据链多个Block连接起来成为数据链(Block Chain) 。

比特币用到的算法知识

文章插图
 
为了引入容错与竞争机制,比特币系统允许Block Chain出现分叉,但每个节点总是倾向于选择最高的、难度最大的链,并称之为Best Chain,节点只认可Best Chain上的数据 。
首个Block称为Genesis Block,并设定高度为零,后续每新增一个Block,高度则递增一 。目前是不允许花费Genesis Block中的比特币的 。
  1. 每个Block中的Tx在此Block中均唯一
  2. 一个Tx通常只会在一个Block里,也可能会出现在多个Block中,但只会在Best Chain中的某一个Block出现一次
货币存储比特币是密码货币、纯数字化货币,没有看得见摸得着的硬币或纸币 。一个人持有比特币意味着:
  1. 其拥有一些地址的私钥
  2. 这些地址是数笔交易的输出,且未花费
所有货币记录均以交易形式存储在整个blockchain数据块中,无交易无货币 。货币不会凭空产生,也不会凭空消失 。遗失了某个地址的私钥,意味着该地址上的Tx无法签署,无法成为下一个Tx的输入,便认为该笔比特币永久消失了 。
货币发行既然所有交易的输入源头都是来自CoinBase,产生CoinBase时即意味着货币发行 。比特币采用衰减发行,每四年产量减半,第一个四年每个block的coinbase奖励50BTC,随后是25btc, 12.5btc, …并最终于2140年为零,此时总量达到极限为2100万个btc 。
比特币用到的算法知识

文章插图
 
减半周期,严格来说,并不是准确的四年,而是每生成210000个block 。之所以俗称四年减半,是因为比特币系统会根据全网算力的大小自动调整难度系统,使得大约每两周产生2016个block,那么四年约21万块block 。
该函数GetBlockValue()用于计算挖得Block的奖励值:
int64 static GetBlockValue(int nHeight, int64 nFees){int64 nSubsidy = 50 * COIN;// Subsidy is cut in half every 210000 blocks, which will occur Approximately every 4 yearsnSubsidy >>= (nHeight / 210000);return nSubsidy + nFees;}当达到2100万btc以后,不再有来自CoinBase的奖励了,矿工的收入来源仅剩下交易的矿工费 。此时,每个block的收入绝对值btc很低,但此时比特币应当会非常繁荣,币值也会相当的高,使得矿工们依然有利可图 。
杜绝多重支付传统货币存在多重支付(Double Spending)问题,典型的比如非数字时代的支票诈骗、数字时代的信用卡诈骗等 。在比特币系统里,每笔交易的确认均需要得到全网广播,并收录进Block后才能得到真正确认 。每笔钱的花销,均需要检测上次输入交易的状态 。数据是带时间戳的、公开的,BlockChain由巨大的算力保障其安全性 。所以比特币系统将货币的多重支付的风险极大降低,几近于零 。通过等待多个Block确认,更是从概率上降低至零 。一般得到6个确认后,可认为非常安全 。但对于能影响你人生的重大支付,建议等待20~30个确认 。
匿名性任何人均可以轻易生成大量的私钥、公钥、地址 。地址本身是匿名的,通过多个地址交易可进一步提高匿名性 。但该匿名性并不像媒体宣传的那样,是某种程度上的匿名 。因为比特币的交易数据是公开的,所以任何一笔资金的流向均是可以追踪的 。
不了解比特币的人为它的匿名性产生一些担忧,比如担心更利于从事非法业务;了解比特币的人却因为它的伪匿名性而苦恼 。传统货币在消费中也是匿名的,且是法律保障的,大部分国家都不允许个人涂画纸币 。
地址本身是匿名的,但你可以通过地址对应的私钥签名消息来向公众证明你拥有某个比特币地址 。
其他名词哈希
哈希(Hash)是一种函数,将一个数映射到另一个集合当中 。不同的哈希函数映射的空间不同,反映到计算机上就是生成的值长度不一样 。同一个哈希函数,相同的输入必然是相同的输出,但同一个输出却可能有不同的输入,这种情况称为哈希碰撞 。


推荐阅读