免责声明:金色财经所有资讯仅代表作者个人观点,不构成任何投资理财建议。请确保访问网址为(jinse.cn) 举报

    比特币背后的密码学原理 三

    目录:

               序言

    一.      密码学理论

    二.      比特币实战

    三.      区块链

    四.      挖矿原理

    五.      总结

    比特币背后的密码学原理(连载一)

    比特币背后的密码学原理(连载二)

    三.   区块链

    区块链可以理解为数据结构概念中的链表(和线性表略有不同的是可能有分叉),这里我们只需要大致了解区块数据结构以及每一块大致的意思,这些结构信息将会在交易和挖矿部分进行详细讲解。

    区块链可以理解为运行在去中心化网络中的,所有节点(挖矿节点)共同维护的交易数据库,这个数据库是以链式的形式组织交易数据的,每一个链表的块被称为区块或者block。

    3.1 区块结构

    区块是一种被包含在公开账簿(区块链)里的聚合了交易信息的容器数据结构。它由一个包含元数据的区块头和紧跟其后的构成区块主体的一长串交易组成。

    上表中的1-9应该是1-9个字节,否则会引起歧义。

    3.2 区块头

    区块头由三组区块元数据组成。首先是一组引用父区块哈希值的数据,这组元数据用于将该区块与区块链中前一区块相连接。第二组元数据,即难度、时间戳和nonce,与挖矿竞争相关。第三组元数据是merkle树根(一种用来有效地总结区块中所有交易的数据结构)。

    Nonce、难度目标和时间戳会用于挖矿过程,Merkle根用来索引和组织该区块所有的交易信息,其结构见下一节。

    因此区块头之间的连接大约像下图所示:

    从上图我们可以知道如何避免双重支付问题,因为收款人有办法对这笔支付之前的所有消息进行检索直至追溯到原始的挖矿区块,实际上比特币世界里的每一枚比特币都是被标记可溯源,双重支付是可以避免的。

    3.3 Merkle Tree

    Merkle Tree,是一种树(数据结构中所说的树),网上大都称为Merkle Hash Tree,这是因为 它所构造的Merkle Tree的所有节点都是Hash值。Merkle Tree具有以下特点:

    1. 它是一种树,可以是二叉树,也可以多叉树,无论是几叉树,它都具有树结构的所有特点;

    2. Merkle树的叶子节点上的value,是由你指定的,这主要看你的设计了,如Merkle Hash Tree会将数据的Hash值作为叶子节点的值;

    3 非叶子节点的value是根据它下面所有的叶子节点值,然后按照一定的算法计算而得出的。如Merkle Hash Tree的非叶子节点value的计算方法是将该节点的所有子节点进行组合,然后对组合结果进行hash计算所得出的hash value。

    例如,下图就是一个Merkle Hash Tree形状,如果它是Merkle Hash Tree,则节点7的hash value必须是通过节点15、16上的value计算而得到.

    在处理比对或验证的应用场景中时,特别是在分布式环境下进行比对或验证时,Merkle Tree会大大减少数据的传输量以及计算的复杂度。例如,就拿图一举例,假如是 15,16.......30是一个个数据块的hash值,我把这些数据从A传输到B,数据传输到B后,我想验证下传输到B上的数据的有效性型(验证数据是否在传输过程中发生变化),只需要验证A 和 B上所构造的Merkle Tree的root节点值是否一致即可,如果一致,表示数据是有效的,传输过程中没有发生改变。假如在传输过程中,15对应的数据被人篡改,通过Merkle Tree很容易定位找到(因为此时,节点0,1,3,7,15对应的hash值都发生了变化)

    需要解释的是交易数据是怎么构建成数的呢,其实很简单:首先将所有交易作为叶子节点,两两相邻分组(总的交易数量如果是奇数就把单个的那个复制一份),然后对每一对交易分别计算哈希并依此向上构建树直至根节点,如下图所示:

    4.  交易

    再次强调的是,比特币网络中流转的是交易信息,每个账户的余额是通过交易信息推算出来的,交易信息是双向的,有一个输入必定对应一个输出。

    4.1交易输入输出

    每一笔交易,out的总额应该等于in的总额。但是,在这个交易单里,只会有out的Value,没有in的Value,而是通过in的Pervious与index,追溯到上一个交易单的某一个out,获得Value。

    一次send bitcoin,剩下的钱,应该out给自己,否则这个钱就丢了。

    情况列举:

    我有10个BTC,是某一次交易获得的,我要送给朋友A,10个BTC。这时候,有一个in,一个out。

    我有10个BTC,是某一次交易获得的,我要送给朋友A,5个BTC,这时候,有一个in,两个out,一个指向朋友5个BTC,一个指向我自己,得到剩下的5个BTC。

    我有10个BTC,是以前的两次交易获得的,我要送给朋友A,10个BTC,这时候,有两个in,一个out。

    我有10个BTC,是以前的两次交易获得的,其中一次获得了6个BTC,另一次获得了4个BTC,我要送给我的朋友7个BTC,这时候,有两个in,两个out。

    比特币交易的基本单位是未经使用的一个交易输出,简称UTXO。UTXO是不能再分割、被所有者锁住或记录于区块链中的并被整个网络识别成货币单位的一定量的比特币货币。这句话什么意思呢?比特币交易除了挖矿获取以外,都是零和的,因为区块链不维护余额信息也没有余额概念,区块链只有交易信息。举个例子,你有10个比特币现在需要支付2个出去,那么交易数据维护的是一个输入(未经使用的10个比特币)和2个输出(一个是2个币对应的地址),还有一个是8个币对应地址是你自己的地址。

    4.2交易过程

    交易的基本诉求,是付款人(payer)汇款给收款人(payee)。技术挑战是加密(cryptography),目的是不让第三者截获甚至篡改汇款金额。

    下图解释了 Owner0 给 Owner1以及后续 汇款的交易机制,截图如下。

    1. Owner0 先查到 Owner1 的公钥。用 Owner1 的公钥(Public Key)把汇款详情加密。这样,只有 Owner1 本人用自己的私钥(Private Key),才能打开加了密的汇款详情。在图例中,没有画汇款详情。不过这个小小的叙述的疏忽无妨大雅。

    2. 为了方便 Owner1 验证这笔汇款的确来自 Owner0,而不是别人,Owner0 发出的汇款单里,除了有加了密的汇款详情,还有 Owner0 的数字签名(Signature)。Owner1 拿到汇款时,为了验证这笔汇款的确来自 Owner0,他可以用 Owner0 的公钥,来验证汇款单中 Owner0 的数字签名。

    3. Owner0 发出汇款单时,汇款单不仅仅投递到 Owner1,而且还要广而告之,任何人只要愿意参与 BitCoin 审计,都可以收到全球所有人发出的所有汇款单。

    4. 沿用 1、2、3 的原理,Owner1 给 Owner2 汇款,然后 Owner2 给 Owner3 汇款。BitCoin 通过 Hash 机制,把涉及同一枚 BitCoin 的所有汇款交易(Tranaction)串连起来,目的是为了追查重复付款(double spending)的欺诈行为。

    单独来看交易创建过程:

    收款方对交易进行验证:

    四.  挖矿原理

    挖矿的本质意义是挖矿节点争夺记账权!主观上来说,挖矿节点获得了挖矿奖励及交易费,客观上来说,这保证了区块链按照特定规则持续稳定的被维护。

    挖矿的具体实现就是在难度一定的情况下通过暴力双SHA256哈希运算获取满足难度taget的Nonce值,所谓的工作量证明就是无数次哈希运算穷举并比对的过程。

    “挖矿”算法我们可以参考区块头结构解说如下:

    第一步:找到区块版本号version。

    第二步:找到上一个区块的hash值(父区块哈希值):prev_hash。

    第三步:输入记录交易的hash树的根节点hash值(Merkle根):root_hash。

    第四步:更新的时间(时间戳):time。

    第五步:全网当前难度(难度目标):difficulty

    针对难度目标需要说明:

    难度在区块中以“尾数-指数”的格式,编码并存储,这种格式称作“难度位”。这种编码的首字节表示指数,后面的3字节表示尾数(系数)。以区块277316为例,难度位的值为0x1903a30c,0x19是指数(exponent)的十六进制格式,后半部0x03a30c是系数(coefficient)。

    第六步:自己找一个随机数Nonce:这个就是反复试的部分,不断递增该数字并做哈希运算直到对应哈希值小于难度指定的taget值。

    把以上6个参数作为输入,做二次SHA256运算,形似于

    SHA256(SHA256(version , prev_hash , root_hash , time , difficulty, random))

    最终得到结果result。最后把结果result提交给系统,由系统判断这个计算结果是否有效(result<target为有效)。若判定结果为有效,你就产生了一个新的区块,并会告知全网。

    target通过difficulty可以计算得到:

    target = coefficient * 2^(8 * (exponent – 3))

    算法规定:一个新的区块的第一笔交易必须将特定数目的比特币发到某个地址,当然这个地址肯定会设成挖矿人自己的比特币地址,从而获得系统的比特币奖励。

    五.  总结

    比特币理论以密码学为支撑,构建了一个完备、安全、去中心化的数字货币体系,解决了数字资产所有权问题、双重支付问题、现实世界的通货膨胀问题甚至还预留了机制使得构建在资产转移之上的智能合同成为可能。比特币当然是伟大的创造,期待比特币有更好的未来。

    另外,本书成文过程中参考了王秒等老师翻译的《精通比特币》,李钧等老师的《比特币》以及巴比特社区的大量知识,感谢他们。

    jinse.cn 0
    好文章,需要你的鼓励
    jinse.cn 0
    好文章,需要你的鼓励
    参与评论
    0/140
    提交评论
    文章作者: / 责任编辑:

    声明:本文由入驻金色财经的作者撰写,观点仅代表作者本人,绝不代表金色财经赞同其观点或证实其描述。

    提示:投资有风险,入市须谨慎。本资讯不作为投资理财建议。

    金色财经 > 中原区块链 > 比特币背后的密码学原理 三
    • 寻求报道
    • 金色财经中国版App下载
      金色财经APP
      iOS & Android
    • 加入社群
      Telegram
    • 意见反馈
    • 返回顶部
    • 返回底部