LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 行情分析 > BNC公链|比特币与区块链核心技术笔记(上)

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

2020-02-26 霹雳财经 来源:区块链网络

为了更好的理解比特币和区块链技术,最近整理了部分比特币与区块链核心技术笔记。

一:一些需要知道的术语。

比特币:比特币(Bitcoin,缩写BTC)是一种总量恒定2100万的数字货币,和互联网一样具有去中心化、全球化、匿名性等特性。向地球另一端转账比特币,就像发送电子邮件一样简单,低成本,无任何限制。比特币因此被用于跨境贸易、支付、汇款等领域。

比特币地址:比特币地址可以理解为你的账户身份id,或者可以比喻为银行卡号(例如:12bZrnSvmEusm3KmshobPJiNcZEkJcXGNr)由一串字符和数字组成,以阿拉伯数字“1”开头,不过这数字由密码算法产生。

区块:一个区块就是若干交易数据的集合,它会被标记上时间戳和之前一个区块的独特标记。区块头经过哈希运算后会生成一份工作量证明,从而验证区块中的交易。有效的区块经过全网络的共识后会被追加到主区块链中。

区块链是一串通过验证的区块,当中的每一个区块都与上一个相连,一直连到创世区块。

交易确认:当一项交易被区块收录时,我们可以说它有一次确认。矿工们在此区块之后每再产生一个区块,此项交易的确认数就再加一。当确认数达到六及以上时,通常认为这笔交易比较安全并难以逆转。

交易:简单地说,交易指把比特币从一个地址转到另一个地址。更准确地说,一笔“交易”指一个经过签名运算的,表达价值转移的数据结构。每一笔“交易”都经过比特币网络传输,由矿工节点收集并封包至区块中,永久保存在区块链某处。

难度:整个网络会通过调整“难度”这个变量来控制生成工作量证明所需要的计算力。

难度目标:使整个网络的计算力大致每10分钟产生一个区块所需要的难度数值即为难度目标。

难度调整:整个网络每产生2,106个区块后会根据之前2,106个区块的算力进行难度调整。

矿工费:交易的发起者通常会向网络缴纳一笔矿工费,用以处理这笔交易。大多数的交易需要0.5毫比特币的矿工费。

矿工:指通过不断重复哈希运算来产生工作量证明的各网络节点。

钱包:指保存比特币地址和私钥的软件,可以用它来接受、发送、储存你的比特币。、

比特币网络:是一个由若干节点组成的用以广播交易信息和数据区块的P2P网络。

二、基本的介绍

什么是比特币

不同于传统货币,比特币是完全虚拟的。它不但没有实体,本质上也没有一种虚拟物品代表比特币。

比特币隐含在收发币的转账记录中。用户只要有证明其控制权的密钥,用密钥解锁,就可以发送比特币。

这些密钥通常存储在计算机的数字钱包里。拥有密钥是使用比特币的唯一条件,这让控制权完全掌握在每个人手中。

本质上,挖矿把央行的货币发行和结算功能进行分布式,用全球化的算力竞争来取代对中央发行机构的需求。

比特币系统包含调节挖矿难度的协议。挖矿——在比特币网络中成功写入一个区块交易——的难度是动态调整的,保证不管有多少矿工(多少CPU)挖矿,平均每10分钟只有一个矿工成功。

比特币协议还规定,每四年新币的开采量减半,同时限制比特币的最终开采总量为2,100万枚。这样,流通中的比特币数量非常接近一条曲线,并将在2140年比特币将达到2,100万枚。由于比特币的开采速度随时间递减,从长期来看,比特币是一种通货紧缩货币。此外,不能通过“印刷”新比特币来实现“通货膨胀”。

比特币由这些构成:

一个去中心化的点对点网络(比特币协议)

一个公共的交易账簿(区块链)

一个去中心化的数学的和确定性的货币发行(分布式挖矿)

一个去中心化的交易验证系统(交易脚本)

比特币网络

比特币钱包-客户端

完整客户端:

一个完整客户端,或称“全节点”,是存储所有比特币交易的整个交易历史(由每一个用户完成的每一笔交易,曾经所有的每一笔)的客户端,管理用户的钱包,并可以在比特币网络上直接开始交易。

类似于一个独立的电子邮件服务器,因为它处理着协议的各个方面,而不依赖于任何其它的服务器或第三方服务。

完整客户端目前需要大概145g端空间来存储全部区块数据。

来源:https://bitcoin.org/en/download

轻量级客户端

一个轻量级客户端存储用户的钱包,但需要依赖第三方服务器才能进行比特币交易,才能接入比特币网络。

轻量级客户端不保存所有交易的完整副本,因此必须信赖第三方的服务器来获取交易确认。

这就类似于一个独立的电子邮件客户端,能够通过邮箱服务器来访问一个邮箱,因为它在网络交流中依赖于一个第三方服务器。

在线客户端

在线客户端通过网页浏览器在第三方服务器上访问和储存该用户的钱包。

这类似于在线邮件,因为它完全依赖于第三方服务器。

移动客户端

