BNC公链 | 比特币与区块链核心技术笔记(上)

[复制链接]
10779 |0
发表于 2020-4-2 17:52:45 | 显示全部楼层 |阅读模式
为了更好的理解比特币和区块链技术,最近整理了部分比特币与区块链核心技术笔记。
一:一些需要知道的术语。
  • 比特币:比特币(Bitcoin,缩写BTC)是一种总量恒定2100万的数字货币,和互联网一样具有去中心化、全球化、匿名性等特性。向地球另一端转账比特币,就像发送电子邮件一样简单,低成本,无任何限制。比特币因此被用于跨境贸易、支付、汇款等领域。
  • 比特币地址:比特币地址可以理解为你的账户身份id,或者可以比喻为银行卡号(例如:12bZrnSvmEusm3KmshobPJiNcZEkJcXGNr)由一串字符和数字组成,以阿拉伯数字“1”开头,不过这数字由密码算法产生。
  • 区块:一个区块就是若干交易数据的集合,它会被标记上时间戳和之前一个区块的独特标记。区块头经过哈希运算后会生成一份工作量证明,从而验证区块中的交易。有效的区块经过全网络的共识后会被追加到主区块链中。
  • 区块链是一串通过验证的区块,当中的每一个区块都与上一个相连,一直连到创世区块。
  • 交易确认:当一项交易被区块收录时,我们可以说它有一次确认。矿工们在此区块之后每再产生一个区块,此项交易的确认数就再加一。当确认数达到六及以上时,通常认为这笔交易比较安全并难以逆转。
  • 交易:简单地说,交易指把比特币从一个地址转到另一个地址。更准确地说,一笔“交易”指一个经过签名运算的,表达价值转移的数据结构。每一笔“交易”都经过比特币网络传输,由矿工节点收集并封包至区块中,永久保存在区块链某处。
  • 难度:整个网络会通过调整“难度”这个变量来控制生成工作量证明所需要的计算力。
  • 难度目标:使整个网络的计算力大致每10分钟产生一个区块所需要的难度数值即为难度目标。
  • 难度调整:整个网络每产生2,106个区块后会根据之前2,106个区块的算力进行难度调整。
  • 矿工费:交易的发起者通常会向网络缴纳一笔矿工费,用以处理这笔交易。大多数的交易需要0.5毫比特币的矿工费。
  • 矿工:指通过不断重复哈希运算来产生工作量证明的各网络节点。
  • 钱包:指保存比特币地址和私钥的软件,可以用它来接受、发送、储存你的比特币。、
  • 比特币网络:是一个由若干节点组成的用以广播交易信息和数据区块的P2P网络。

二、基本的介绍
什么是比特币
  • 不同于传统货币,比特币是完全虚拟的。它不但没有实体,本质上也没有一种虚拟物品代表比特币。
  • 比特币隐含在收发币的转账记录中。用户只要有证明其控制权的密钥,用密钥解锁,就可以发送比特币。
  • 这些密钥通常存储在计算机的数字钱包里。拥有密钥是使用比特币的唯一条件,这让控制权完全掌握在每个人手中。
  • 本质上,挖矿把央行的货币发行和结算功能进行分布式,用全球化的算力竞争来取代对中央发行机构的需求。
  • 比特币系统包含调节挖矿难度的协议。挖矿——在比特币网络中成功写入一个区块交易——的难度是动态调整的,保证不管有多少矿工(多少CPU)挖矿,平均每10分钟只有一个矿工成功。
  • 比特币协议还规定,每四年新币的开采量减半,同时限制比特币的最终开采总量为2,100万枚。这样,流通中的比特币数量非常接近一条曲线,并将在2140年比特币将达到2,100万枚。由于比特币的开采速度随时间递减,从长期来看,比特币是一种通货紧缩货币。此外,不能通过“印刷”新比特币来实现“通货膨胀”。
  • 比特币由这些构成:

  • 一个去中心化的点对点网络(比特币协议)
  • 一个公共的交易账簿(区块链)
  • 一个去中心化的数学的和确定性的货币发行(分布式挖矿)
  • 一个去中心化的交易验证系统(交易脚本)

