比特币(BitCoin)的概念最初由中本聪在2009年提出,是基于区块链的P2P网络。比特币是一种P2P形式的数字货币。点对点的传输意味着一个去中心化的支付系统。
比特币无中央服务器,所有数据存储在每一个终端用户设备上,产生的每一笔交易都经过全世界挖矿设备的算力竞赛胜利者记录到一个区块上,而这些区块以自然顺序链接起来组成了一个庞大的区块链链条,分布于世界各地,不可反悔,不可更改。
Coinbase
刚挖出来的比特币
UTXO (Unspent Transaction Output)
在比特币社区里 Transaction被简称为TX,因此上面的被简写为UTXO。
比特币的区块链账本里记录的是一笔又一笔的交易,每笔交易都有若干交易输入,也就是资金来源,也都有若干笔交易输出,也就是资金去向。一般来说,每一笔交易都要花费(spend)一笔输入,产生一笔输出,而其所产生的输出,就是“未花费过的交易输出”,也就是 UTXO。
UTXO就是一个数字加一个锁定的脚本,其中锁定的脚本唯一的变量就是接收方公钥的hash 值,并没有真正的加密,
比特币系统里没有账户,只有UTXO和拥有者的公钥的hash值,如果有人通过一笔转账给你转了一个币,在与你公钥hash所匹配的数据库里会有增加一个utxo,其数值是1,如果别人分两次给你转一个比特币,每次0.5,这个时候数据库里会有两个utxo,其每一个的数值是0.5。
比特币钱包是有账户的,里面用户余额是由钱包算出来的,通过你公钥的hash遍历整个utxo数据库得到你的值,
比特币的花费就是把你公钥hash下的utxo消耗掉,新的utxo的输出就是接收方公钥的hash值,交易完后你的公钥hash下的utxo会被删除掉,数据库再生成一个utxo,而这个utxo属于那个接收者。而接收者想花掉这笔utxo时候必须拿他的私钥解锁这个utxo,
比特币交易遵守几个规则
第一,除了coinbase交易之外,所有的资金来源都必须来自前面某一个或者几个交易的 UTXO,就像接水管一样,一个接一个,此出彼入,此入彼出,生生不息,钱就在交易之间流动起来了。
第二,任何一笔交易的交易输入总量必须等于交易输出总量,等式两边必须配平。
上图第一个交易 #1001 号交易是 coinbase 交易。比特币是矿工挖出来的。当一个矿机费尽九牛二虎之力找到一个合格的区块之后,它就获得一个特权,能够创造一个 coinbase 交易,在其中放入一笔新钱,并且在交易输出的收款人地址一栏,堂堂正正的写上自己的地址。在我写文章的这一天(2016年8月9日),这笔比特币的数额规定为 12.5 枚,市价 48,576元人民币。这个 coinbase 交易随着张三挖出来的区块被各个节点接受,经过六个确认以后永远的烙印在历史中。
过了几天,张三打算付 2.5 个比特币给李四,张三就发起一#2001号交易,这个交易的资金来源项写着“#1001(1)”,也就是 #1001 号交易——张三挖出矿的那个 coinbase 交易——的第一项 UTXO。然后在本交易的交易输出 UTXO 项中,把2.5个比特币的收款人地址设为李四的地址。
请注意,这一笔交易必须将前面产生那一项 12.5 个比特币的输出项全部消耗,而由于张三只打算付给李四 2.5 个比特币,为了要消耗剩下的10比特币,他只好把剩余的那 10 个比特币支付给自己,这样才能符合输入与输出配平的规则。
再过几天,张三和李四打算AA制合起来给王五付 5 枚比特币。那么张三或李四发起 #3001 号交易,在交易输入部分,有两个资金来源,分别是#2001(1) 和 #2001(2),代表第 #2001 号交易的第 (1) 和第 (2) 项 UTXO。然后在这个交易的输出部分里如法炮制,给王五5比特币,把张三剩下的 7.5 比特币发还给自己。以后王五若要再花他这5比特币,就必须在他的交易里注明资金的来源是 #3001(1)。
交易验证
发生交易时需验证交易的真伪,运用勒基于栈的脚本语言,如果验证通过再对utxo进行锁定到自己地址下(公钥hash),并全网广播出去。
挖矿
比特币建立一 个去中心化的货币系统, 需要把状态转移系统和一致性系统结合起来,以确保每个人都 同意这交易的顺序。比特币的去中心化的一致性处理进程要求网络中的节点连续不断的去尝试对交易进行打包,这些被打成的包就称为“区块”。这个网络会故意的每隔 10 分钟左右就创建一个区 块, 每一个区块里都包含一个时间戳,一个随机数,一个对上一个区块的引用 ,和从上一个区块开始的所有交易的列表。随着时间的推移,这会创建一个持久的,不断增长的区块链,这个区块链不断的被更新,使其始终代表着最新的比特币总账的状态。
验证一个区块是否有效的算法如下:
1. 检查其引用的上一个区块是否存在并且有效.
2. 检查这个区块的时间戳是否大于上一个区块的时间戳 并且小于 2 小时之内
3. 检查这区块上的工作证明是否有效.
4. 让 S[0] 成为上一个区块的最末端的状态.
5. 假设 TX 是这个区块的交易列表,且有 n 个交易。 做 for 循环,把 i 从 0 加到到 n-1, 设 置 S[i+1] = APPLY(S[i],TX[i]) 如果任何一个应用(APPLY)返回错误,则退出并且返回。 6. 返回 true,并且把 S[n] 设置成这个区块最末端的状态。
在上述列出的验证条件中,“工作证明” 这一明确的条件就是每一个区块的 2 次 SHA256 哈希值, 它作为一个 256 位的数字,必须小于一个动态调整的目标值, 截止到本文写作的时间,该动态调整的 值的大小大约是 2 的 187 次方。这样做的目的是为了让创建区块的算法变难, 从而,阻止幽灵攻击 者从对它们有利的角度出来,来对区块链进行整个的改造。因为 SHA256 被设计成一个完全不可预 测的伪随机函数, 这创建一个有效区块的唯一的方法只有是不断的尝试和出错, 不断对随机数进行 递增,然后查看新的哈希值是否匹配。按照当前的目标值 2 的 187 次方,这个网络在找到一个有效的区块前,必须进行 2 的 69 次方次的尝 试; 一般来说,每隔 2016 个区块,这个目标值就会被网络调整一次 ,因此网络中平均每隔 10 分钟 就会有一些节点产生出一个新的区块。为了补偿这些矿工的计算工作, 每一个区块的矿工有权要求 包含一笔发给他们自己的 12.5BTC(不知道从哪来的)的交易。另外,如果任何交易,它的总的输入 的面值比总的输出要高,这一差额会作为“交易费用”转给矿工。顺便提一下,对矿工的奖励是比 特币发行的唯一途径,创世状态中并没有比特币。
网友评论