1. 区块链的前景
(1)资产:数字资产的发行、支付(跨境支付)、交易、结算
(2)记账:股权交易、供应链金融、商业积分
(3)不可篡改:溯源、众筹、医疗证明、存在性证明
(4)点对点:共享经济、互联网
(5)隐私:匿名交易
2. 比特币的概念
(1)货币:货币凯恩斯的《货币论》中货币是可以承载价值的一般等价物
(2)数字货币:一串数字用来表示货币
(3)比特币是什么:比特币是数字货币,是去中心化的记账系统或者说去中心化的记账网络
(4)比特币的特点:财产只受自己控制(财产只受自己私钥控制)、无通货膨胀(不会因为央行发行更多的钞票而贬值)、没有假钞(任何作弊的支付都无法得到比特币网络中其它矿工的确认,这样就无法完成支付)、流通性好(全球无缝点对点流通。国际汇款时,可能需要几天对账。中间有很多跨国阶段等环节,但是比特币是点对点的直接到账,免去了很多中间环节)
比特币是区块链技术最成功的应用,比特币系统里的数据是一个个区块存储的,并且通过 Hash 的方式把一个个区块连接起来形成了一个区块的链条。
3. 比特币的原理
账本如何验证?所有权问题?为什么记账(挖矿)?以谁的账本为主?
4. 账本如何验证
账本:包括账本序号、记账的时间和账本中记录的交易信息 Hash函数:Hash(原始信息)= 摘要信息
Hash函数的特点:同样的原始信息用同一哈希函数总能得到相同的摘要信息;原始信息任何微小的变化都会哈希出面目全非的摘要信息;从摘要信息无法逆向推算出原始信息。
通过对账本的 HASH 得到摘要的信息: 787635A就是摘要信息,如果摘要信息和其他人的摘要信息对的上,根据 Hash 的特点说明原始信息也都是能够对的上的。对比摘要是要比对比原始信息要高效的多。
区块:序号、时间戳、Hash值(摘要)、交易记录保存在一起就形成一个区块,序号、时间戳、Hash值被称为这个区块的头。 Hash(第一个账本的Hash值,第二个账本)= 第二个账本的摘要信息: 第二个账本的 Hash 值(456635B),是用 第一个账本的 Hash 值 与 第二个账本的信息 作为原始信息进行 Hash 运算得到的。如果第二个账本的 Hash 值对的上,说明第二个账本信息和第一个摘要信息都是正确的。第一个摘要信息正确了,说明上一个账本信息也是正确的。这样由第二个账本也会形成一个区块,也包括:序号、时间戳、Hash值(摘要)、交易记录。如果账本比较多,就会产生第三个、第四个、第 n 个块。所有这些块串联起来的结构就成为区块链: 每个节点在需要核对信息的时候,只需要核对最后一个区块的摘要信息。如果最后一个区块摘要的信息正确,说明整个区块链的账本是正确的 。由此,就完成高效的账本验证。
比特币的记账时间是1次/10分钟
5. 账户所有权问题
如何证明谁拥有这个比特币?谁能够支付这个比特币?
银行系统的账户所有权:在银行开户的时候确定对账户的所有权,如果 出现盗刷并且确定不是自己的交易交易记录,银行会撤销这一笔记账。
而在 比特币系统中,是点对点的交易,没有第三方的参与就可以确定账户的所有权,如何确定账户的所有权?
比特币系统的账户所有权:账户是用一个地址来表示的,转账的过程是把比特币从一个地址转移到另外一个地址,账本上是不保存任何个人信息的。下面是一个从 2A39CBa2390FDe 到 E3242cdfFsdsfG 转账1个比特币的转账记录:
{
‘付款地址’:‘2A39CBa2390FDe’,
‘收款地址’:‘E3242cdfFsdsfG’,
‘金额’:‘1btc’
}
谁能够用 A212ECDFFFGE 这个地址进行支付,那么谁就拥有这个账户的所有权。
比特币是用一个地址表示一个账号的,比特币系统中一个地址会有一个对应的私钥,谁拥有了私钥就有了这个账号的所有权,就可以用这个地址进行支付: 私钥如果泄露,比特币就有可能丢失, 而不像银行系统可以重置密码。银行系统中,账户和密码是没有联系的(账号推倒不出密码,密码推倒不出账号)。比特币系统中,账户和私钥是一个非对称关系。将私钥经过两次 Hash,就可以得到账户地址,但是地址不可以得到私钥。
如何在不泄露私钥的情况下证明拥有某个地址的私钥?需要使用到 非对称加密技术 对交易进行签名。签名过程:第一步先对原始交易记录进行 Hash 运算得到摘要,第二步将摘要和私钥进行签名运算得到签名信息。
第一步:
hash('
{
"付款地址":"2A39CBa2390FDe",
"收款地址":"E3242cdfFsdsfG",
"金额":"1btc"
}')->8aDB23CDEA6
第二步:
sign("交易摘要", "私钥") -> "3cdferdadgadg"
签名之后,付款的节点就会在整个网络节点进行广播,广播内容包括 交易的原始信息 和 签名信息:
整个广播的过程是一个传递的过程。当节点收到广播并且验证通过之后,会向与之相邻的节点再次进行广播。在其它节点收到广播信息后就会开始验证签名信息是不是付款方用私钥对原始信息签名产生的。广播的时候会广播出去签名信息和原始记录(原始记录包括谁付给谁多少个比特币 )。把签名信息和付款方地址进行验证运算:
verify(‘签名信息’,‘付款方地址’)
如果验证运算的结果是原始信息的摘要:
if verify("签名信息","付款方地址") == hash('{"付款地址": "xxx", "收款地址": "xxx", "金额": "xxx"}):
pass
else:
pass
说明这个交易就是地址的私钥所有者发出的,那么验证成功。然后把交易信息写入到帐本中,最后再次进行广播。签名是对摘要进行加密的过程:
sign("交易摘要", "私钥")
验证是一个解密的过程:
verify("签名信息", "付款方地址")
整个账本是没有个人信息的,保护用户的隐私性。即使地址上有很多比特币,也没有任何人知道比特币是我的。但是,账号所有者依然可以用来支付。而在银行系统中是没有做到隐私这一点的。
6. 为什么要记账
账户验证中,记账是一个把交易记录、交易时间、序号等信息进行 Hash 打包的过程,这个过程是需要 消耗计算机资源 的。节点参与记账是可以获取系统一定数量的比特币奖励,这个奖励实际上是比特币的发行过程。
记账有奖励,所以每次记账是新发行一定数量的比特币到记账的账户。如果当前记账奖励 12 个比特币,每个比特币按 4 万美元,一共是 48 万美元。一次可以奖励 48 万美元,就会致使大家都去记账。如果大家同时记账,可能会引起很多问题,如记账不一致的情况。所以,必须要有一个规则去限制大家进行记账。
记账规则要求:一段时间(通常是10分钟)只能有一个人可以记账成功;通过解决密码学难题(即 工作量证明)竞争获得唯一记账权;其他节点只是复制记账结果。
由于在解决密码学难题上有一定的随机性,记账又可以获取奖励,所以大家形象地把记账的过程称之为 挖矿。账本验证的时候,每次记账是把上一个 Hash 和当前的账本信息一起作为原始信息进行 Hash: 如果是这样一个过程,显然每个人都可以轻松完成记账。为了保证一段时间内只有一个人可以记账就必须要 提高记账难度 。比特币系统要求 Hash 值需要满足一定的条件,必须要以 若干个0开头。为了满足若干个0开头的 Hash 值,在计算 Hash 值的时候就必须引入一个变量: 不断改变随机数的值每次都可以得到全新的 Hash 值,只要是不断改变这个随机数,总可以找到 Hash 值是以若干个 0 开头。
交易记录集:收集广播中还没有被记录账本的交易;验证这些交易的有效性(是否有正确的签名?付款的地址有没有足够的余额?);再添加一笔给自己转账的交易,这是挖矿的奖励。
如果一个节点比其他人更快找到 Hash 值得话,整个交易就会被打包成区块,记录在区块链中,打包的这个节点就获取了这个奖励。
工作量证明是一个很大的计算量的过程,需要投入投入很多计算量的设备,也需要消耗很大的电力。目前没有独立的矿工挖矿,因为可能很多年都没法计算满足要求的 Hash 值,现在是矿工联合起来组成矿池进行挖矿。矿池里的矿工按照算力的百分比进行收益的分成。从经济角度来看,只要挖矿有收益,总会有新的矿工加入,致使加剧竞争和提高算力的难度。这样 挖矿需要耗费更多的电力和算力,最终的成本会接近收益的 。
7. 以谁的账本为主
如果有两个打包区块的矿工节点同时完成工作量证明,应该使用谁的区块?谁应该获得收益?比特币没有中心化的仲裁机构,矿工之间如何协商一致达成共识让大家都去认可用谁打包的区块?
这里需要用到 共识机制,共识即大家都去遵守的规范或协议。一个矿工节点的工作量只有在其它节点认可的情况下才是有效的,因为打包的区块需要得到其它节点的验证,通过之后才可以加入到区块链中,并且在网络中传播,打包的矿工节点才能获得收益。只有遵守规则才能得到其它节点的认可,不遵守规则打包的区块就不会被加入到区块链中,因此得不到收益。
共识机制:每个节点只认可累计工作量最大的区块链。每个节点的行为是独立的,独立选择工作量最大的区块链挖矿,延长最长链。 共识机制最终的目的是保证比特币不停地在工作量最大的区块链上运转。把包含最多区块的链称为主链,当两名几乎同时各自求得工作证明的解,打出了两个包 #3458A 和 #3458B: 这两个节点求解完成后会立即在网络上进行广播,先是传给邻近的节点,然后是整个网络。每个收到有效区块的节点都会把区块纳入到自己原有的链条。由于网络的不确定性,这两个区块在传播的过程中总会有一些节点先收到 #3458A,有的节点先收到 #3458B。先收到 #3458A 的节点认为 #3458A 与原来的 #3457 形成的链是最长的,它会在这个链上挖矿。另外先收到 #3458B 的节点,认为 #3458B 与原来的 #3457 形成的链是最长的,它会在这个链上挖矿。也有的节点会两个区块都会收到,这个时候两条链就产生了分叉: 收到 #3458A 区块,会以这个区块作为父区块,在这区块之后进行打包。收到 #3458B 区块也是一样,这时候两个链就产生了竞争。但是总会有一方抢先发现工作量证明,然后把求解的区块传播出去。假设以 #3458B 为父块的节点产生了 #3459B 块,那么 #3458B 和 #3459B 这条链更长,就会把 #3458B 作为主链,舍弃 #3458A。
因网络的不确定性,有的节点会先收到 #3459B,并没有收到 #3458B。这个时候,#3459B 会作为孤块先放在孤块池中,一旦收到 #3458B 就可以把 #3459B 从孤块池里拿出来作为整个区块链的一部分。
比特币将区块间隔设置为 10 分钟其实是在更快的交易确认和更低的分叉概率间做出了妥协。更短的区块产生间隔会让交易更快地确认完成,但是也会更加频繁产生分叉。
|