比特币网络
比特币钱包-客户端
完整客户端:
  • 一个完整客户端,或称“全节点”,是存储所有比特币交易的整个交易历史(由每一个用户完成的每一笔交易,曾经所有的每一笔)的客户端,管理用户的钱包,并可以在比特币网络上直接开始交易。
  • 类似于一个独立的电子邮件服务器,因为它处理着协议的各个方面,而不依赖于任何其它的服务器或第三方服务。
  • 完整客户端目前需要大概145g端空间来存储全部区块数据。


  • 交易的输出会被创建成为一个包含这笔数额的脚本的形式,只能被引入这个脚本的一个解答后才能兑换。
  • 简单点说就是,支付方的交易输出会包含一个脚本,这个脚本说 “这个输出谁能拿出一个签名和接收方的公开地址匹配上,就支付给谁”。因为只有接收方钱包的私钥可以匹配这个地址,所以只有接收方的钱包可以提供这个签名以兑换这笔输出。因此支付方式会用需要接收方的签名来包装一个输出。
  • 假如支付方的地址上,金额是0.10比特币的输出形式,而此次交易只需要支付0.015比特币,就需要找0.085比特币的零钱。支付方的钱包将自己的金额分成了两个支付:一个给接收方,一个给自己。她可以在以后的交易里消费这笔零钱输出。
  • 最后,为了让这笔交易尽快地被网络处理,支付方的钱包会多付一小笔费用。这个不是明显地包含在交易中的,而是通过输入和输出的差值所隐含的。这个差值会就被矿工当作交易费放到区块的交易里,最终放进区块链帐薄中。
  • 支付方的钱包应用创建的交易大小为258字节,包含了金额未来所属需要的全部信息。最后的最后,这个交易必须要被传送到比特币网络中以成为分布式账簿(区块链)的一部分。

交易的传送
  • 比特币网络是由参与的比特币客户端联接几个其他比特币客户端组成的P2P网络。比特币网络的目的是将交易和区块传播给所有参与者。
  • 钱包应用可以发送新的交易给其它任意一个已联接到互联网的比特币客户端。支付方的钱包不必直接连着接收方的比特币钱包。任何比特币网络节点(其它客户端)收到一个之前没见过的有效交易时会立刻将它转发给联接到自身的其它节点。因此,这个交易迅速地从P2P网络中传播开来,几秒内就能到达大多数节点。
  • 接受者的钱包接收到支付方发过来的交易节点时,会立即确认交易是一个收入支付,因为它包含能用自己私钥兑换的输出。接收方的钱包应用也能够独立地用之前未消费输入来确认这个交易是正确构建的,并且由于包含足够交易费会被下一个区块包含进去。这时接收方就可以以一个很小的风险假定这个交易会很快被加到区块且被确认。
  • 一个对比特币交易的常见误解是它们必须要等10分钟后被确认加进一个新区块,或等60分钟以得到六次确认后才是有效的。虽然这些确认可以确保交易已被整个网络接受,但对于像一杯咖啡这样的小额商品来说就没有必要等待那么长时间了。一个商家可以免确认来接受比特币小额支付。这样做的风险不比接受一个不是用有效身份证领取或没有签名的信用卡的风险更大,而后者是现在商家常做的事情。