智能手机的移动客户端,例如基于Android系统,既可以作完整客户端运行,也可作为轻量级客户端或在线客户端。

一些移动客户端是与在线客户端或桌面客户端同步的,提供跨多个设备但有一个共同的资金源的多平台钱包。

比特币客户端的选择,取决于用户想要管理资金的数目。一个完整的客户端将为用户提供最高级的管理和独立性。这样钱包的备份和安全责任就转移到了用户身上。另一种选择是在线客户端,其设置和使用是最简单的,但在线客户端的取舍还在于需衡量第三方介入的风险,因为安全性和控制权是由用户和网页服务商所共同承担的。如果一个在线钱包服务遭受了损失,就像已发生过的那样,用户们可能会失去所有的资金。反过来看,如果用户的一个完整客户端没有进行适当的备份,他们可能会因为电脑的操作失误而丢失他们的资金。

三、比特币基本原理

概述

从千分之一比特币(1毫比特币)到一亿分之一比特币(1聪比特币),比特币网络可以处理任意小额交易。在本书中,我们将用“比特币”这个术语来表示任意数量的比特币货币,从最小单元(1聪)到可被挖出的所有比特币总数(21,000,000)。

交易包含了每一笔被转移的比特币(输入)的所有权证明,它以所有者的数字签名形式存在,并可以被任何人独立验证。

在比特币术语中,“消费”指的是签署一笔交易:转移一笔以前交易的比特币给以比特币地址所标识的新所有者。

比特币交易

交易告知全网:比特币的持有者已授权把比特币转帐给其他人。而新持有者能够再次授权,转移给该比特币所有权链中的其他人,产生另一笔交易来花掉这些比特币,后面的持有者在花费比特币也是用类似的方式。

交易形式

最常见的交易形式是从一个地址到另一个地址的简单支付,这种交易也常常包含给支付者的“找零”

另一种常见的交易形式是集合多个输入到一个输出的模式。这相当于现实生活中将很多硬币和纸币零钱兑换为一个大额面钞。像这样的交易有时由钱包应用产生来清理许多在支付过程收到的小数额的找零。

最后一种在比特币账簿中常见的交易形式是将一个输入分配给多个输出,即多个接收者(如图2-7)的交易。这类交易有时被商业实体用作分配资金,例如给多个雇员发工资的情形。

交易的构建。比特币交易建立和签名时不用连接比特币网络。只有在执行交易时才需要将交易发送到网络。

完整客户端占太大的硬盘空间,所以大多数钱包使用轻量级的客户端,只保存用户自己的未消费输出。如果钱包客户端没有某一未消费交易输出,它可以通过不同的服务者提供的各种API或完整索引节点的JSON PRC API从比特币网络中拿到这一交易信息。

curl?'https://blockchain.info/unspent?active=1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK'

返回: { ????"unspent_outputs":[

{ ????????????"tx_hash":"f2c245c38672a5d8fba5a5caa44dcef277a52e916a0603272f91286f2b052706", ????????????"tx_hash_big_endian":"0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2", ????????????"tx_index":47854970, ????????????"tx_output_n":?1, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?8450000, ????????????"value_hex":?"0080efd0", ????????????"confirmations":217419 ????????},

{ ????????????"tx_hash":"0365fdc169b964ea5ad3219e12747e9478418fdc8abed2f5fe6d0205c96def29", ????????????"tx_hash_big_endian":"29ef6dc905026dfef5d2be8adc8f4178947e74129e21d35aea64b969c1fd6503", ????????????"tx_index":71083209, ????????????"tx_output_n":?0, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?100000, ????????????"value_hex":?"0186a0", ????????????"confirmations":161802 ????????},

{ ????????????"tx_hash":"d9717f774daab8d3dd470853204394c82e3c01097479575d6d2ee97d7b3bdfa1", ????????????"tx_hash_big_endian":"a1df3b7b7de92e6d5d57797409013c2ec8944320530847ddd3b8aa4d777f71d9", ????????????"tx_index":75974855, ????????????"tx_output_n":?0, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?1000000, ????????????"value_hex":?"0f4240", ????????????"confirmations":153961 ????????},

{ ????????????"tx_hash":"3f1df69df90d097981ca9c97ad8b6a32daed345565a433f8c8e472b2dab2ac79", ????????????"tx_hash_big_endian":"79acb2dab272e4c8f833a4655534edda326a8bad979cca8179090df99df61d3f", ????????????"tx_index":79887883, ????????????"tx_output_n":?1, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?719787, ????????????"value_hex":?"0afbab", ????????????"confirmations":148074 ????????},

{ ????????????"tx_hash":"417bdb6f5db3e830407f94d1a82d1667e738b19da3679b7263ebfb913394efdd", ????????????"tx_hash_big_endian":"ddef943391fbeb63729b67a39db138e767162da8d1947f4030e8b35d6fdb7b41", ????????????"tx_index":170905487, ????????????"tx_output_n":?0, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?10000, ????????????"value_hex":?"2710", ????????????"confirmations":67883 ????????},

{ ????????????"tx_hash":"d049d6039f9d1cb2625bac294d7465b4b1077bd5bc0e30e01e02b184db524c1f", ????????????"tx_hash_big_endian":"1f4c52db84b1021ee0300ebcd57b07b1b465744d29ac5b62b21c9d9f03d649d0", ????????????"tx_index":174630347, ????????????"tx_output_n":?0, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?11100, ????????????"value_hex":?"2b5c", ????????????"confirmations":65345 ????????},

{ ????????????"tx_hash":"b8a6470c7a38d0983effed00a3f75c74ba371da1387352f35d1df155851ea8d1", ????????????"tx_hash_big_endian":"d1a81e8555f11d5df3527338a11d37ba745cf7a300edff3e98d0387a0c47a6b8", ????????????"tx_index":175949432, ????????????"tx_output_n":?0, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?10000, ????????????"value_hex":?"2710", ????????????"confirmations":64439 ????????},

{ ????????????"tx_hash":"a2b9570e26e3991fc999c42dc8c6eea7b06514b61814da1a71b56c6ba2ae651c", ????????????"tx_hash_big_endian":"1c65aea26b6cb5711ada1418b61465b0a7eec6c82dc499c91f99e3260e57b9a2", ????????????"tx_index":175955161, ????????????"tx_output_n":?0, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?10000, ????????????"value_hex":?"2710", ????????????"confirmations":64430 ????????},

{ ????????????"tx_hash":"05230cb8cd8c6a3788ed41433dfdd68a1a608cc8feb3bc1c29d97ce84bec070e", ????????????"tx_hash_big_endian":"0e07ec4be87cd9291cbcb3fec88c601a8ad6fd3d4341ed88376a8ccdb80c2305", ????????????"tx_index":175955664, ????????????"tx_output_n":?0, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?10000, ????????????"value_hex":?"2710", ????????????"confirmations":64430 ????????}

] }curl?'https://blockchain.info/unspent?active=1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK'

