区块链和比特币

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

区块链技术知识分享2018年6月9日Agenda•区块链和比特币•以太坊(Ethereum)及智能合约介绍•超级账本(Hyperledger)项目和fabric区块链和比特币•概述•起源•BTC诞生•BTC交易原理•UXTO•区块•脚本•地址生成•MerkelTree•工作量证明•最长链规则•挖矿•分叉•扩展性•安全性•发展方向区块链和比特币(1)-概述•去中心化的账本,一种使用密码学的方法相关联产生的数据块•匿名性+专属所有权•难以篡改•具有自治的能力区块链和比特币(2)-起源•1976年,BaileyW.Diffie和MartinE.Hellman《密码学的新方向》发表(公钥加密理论),次年RSA算法诞生•1980年,MerkleRalf提出Merkle-Tree数据结构和算法(区块中交易校验的手段)•1982年,LeslieLamport等人提出拜占庭将军问题(共识的基础)•1985年,椭圆曲线加密(ECC)算法诞生(加密的基础)•1990年,DavidChaum创立DigitalCash,第一种中心化不可追踪的加密数字现金系统•1992年,ScottVanstone等人提出椭圆曲线加密数字签名算法(ECDSA)•1997年,AdamBack发明Hashcash技术,为一种工作量证明算法(ProofofWork,POW),此算法依赖哈希函数的不可逆特性,达到容易被验证,但很难被破解的特性•1998年,戴伟发布匿名分布式电子现金系统B-money,NickSzabo提出去中心化货币BitGold的理论•2005年,HalFinney提出可重复使用的工作量证明机制(RPOW),结合B-money与AdamBack提出的Hashcash算法进行数字货币试验区块链和比特币(3)-BTC诞生•2008年11月1日,一个署名中本聪(SatoshiNakamoto)的人在一个小型密码学讨论组中发表了论文《比特币:一种点对点的电子现金系统》•2009年1月3日,中本聪在位于芬兰赫尔辛基的一个小型服务器上挖出了第一笔50个比特币(创世区块)区块链和比特币(4)-BTC交易原理区块链和比特币(5)-UTXO•和传统accountbased支付系统不同,比特币系统中使用区块来记录交易往来,本质为一种UXTO(UnspentTransactionOutput)方案、•区块账本记录的是交易(日志),而不是货币;每一笔交易都要消耗(spend)N笔输入,产生N笔输出;但输入总量和输出总量需要保持相等区块链和比特币(6)-区块•完整的区块结构名称字节字段说明MagicNO4魔数表征网络协议,0xD9B4BEF9表示主网,0xDAB5BFFA表示testnetBlocksize4区块大小用字节表示的该字段之后的区块大小Blockheader80区块头组成区块头的几个字段Transactioncounter1-9交易计数器该区块包含的交易数量,包含coinbase交易Transactions不定交易记录在区块里的交易信息,使用原生的交易信息格式,并且交易在数据流中的位置必须与Merkle树的叶子节点顺序一致•区块头(Blockheader)结构名称字节数据类型描述Version4int32_t版本号表示所遵循的规则PreBlockHeaderHash32char[32]SHA256(SHA256())前一块头部的哈希MerkleRootHash32char[32]这块中所有交易的哈希Time4uint32_tUnix时间戳Bits4uint32_t难度系数Nonce4uint32_t随机数区块链和比特币(7)-区块•Transactions结构•Input结构名称字节数据类型描述Version4int32_t交易版本InputsCounter1-9可变integer输入单数量InputsDetail-array输入单列表OutputsCounter1-9可变integer输出单数量OutputsDetail-array输出单列表LockTime4uint32_t锁定时间名称字节数据类型描述Previoustxhash32char[32]引用前一交易的hashPreviousOutputIndex4uint32_t被引用交易的Output的索引InputScriptLength1-9可变integer输入单列表InputScript/scriptSig--输入脚本SequenceNumber4uint32_t•Output结构名称字节数据类型描述Amount/Value8uint32_t比特币数量InputScriptLength1-9uint32_t输出脚本长度OutputScript/scriptPubKey--输出脚本区块链和比特币(8)-脚本Hash:9c50cee8d50e273100987bb12ec46208cb04a1d5b68c9bea84fd4a04854b5eb1输入交易:前导输入的Hash:437b95ae15f87c7a8ab4f51db5d3c877b972ef92f26fbc6d3c4663d1bc750149输入脚本scriptSig:3045022100efe12e2584bbd346bccfe67fd50a54191e4f45f945e3853658284358d9c062ad02200121e00b6297c0874650d00b786971f5b4601e32b3f81afa9f9f8108e93c752201038b29d4fbbd12619d45c84c83cb4330337ab1b1a3737250f29cec679d7551148a输出交易:转账值:0.05010000btc输出脚本scriptPubKey:OP_DUPOP_HASH160be10f0a78f5ac63e8746f7f2e62a5663eed05788OP_EQUALVERIFYOP_CHECKSIG区块链和比特币(9)-脚本•P2PKH例子交易b中有一个『输入交易』引用了交易a的『输出交易』,它们的脚本是一对题与解:题:交易a的『输出脚本』,若干个脚本指令和转账接收方的『公钥哈希』OP_DUPOP_HASH160be10f0a78f5ac63e8746f7f2e62a5663eed05788OP_EQUALVERIFYOP_CHECKSIG解:交易b的『输入脚本』,包含两个元素,交易发起方的『签名』和『公钥』(sig&pubkey)3046022100ba1427639c9f67f2ca1088d0140318a98cb1e84f604dc90ae00ed7a5f9c61cab02210094233d018f2f014a5864c9e0795f13735780cafd51b950f503534a6af246aca30103a63ab88e75116b313c6de384496328df2656156b8ac48c75505cd20a4890f5ab+区块链和比特币(10)-地址生成•BTC地址生成过程ECDSAPublicKeyRIPE160MD(SHA256(PublicKey))PublicKeyHashRIPE160MD(SHA256(version+PublicKeyhash))CheckSumVersionBase58EncodeBitCoinAddress区块链和比特币(11)-MerkelTree区块链和比特币(12)-工作量证明•区块的Hash=SHA256(SHA256(区块头内容))•一段时间内(平均10分钟左右,具体时间会与记账难度相互影响),只有1个节点可以记账成功•通过不断计算寻找合适的区块HASH使之小于给定的目标HASH(目标HASH值的压缩格式是一个特殊的浮点编码类型,首字节是指数(仅使用了5个最低位)表示右移的位数,后3个字节是有效值,该目标HASH能表示256位的数值),通过竞争获得唯一记账权•记账被证实后,其余节点复制记账结果•每产生2016个区块之后,会根据实际产生的区块和目标区块数做对比,进行难度调整区块链和比特币(13)-工作量证明区块链和比特币(14)-工作量证明•难度计算公式:difficulty=difficulty_1_target/current_target,目标(target)是一个256位长的数值。有许多不同测量难度的方法,得到的difficulty_1_target可能不同。传统地,它表示一个HASH值,前32位为0,后续部分为1(称之为:矿池难度或pdiff),比特币协议把目标HASH表示成一个固定精度的自定义浮点类型,因而,比特币客户端用该值来估计难度(称之为:bdiff)。难度经常被存贮在区块中,每个块存贮一个十六制的目标HASH的压缩表达式(称之为:Bits),目标HASH可以以预先定义的公式计算出来。例如:如果区块中压缩的目标HASH为0x1b0404cb,那十六进制的目标HASH如下所示此时的难度值为区块链和比特币(15)-最长链规则•累计了最多难度的区块链,也是包含最多区块的那个链称为主链,每一个节点总是选择试图延长主链•当有两名矿工在几乎在相同的时间内,各自都算得了POW解,便立即传播自己的“获胜”区块到网络中,一些节点首先收到#3458A,一些节点首先收到#3458B,这两个候选区块(通常这两个候选区块会包含几乎相同的交易)都是主链的延伸,分叉就会产生,这时分叉出有竞争关系的两条链,如图:•收到#3458A和#3458B的节点,各自开始进行计算POW解,总会有一方抢先发现,比如收到#3458B的节点,成功打包形成了#3459区块,并向全网广播后,网络中的节点会把#3458B#3459B的链作为最长链。BTC规定,交易被成功打包之后,还需要6个以上的区块延伸,才算成功(确认为主链)区块链和比特币(16)-挖矿•SETGENERATE协议:CPU时代挖矿时代的协议。构造区块,初始化区块头各个字段,计算Hash并验证区块,不合格则nNonce自增,再计算并验证,如此往复。在CPU挖矿时代,nNonce提供的4字节搜索空间完全够用(4字节即4G种可能,单核CPU运算SHA256D算力一般是2M左右),一般情况nNonce只遍历完2个字节就返回去重构块。区块链和比特币(17)-挖矿•Getwork协议代表了GPU挖矿时代,需求主要源于挖矿程序与节点客户端分离,区块链数据与挖矿部件分离。使用客户端节点直接挖矿,需要同步完整区块链,数据和程序紧密结合,也就是说,如果有多台电脑进行挖矿,需要每台电脑都单独同步一份区块链数据。这其实没有必要,对于矿工来说,最少只需要一个完整节点就可以。区块链和比特币(18)-挖矿•Getblocktemplate协议让矿工自行构造区块。如此一来,节点和挖矿完全分离。对于getwork来说,区块链是黑暗的,getwork对区块链一无所知,其只知道修改data字段的4个字节。对于getblocktemplate来说,整个区块链是透明的,getblocktemplate掌握区块链上与挖矿有关的所有信息,包括待确认交易池。•矿池通过getblocktemplate协议与网络节点交互,以获得区块链的最新信息,通过stratum协议与矿工交互。此外,为了让之前用getwork协议挖矿的软件也可以连接到矿池挖矿,矿池一般也支持getwork协议,通过阶层挖矿代理机制实现(Stratumminingproxy)。stratum与矿池采用TCP方式通信,数据使用JSON封装格式。区块链和比特币(19)-分叉•硬分叉如果区块链软件的共识规则被改变,并且这种规则改变无法向前兼容,旧节点无法认可新节点产生的区块,即为硬分叉。这时候旧节点会拒绝新规则的区块,于是新节点和旧节点会开始在不同的区块链上运行(挖矿、交易、验证等)•软分叉如果区块链的共识规则改变后,这种改变是向前兼容的,旧节点可以兼容新节点产生的区块,即为软分叉。软分叉通常刚开始并不会产生两条区

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功