交易确认--挖矿
  • 挖矿在比特币系统中起着两个作用:

  • 挖矿在构建区块时会创造新的比特币,和一个中央银行印发新的纸币很类似。每个区块创造的比特币数量是固定的,随时间会渐渐减少
  • 挖矿创建信任。挖矿确保只有在包含交易的区块上贡献了足够的计算量后,这些交易才被确认。区块越多,花费的计算量越大,意味着更多的信任
  • 工作量证明算法指的用SHA256加密算法不断地对区块头和一个随机数字进行哈希计算,直到出现一个和预设值相匹配的解

  • 网络中产生的一笔交易直到成为整个比特币大账簿——区块链的一部分时才会被确认有效。
  • 平均每10分钟,矿工会将自上一个区块以来发生的所有交易生成一个新的区块。
  • 新交易不断地从用户钱包和应用流入比特币网络。当比特币网络上的节点看到这些交易时,会先将它们放到各自节点维护的一个临时的未经验证的交易池中。当矿工构建一个新区块时,会将这些交易从这个交易池中拿出来放到这个新区块中,然后通过尝试解决一个非常困难的问题(也叫工作量证明)以证明这个新区块的合法性。
  • 交易被加进新区块时,以交易费用高的优先以及其它的一些规则进行排序。
  • 矿工一旦从网络上收到一个新区块时,会意识到在这个区块上的解题竞赛已经输掉了,会马上开始下一个新区块的挖掘工作。它会立刻将一些交易和这个新区块的数字指纹放在一起开始构建下一个新区块,并开始给它计算工作量证明。
  • 每个矿工会在他的区块中包含一个特殊的交易,将新生成的比特币(当前每区块为25比特币)作为报酬支付到他自己的比特币地址。如果他找到了使得新区块有效的解法,他就会得到这笔报酬,因为这个新区块被加入到了总区块链中,他添加的这笔报酬交易也会变成可消费的。
  • 按惯例来说,一个区块获得六次以上“证明”时就被认为是不可撤销的了,因为要撤销和重建六个区块需要巨量的计算。

四、比特币客户端
  • BitCoin,比特币核心拥有交易账簿(区块链)的一份完整拷贝,里面记录了自2009年比特币网络被发明以来发生在比特币网络上的每一笔交易。
  • 带有rc后缀的是预发行版本,可以用来测试。没有后缀的稳定版本可以直接在产品环境上运行。

其他客户端
  • pycoin 是一款基于Python库,并可以支持比特币密钥的操作和交易的客户端,甚至可以支持编译语言从而处理非标准交易。
  • btcd是一款基于Go语言的全节点比特币工具。目前,它通过使用精准的规则(包括bugs),下载、验证和服务区块链。它同时依靠新发掘出来的区块来维持交易池,同时依赖没有形成区块的单独交易。在缜密的规则以及检查下,确保了每笔独立交易的安全,并且可以过滤基于矿工需求的交易。btcd与bitcoind的一个主要区别是btcd不包含比特币钱包的功能,其实这是一个精心的设计。这意味着你不能直接通过btcd进行比特币交易。然而这项功能可以由正在研发的btcwallet与btcgui两个项目提供。另一个显著的区别是btcd同时支持HTTP POST(比如bitcoind)与推荐使用的Websockets两种通信协议的请求。并且btcd的RPC连接默认设置为TLS-开启。
  • bitcoinj 一款全节点java客户端和程序库。