返回: { ????"unspent_outputscurl?'https://blockchain.info/unspent?active=1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK'

返回: { ????"unspent_outputs":[

{ ????????????"tx_hash":"f2c245c38672a5d8fba5a5caa44dcef277a52e916a0603272f91286f2b052706", ????????????"tx_hash_big_endian":"0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2", ????????????"tx_index":47854970, ????????????"tx_output_n":?1, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?8450000, ????????????"value_hex":?"0080efd0", ????????????"confirmations":217419 ????????},

{ ????????????"tx_hash":"0365fdc169b964ea5ad3219e12747e9478418fdc8abed2f5fe6d0205c96def29", ????????????"tx_hash_big_endian":"29ef6dc905026dfef5d2be8adc8f4178947e74129e21d35aea64b969c1fd6503", ????????????"tx_index":71083209, ????????????"tx_output_n":?0, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?100000, ????????????"value_hex":?"0186a0", ????????????"confirmations":161802 ????????},

{ ????????????"tx_hash":"d9717f774daab8d3dd470853204394c82e3c01097479575d6d2ee97d7b3bdfa1", ????????????"tx_hash_big_endian":"a1df3b7b7de92e6d5d57797409013c2ec8944320530847ddd3b8aa4d777f71d9", ????????????"tx_index":75974855, ????????????"tx_output_n":?0, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?1000000, ????????????"value_hex":?"0f4240", ????????????"confirmations":153961 ????????},

{ ????????????"tx_hash":"3f1df69df90d097981ca9c97ad8b6a32daed345565a433f8c8e472b2dab2ac79", ????????????"tx_hash_big_endian":"79acb2dab272e4c8f833a4655534edda326a8bad979cca8179090df99df61d3f", ????????????"tx_index":79887883, ????????????"tx_output_n":?1, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?719787, ????????????"value_hex":?"0afbab", ????????????"confirmations":148074 ????????},

{ ????????????"tx_hash":"417bdb6f5db3e830407f94d1a82d1667e738b19da3679b7263ebfb913394efdd", ????????????"tx_hash_big_endian":"ddef943391fbeb63729b67a39db138e767162da8d1947f4030e8b35d6fdb7b41", ????????????"tx_index":170905487, ????????????"tx_output_n":?0, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?10000, ????????????"value_hex":?"2710", ????????????"confirmations":67883 ????????},

{ ????????????"tx_hash":"d049d6039f9d1cb2625bac294d7465b4b1077bd5bc0e30e01e02b184db524c1f", ????????????"tx_hash_big_endian":"1f4c52db84b1021ee0300ebcd57b07b1b465744d29ac5b62b21c9d9f03d649d0", ????????????"tx_index":174630347, ????????????"tx_output_n":?0, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?11100, ????????????"value_hex":?"2b5c", ????????????"confirmations":65345 ????????},

{ ????????????"tx_hash":"b8a6470c7a38d0983effed00a3f75c74ba371da1387352f35d1df155851ea8d1", ????????????"tx_hash_big_endian":"d1a81e8555f11d5df3527338a11d37ba745cf7a300edff3e98d0387a0c47a6b8", ????????????"tx_index":175949432, ????????????"tx_output_n":?0, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?10000, ????????????"value_hex":?"2710", ????????????"confirmations":64439 ????????},

{ ????????????"tx_hash":"a2b9570e26e3991fc999c42dc8c6eea7b06514b61814da1a71b56c6ba2ae651c", ????????????"tx_hash_big_endian":"1c65aea26b6cb5711ada1418b61465b0a7eec6c82dc499c91f99e3260e57b9a2", ????????????"tx_index":175955161, ????????????"tx_output_n":?0, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?10000, ????????????"value_hex":?"2710", ????????????"confirmations":64430 ????????},

{ ????????????"tx_hash":"05230cb8cd8c6a3788ed41433dfdd68a1a608cc8feb3bc1c29d97ce84bec070e", ????????????"tx_hash_big_endian":"0e07ec4be87cd9291cbcb3fec88c601a8ad6fd3d4341ed88376a8ccdb80c2305", ????????????"tx_index":175955664, ????????????"tx_output_n":?0, ????????????"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", ????????????"value":?10000, ????????????"value_hex":?"2710", ????????????"confirmations":64430 ????????}

] }

创建交易输出

交易的输出会被创建成为一个包含这笔数额的脚本的形式,只能被引入这个脚本的一个解答后才能兑换。

简单点说就是,支付方的交易输出会包含一个脚本,这个脚本说 “这个输出谁能拿出一个签名和接收方的公开地址匹配上,就支付给谁”。因为只有接收方钱包的私钥可以匹配这个地址,所以只有接收方的钱包可以提供这个签名以兑换这笔输出。因此支付方式会用需要接收方的签名来包装一个输出。

假如支付方的地址上,金额是0.10比特币的输出形式,而此次交易只需要支付0.015比特币,就需要找0.085比特币的零钱。支付方的钱包将自己的金额分成了两个支付:一个给接收方,一个给自己。她可以在以后的交易里消费这笔零钱输出。

最后,为了让这笔交易尽快地被网络处理,支付方的钱包会多付一小笔费用。这个不是明显地包含在交易中的,而是通过输入和输出的差值所隐含的。这个差值会就被矿工当作交易费放到区块的交易里,最终放进区块链帐薄中。

支付方的钱包应用创建的交易大小为258字节,包含了金额未来所属需要的全部信息。最后的最后,这个交易必须要被传送到比特币网络中以成为分布式账簿(区块链)的一部分。

交易的传送

比特币网络是由参与的比特币客户端联接几个其他比特币客户端组成的P2P网络。比特币网络的目的是将交易和区块传播给所有参与者。

钱包应用可以发送新的交易给其它任意一个已联接到互联网的比特币客户端。支付方的钱包不必直接连着接收方的比特币钱包。任何比特币网络节点(其它客户端)收到一个之前没见过的有效交易时会立刻将它转发给联接到自身的其它节点。因此,这个交易迅速地从P2P网络中传播开来,几秒内就能到达大多数节点。

接受者的钱包接收到支付方发过来的交易节点时,会立即确认交易是一个收入支付,因为它包含能用自己私钥兑换的输出。接收方的钱包应用也能够独立地用之前未消费输入来确认这个交易是正确构建的,并且由于包含足够交易费会被下一个区块包含进去。这时接收方就可以以一个很小的风险假定这个交易会很快被加到区块且被确认。

一个对比特币交易的常见误解是它们必须要等10分钟后被确认加进一个新区块,或等60分钟以得到六次确认后才是有效的。虽然这些确认可以确保交易已被整个网络接受,但对于像一杯咖啡这样的小额商品来说就没有必要等待那么长时间了。一个商家可以免确认来接受比特币小额支付。这样做的风险不比接受一个不是用有效身份证领取或没有签名的信用卡的风险更大,而后者是现在商家常做的事情。

交易确认--挖矿

挖矿在比特币系统中起着两个作用:

挖矿在构建区块时会创造新的比特币,和一个中央银行印发新的纸币很类似。每个区块创造的比特币数量是固定的,随时间会渐渐减少

挖矿创建信任。挖矿确保只有在包含交易的区块上贡献了足够的计算量后,这些交易才被确认。区块越多,花费的计算量越大,意味着更多的信任

工作量证明算法指的用SHA256加密算法不断地对区块头和一个随机数字进行哈希计算,直到出现一个和预设值相匹配的解

网络中产生的一笔交易直到成为整个比特币大账簿——区块链的一部分时才会被确认有效。

平均每10分钟,矿工会将自上一个区块以来发生的所有交易生成一个新的区块。

新交易不断地从用户钱包和应用流入比特币网络。当比特币网络上的节点看到这些交易时,会先将它们放到各自节点维护的一个临时的未经验证的交易池中。当矿工构建一个新区块时,会将这些交易从这个交易池中拿出来放到这个新区块中,然后通过尝试解决一个非常困难的问题(也叫工作量证明)以证明这个新区块的合法性。

交易被加进新区块时,以交易费用高的优先以及其它的一些规则进行排序。

矿工一旦从网络上收到一个新区块时,会意识到在这个区块上的解题竞赛已经输掉了,会马上开始下一个新区块的挖掘工作。它会立刻将一些交易和这个新区块的数字指纹放在一起开始构建下一个新区块,并开始给它计算工作量证明。

每个矿工会在他的区块中包含一个特殊的交易,将新生成的比特币(当前每区块为25比特币)作为报酬支付到他自己的比特币地址。如果他找到了使得新区块有效的解法,他就会得到这笔报酬,因为这个新区块被加入到了总区块链中,他添加的这笔报酬交易也会变成可消费的。

按惯例来说,一个区块获得六次以上“证明”时就被认为是不可撤销的了,因为要撤销和重建六个区块需要巨量的计算。

四、比特币客户端

BitCoin,比特币核心拥有交易账簿(区块链)的一份完整拷贝,里面记录了自2009年比特币网络被发明以来发生在比特币网络上的每一笔交易。

bitcoin源码地址:https://github.com/bitcoin/bitcoin

带有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。

这种钱包现在正在被确定性钱包替换,因为它们难以管理、备份以及导入。

随机钥匙的缺点就是如果你生成很多,你必须保存它们所有的副本。这就意味着这个钱包必须被经常性地备份。每一把钥匙都必须备份,否则一旦钱包不可访问时,钱包所控制的资金就付之东流。

这种情况直接与避免地址重复使用的原则相冲突——每个比特币地址只能用一次交易。地址通过关联多重交易和对方的地址重复使用会减少隐私。

确定性(种子)钱包

确定性,或者“种子”钱包包含通过使用单项离散方程而可从公共的种子生成的私钥。

种子是随机生成的数字。这个数字也含有比如索引号码或者可生成私钥的“链码”

在确定性钱包中,种子足够收回所有的已经产生的私钥,所以只用在初始创建时的一个简单备份就足以搞定。

种子也足够让钱包输入或者输出。这就很容易允许使用者的私钥在钱包之间轻松转移输入。

助记码词汇

助记码词汇是英文单词序列代表(编码)用作种子对应所确定性钱包的随机数。单词的序列足以重新创建种子,并且从种子那里重新创造钱包以及所有私钥。

助记码代码可以让使用者复制钱包更容易一些,因为它们相比较随机数字顺序来说,可以很容易地被读出来并且正确抄写

BIP0039定义助记码和种子的创建过程如下:

1.创造一个128到256位的随机顺序(熵)

2.提出SHA256哈希前几位,就可以创造一个随机序列的校验和

3.把校验和加在随机顺序的后面

4.把顺序分解成11位的不同集合,并用这些集合去和一个预先已经定义的2048个单词字典做对应

5.生成一个12至24个词的助记码

分层确定性钱包

分层确定性钱包包含从数结构所生成的钥匙。这种母钥匙可以生成子钥匙的序列。这些子钥匙又可以衍生出孙钥匙,以此无穷类推。

高级密钥和地址

加密私钥(BIP0038)

私钥必须保密

BIP0038提出了一个通用标准,使用一个口令加密私钥并使用Base58Check对加密的私钥进行编码,这样加密的私钥就可以安全地保存在备份介质里,安全地在钱包间传输,保持密钥在任何可能被暴露情况下的安全性。

BIP0038加密方案是:

输入一个比特币私钥,通常使用WIF编码过,base58chek字符串的前缀“5”

输入一个长密码作为口令,通常由多个单词或一段复杂的数字字母字符串组成

BIP0038加密方案的输出一个由base58check编码过的加密私钥,前缀为6P

如果你看到一个6P开头的的密钥,这就意味着该密钥是被加密过,并需要一个口令来转换(解码)该密钥回到可被用在任何钱包WIF格式的私钥(前缀为5)。

许多钱包APP现在能够识别BIP0038加密过的私钥,会要求用户提供口令解码并导入密钥。

P2SH (Pay-to-Script Hash)和多重签名地址

传统的比特币地址从数字1开头,来源于公钥,而公钥来源于私钥。虽然任何人都可以将比特币发送到一个1开头的地址,但比特币只能在通过相应的私钥签名和公钥哈希值后才能消费。

以数字3开头的比特币地址是P2SH地址,有时被错误的称谓多重签名或多重签名地址。他们指定比特币交易中受益人作为哈希的脚本,而不是公钥的所有者。

不同于P2PKH交易发送资金到传统1开头的比特币地址,资金被发送到3开头的地址时,需要的不仅仅是一个公钥的哈希值,同时也需要一个私钥签名作为所有者证明。在创建地址的时候,这些要求会被定义在脚本中,所有对地址的输入都会被这些要求阻隔。

script hash = RIPEMD160(SHA256(script)) 脚本哈希的结果是由Base58Check编码前缀为5的版本、编码后得到开头为3的编码地址。

P2SH函数最常见的实现是用于多重签名地址脚本。顾名思义,底层脚本需要多个签名来证明所有权,此后才能消费资金。设计比特币多重签名特性是需要从总共N个密钥中需要M个签名(也被称为“阈值”),被称为M-N多签名,其中M是等于或小于N。

纸钱包

纸钱包是打印在纸张上的比特币私钥。有时纸钱包为了方便起见也包括对应的比特币地址,但这并不是必要的,因为地址可以从私钥中导出。

纸钱包是一个非常有效的建立备份或者线下存储比特币(即冷钱包)的方式。作为备份机制,一个纸钱包可以提供安全性,以防在电脑硬盘损坏、失窃或意外删除的情况下造成密钥的的丢失。

作为一个冷存储的机制,如果纸钱包密钥在线下生成并永久不在电脑系统中存储,他们在应对黑客攻击,键盘记录器,或其他在线电脑欺骗更有安全性。

一个更复杂的纸钱包存储系统使用BIP0038加密的私钥。打印在纸钱包上的这些私钥被其所有者记住的一个口令保护起来。没有口令,这些被加密过的密钥也是毫无用处的。

虽然你可以多次存款到纸钱包中,但是你最好一次性提款,一次性提取里面所有的资金。因为如果你提取的金额少于其中的金额的话,会生成一个找零地址。并且,你所用的电脑可能被病毒感染,那么就有可能泄露私钥。一次性提款可以减少私钥泄露的风险,如果你所需的金额比较少,那么请把余额找零到另一个纸钱包中。

六、交易

比特币交易的生命周期

一笔比特币交易的生命周期起始于它被创建的那一刻,也就是诞生

比特币交易会被一个或者多个签名加密,这些签名标志着对该交易指向的比特币资金的使用许可。

接下来,比特币交易被广播到比特币网络中。在比特币网络中,每一个节点(比特币交易参与者)验证、并将交易在网络中进行广播,直到这笔交易被网络中大多数节点接收。

最终,比特币交易被一个挖矿节点验证,并被添加到区块链上一个记录着许多比特币交易的区块中。

比特币交易可以被任何人在线上或线下创建,即便创建这笔交易的人不是这个账户的授权签字人。类似于,一个负责应付账款的柜员可以创建比特币交易,然后让CEO对它进行数字签名,从而使之有效。

一张支票是指定一个特定账户作为资金来源的,但是比特币交易指定以往的一笔交易作为其资金来源,而不是一个特定账户。

一旦一笔比特币交易被创建,它会被资金所有者(们)签名。如果它是合法创建并签名的,则该笔交易现在就是有效的,它包含了转移这笔资金所需要的所有信息。

最终,有效的比特币交易必须能接入比特币网络,从而使之能被传送,直至抵达下一个登记在公共总账薄(区块链)的挖矿节点。

广播交易至比特币网络

首先,一笔交易需要传递至比特币网络,才能被传播,也才能加入区块链中。

本质上,一笔比特币交易只是300到400字节的数据,而且它们必须被发送到成千上万个比特币节点中的任意一个。只要发送者能使用多于一个比特币节点来确保这笔交易被传播,那么发送者并不需要信任用来传播该笔交易的单一节点。

比特币交易因此可以通过未加密网络(例如WiFi、蓝牙、NFC、ChirP、条形码或者复制粘贴至一个网页表格)被发送到比特币网络。在一些极端情况下,一笔比特币交易可以通过封包无线电、卫星或“短波、扩频或跳频以避免被侦测或阻塞通信的方式进行传输。一笔比特币交易甚至可被编为文字信息中的表情符号并被发表到在线论坛,或被发送成一条短信或一条Skype聊天信息。因为比特币将金钱变成了一种数据结构,所以在本质上是不可能阻止任何人创建并执行比特币交易的。

一旦一笔比特币交易被发送到任意一个连接至比特币网络的节点,这笔交易将会被该节点验证。如果交易被验证有效,该节点将会将这笔交易传播到这个节点所连接的其他节点;同时,交易发起者会收到一条表示交易有效并被接受的返回信息。如果这笔交易被验证为无效,这个节点会拒绝接受这笔交易且同时返回给交易发起者一条表示交易被拒绝的信息。

为了避免垃圾信息的滥发、拒绝服务攻击或其他针对比特币系统的恶意攻击,每一个节点在传播每一笔交易之前均进行独立验证。 <font color='red'>一个异常交易所能到达的节点不会超过一个</font>。

交易结构

一笔比特币交易是一个含有输入值和输出值的数据结构,该数据结构植入了将一笔资金从初始点(输入值)转移至目标地址(输出值)的代码信息。

比特币交易的输入值和输出值与账号或者身份信息无关。应该将它们理解成一种被特定秘密信息锁定的一定数量的比特币。只有拥有者或知晓这个秘密信息的人可以解锁。

字段:版本(4bytes,明确这笔交易参照的规则)、输入量(1-9bytes,被包含的输入的数量)、输入(不定bytes,一个或多个交易输入)、输出量(1-9bytes,被包含的输出的数量)、输出(不定bytes,一个或多个交易输出)、时钟时间(4bytes, 一个UNIX时间戳或区块号)

交易的输入和输出

比特币交易的基本单位是未经使用的一个交易输出,简称UTXO。UTXO是不能再分割、被所有者锁住或记录于区块链中的并被整个网络识别成货币单位的一定量的比特币货币。

实际上,并不存在储存比特币地址或账户余额的地点,只有被所有者锁住的、分散的UTXO。

“一个用户的比特币余额”,这个概念是一个通过比特币钱包应用创建的派生之物。比特币钱包通过扫描区块链并聚合所有属于该用户的UTXO来计算该用户的余额。

<font color='red'>在比特币的世界里既没有账户,也没有余额,只有分散到区块链里的UTXO</font>。一个UTXO可以是一“聪”的任意倍。

尽管UTXO可以是任意值,但只要它被创造出来了,就像不能被切成两半的硬币一样不可再分了。如果一个UTXO比一笔交易所需量大,它仍会被当作一个整体而消耗掉,但同时会在交易中生成零头。大部分比特币交易都会产生找零。

一笔比特币交易可以有任意数值,但必须从用户可用的UTXO中创建出来。用户不能再把UTXO进一步细分,就像不能把一元纸币撕开而继续当货币使用一样。用户的钱包应用通常会从用户可用的UTXO中选取多个可用的个体来拼凑出一个大于或等于一笔交易所需的比特币量。

被交易消耗的UTXO被称为交易输入,由交易创建的UTXO被称为交易输出。通过这种方式,一定量的比特币价值在不同所有者之间转移,并在交易链中消耗和创建UTXO。一笔比特币交易通过使用所有者的签名来解锁UTXO,并通过使用新的所有者的比特币地址来锁定并创建UTXO。

对于输出和输入链来说,有一个例外,它是一种特殊的交易类型,称为Coinbase交易。这是每个区块中的首个交易。这种交易存在的原因是作为对挖矿的奖励而产生全新的可用于支付的比特币给“赢家”矿工。这也就是为什么比特币可以在挖矿过程中被创造出来。

交易输出包含两部分:

一定量的比特币,被命名为“聪”,是最小的比特币单位;

一个锁定脚本,也被当作是“障碍”,提出支付输出所必须被满足的条件以“锁住”这笔总额

交易输出把用聪表示的一定数量的比特币,和特定的定义了支付输出所必须被满足的条件的障碍,或者叫锁定脚本,关联到了一起。在大多数情况下,锁定脚本会把输出锁在一个特定的比特币地址上,从而把一定数量的比特币的所有权转移到新的所有者上。

交易输入是指向UTXO的指针。它们指向特定的UTXO,并被交易哈希和在区块链中记录UTXO的序列号作为参考。

当用户付款时,他的钱包通过选择可用的UTXO来构造一笔交易。比如说,要支付0.015比特币,钱包应用会选择一个0.01 UTXO和一个0.005 UTXO,使用它们加在一起来得到想要的付款额。

一旦UTXO被选中,钱包会为每个UTXO生成包含签名的解锁脚本,由此让它们变得可以通过满足锁定脚本的条件来被支付。钱包把这些UTXO作为参考,并且连同解锁脚本一起作为输入加到交易中。

交易费用

大多数交易包含交易费,这是为了在网络安全方面给比特币矿工一种补偿。大多数钱包自动计算并计入交易费。但是,如果你编程构造交易,或者使用命令行接口,你必须手动计算并计入这些费用。

交易费可当作是为了包含(挖矿)一笔交易到下一个区块中的一种鼓励,也可当作是对于欺诈交易和任何种类的系统滥用,在每一笔交易上通过征收一笔小成本的税而造成的一种妨碍。交易费被挖出这个区块的矿工得到,并且记录在这个交易的区块链中。

交易费不足或者没有交易费的交易可能会被推迟,基于尽力而为的原则在几个区块之后被处理,甚至可能根本不被处理。交易费不是强制的,而且没有交易费的交易也许最终会被处理,但是,包含交易费将提高处理优先级。

起初,交易费是网络中的一个固定常数。渐渐地,交易费的结构被放宽了,以便被市场基于网络容量和交易量而强制影响。目前最小交易费被固定在每千字节0.0001比特币,或者说是每千字节万分之一比特币,最近一次改变是从千分之一比特币减少到这个数值的。大多数交易少于一千字节,但是那些包含多个输入和输出的交易尺寸可能更大。在未来的比特币协议修订版中,钱包应用预计会使用统计学分析,基于最近的几笔交易的平均费用,来计算最恰当的费用并附在交易上。

交易的数据结构没有交易费的字段。相反地,交易费通过所有输入的总和,以及所有输出的总和之间的差来表示。从所有输入中扣掉所有输出之后的多余的量会被矿工收集走。

如果你忘记了在手动构造的交易中增加找零的输出,系统会把找零当作交易费来处理。举例来说,如果你消耗了一个20比特币的UTXO来完成1比特币的付款,你必须包含一笔19比特币的找零回到你的钱包。否则,那剩下的19比特币会被当作交易费,并且会被挖出你的交易到一个区块中的矿工收走。尽管你会受到高优先级的处理,并且让一个矿工喜出望外,但这很可能不是你想要的。

高交易费不是因为付的钱很多,而是因为她的交易很复杂并且尺寸很大,交易费是与参加交易的比特币值无关的。

交易链条和孤立交易

当一条交易链被整个网络传送时,他们并不能总是按照相同的顺序到达目的地。有时,子交易在父交易之前到达。在这种情况下,节点会首先收到一个子交易,而不能找到他参考的父交易。节点不会立即抛弃这个子交易,而是放到一个临时池中,并等着接收它的父交易,与此同时广播这个子交易给其他节点。没有父交易的交易池被称作孤立交易池。

内存中储存的孤立交易数量是有限制的,这是为了防止针对比特币节点的拒绝服务攻击(DoS)。这个限制被定义在比特币涉及到的客户端的源代码中的MAX_ORPHAN_TRANSACTIONS。

比特币交易脚本和脚本语言

比特币客户端通过执行一个用类Forth脚本语言编写的脚本验证比特币交易。锁定脚本被写入UTXO,同时它往往包含一个用同种脚本语言编写的签名。

当一笔比特币交易被验证时,每一个输入值中的解锁脚本被与其对应的锁定脚本同时(互不干扰地)执行,从而查看这笔交易是否满足使用条件。

大多数经比特币网络处理的交易是以“Alice付给Bob”的形式存在的。同时,它们是以一种称为“P2PKH”(Pay-to-Public-Key-Hash)脚本为基础的。然而,通过使用脚本来锁定输出和解锁输入意味着通过使用编程语言,比特币交易可以包含无限数量的条件。

比特币交易验证并不基于一个不变的模式,而是通过运行脚本语言来实现。这种语言可以表达出多到数不尽的条件变种。这也是比特币作为一种“可编程的货币”所拥有的权力。

脚本创建(锁定与解锁)

比特币的交易验证引擎依赖于两类脚本来验证比特币交易:一个锁定脚本和一个解锁脚本。

锁定脚本是一个放在一个输出值上的“障碍”,同时它明确了今后花费这笔输出的条件。

解锁脚本是一个“解决”或满足被锁定脚本在一个输出上设定的花费条件的脚本,同时它将允许输出被消费。解锁脚本是每一笔比特币交易输出的一部分,而且往往含有一个被用户的比特币钱包(通过用户的私钥)生成的数字签名。由于解锁脚本常常包含一个数字签名,因此它曾被称作ScriptSig。并非所有解锁脚本都一定会包含签名。

每一个比特币客户端会通过同时执行锁定和解锁脚本来验证一笔交易。对于比特币交易中的每一个输入,验证软件会先检索输入所指向的UTXO。这个UTXO包含一个定义了花费条件的锁定脚本。接下来,验证软件会读取试图花费这个UTXO的输入中所包含的解锁脚本,并执行这两个脚本。

首先,使用堆栈执行引擎执行解锁脚本。如果解锁脚本在执行过程中未报错(没有悬空操作符),主堆栈(非其它堆栈)将被复制,然后脚本将被执行。如果采用从解锁脚本处复制而来的数据执行锁定脚本的结果为真,那么解锁脚本就成功地满足了锁定脚本所设置的条件,因而,该输入是一个能使用该UTXO的有效授权。如果在执行完组合脚本后的结果不是真,那么输入就不是有效的,因为它并未能满足UTXO中所设置的使用该笔资金的条件。

脚本语言

比特币交易脚本语言,也称为脚本,是一种基于逆波兰表示法的基于堆栈的执行语言。

比特币脚本语言被称为基于栈语言,因为它使用的数据结构被称为栈。

如果堆栈顶部的结果显示为真(标记为{0×01}),即为任何非零值或脚本执行后堆栈为空情形,则交易有效。如果堆栈顶部的结果显示为假(0字节空值,标记为{})或脚本执行被操作符禁止。

图灵非完备性

比特币脚本语言包含许多操作,但都故意限定为一种重要的方式——没有循环或者复杂流控制功能以外的其他条件的流控制。

这样就保证了脚本语言的图灵非完备性,这意味着脚本的复杂性有限,交易可执行的次数也可预见。

脚本并不是一种通用语言,施加的这些限制确保该语言不被用于创造无限循环或其它类型的逻辑炸弹,这样的炸弹可以植入在一笔交易中,通过引起拒绝服务的方式攻击比特币网络。

受限制的语言能防止交易激活机制被人当作薄弱环节而加以利用。

非主权验证

比特币交易脚本语言是无国家主权的,没有国家能凌驾于脚本之上,也没有国家会在脚本被执行后对其进行保存。所以需要执行脚本的所有信息都已包含在脚本中。

如果您的系统对一个脚本进行验证,可以确信的是每一个比特币网络中的其他系统也将对其进行验证,这意味着一个有效的交易对每个人而言都是有效的,而且每一个人都明白这一点。<font color='red'>这种对于结果的可预见性是比特币系统的一项重要良性特征</font>。

—-

编译者/作者:霹雳财经

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...