五、算法与秘钥、地址、钱包
在比特币交易的支付环节,收件人的公钥是通过其数字指纹表示的,称为比特币地址,就像支票上的支付对象的名字(即“收款方”)。一般情况下,比特币地址由一个公钥生成并对应于这个公钥。然而,并非所有比特币地址都是公钥;他们也可以代表其他支付对象,譬如脚本。这样一来,比特币地址把收款方抽象起来了。
椭圆曲线算法:私钥和公钥
比特币或者大部分区块链的核心系统是基于椭圆曲线算法(Elliptic-curve cryptography
)建立起来的,ECC 是一种公开密钥密码学,又称为非对称密码学。在这种密码学中,需要产生一对密钥。其中一个密钥称为私钥,需要保密;另一个密钥称为公钥,是可以公开让别人知道的。私钥和公钥在数学上的关系是不可逆的,也就是通过某个数学函数,我们可以从私钥计算出公钥,但是不能从公钥反向推导出私钥(或者说从计算上是不可行的)。有关此算法的相关可以参考:http://diamond.boisestate.edu/~liljanab/MATH308/GuideToECC.pdf,简单来说就是
  • 一个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公钥。私钥(k)是一个数字,通常是随机选出的。有了私钥,我们就可以使用<font color="red">椭圆曲线乘法</font>这个单向加密函数产生一个公钥(K)。
  • 有了公钥(K),我们就可以使用一个单向加密哈希函数生成比特币地址(A)
  • 在比特币交易中,私钥用于生成支付比特币所必需的签名以证明资金的所有权。
  • 私钥必须始终保持机密,因为一旦被泄露给第三方,相当于该私钥保护之下的比特币也拱手相让了。
  • 私钥还必须进行备份,以防意外丢失,因为私钥一旦丢失就难以复原,其所保护的比特币也将永远丢失。
  • 私钥一般是256 bit
  • 比特币软件使用操作系统底层的随机数生成器来产生256位的熵(随机性)。通常情况下,操作系统随机数生成器由人工的随机源进行初始化,也可能需要通过几秒钟内不停晃动鼠标等方式进行初始化。
  • 私钥可以是1和n-1之间的任何数字,其中n是一个常数(n=1.158 * 1077,略小于2256),并由比特币所使用的椭圆曲线的阶所定义(见4.1.5 椭圆曲线密码学解释)。要生成这样的一个私钥,我们随机选择一个256位的数字,并检查它是否小于n-1。从编程的角度来看,一般是通过在一个密码学安全的随机源中取出一长串随机字节,对其使用SHA256哈希算法进行运算,这样就可以方便地产生一个256位的数字。如果运算结果小于n-1,我们就有了一个合适的私钥。否则,我们就用另一个随机数再重复一次。
  • 一定不要使用自己写的代码或使用编程语言内建的简易随机数生成器来获得一个随机数。我们建议读者使用密码学安全的伪随机数生成器(CSPRNG),并且需要有一个来自具有足够熵值的源的种子。使用随机数发生器的程序库时,需仔细研读其文档,以确保它是加密安全的。对CSPRNG的正确实现是密钥安全性的关键所在。
  • dumpprivkey命令会把私钥以Base58校验和编码格式显示,这种私钥格式被称为钱包导入格式(WIF,Wallet Import Format)
  • sx newkey -> 生成并显示私钥
  • 比特币地址A = RIPEMD160(SHA256( public key ))
  • 通常用户见到的比特币地址是经过“Base58Check”编码的,这种编码使用了58个字符(一种Base58数字系统)和校验码,提高了可读性、避免歧义并有效防止了在地址转录和输入中产生的错误。Base58Check编码也被用于比特币的其它地方,例如比特币地址、私钥、加密的密钥和脚本哈希中,用来提高可读性和录入的正确性。
  • 最全面的比特币Python库是 Vitalik Buterin写的pybitcointools

比特币钱包
  • 钱包是私钥的容器,通常通过有序文件或者简单的数据库实现。另外一种制作私钥的途径是 确定性密钥生成。在这里你可以用原先的私钥,通过单向哈希函数来生成每一个新的私钥,并将新生成的密钥按顺序连接。只要你可以重新创建这个序列,你只需要第一个私钥(称作种子、主私钥)来生成它们。

非确定性(随机)钱包
  • 在最早的一批比特币客户端中,钱包只是随机生成的私钥集合。这种类型的钱包被称作零型非确定钱包。
  • 举个例子,比特币核心客户端预先生成100个随机私钥,从最开始就生成足够多的私钥并且每把钥匙只使用一次。这种类型的钱包有一个昵称“Just a Bunch Of Keys(一堆私钥)”简称JBOK。
  • 这种钱包现在正在被确定性钱


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表