主页 > imtoken手机版下载 > 区块链技术核心概念
区块链技术核心概念
区块链的过去和未来
说到区块链,就不得不提Cypherpunk:
与本邮件组成员相关的技术发明:
区块链:
区块链前景:
什么是比特币
比特币是一种数字货币。 先不说什么是数字货币。 我们先来了解一下什么是货币:
一般等价物可以是任何东西,我们可以看看历史上出现过的货币代表:
数字货币:
对数字货币的信任从何而来:
比特币除了是一种数字货币,还是一种去中心化的记账系统:
比特币原理
如何验证账本:
那么,如果他们中的一个更改了他计算机上的分类帐,那么是否会有假数据? 如何解决这种情况?
解决方案 2:
例如下图中,通过哈希函数计算出账本的哈希值,然后利用哈希的特性对账本数据进行比对验证,即只需要比对哈希值,这比比较整个账本数据要高效得多。 这就好比我们下载文件的时候,经常会用MD5来校验文件是否被破坏或者修改:
那么哈希值经过计算和验证后,信息存储在哪里呢? 区块链中账本的哈希值、区块序列号和时间戳都保存在区块链头部:
假设第一个账本已经通过验证并成功记录(保存在区块中),如果此时有另一个账本到来,那么在计算新账本的hash时会加上之前的块(ledger)的hash为一起计算的。 如下:
可以看到,当第二个账本出现时,该账本的哈希计算会把前一个区块的哈希计算在内,最终的结果就是新账本的哈希。
因为计算下一个区块的哈希值时,必须连同上一个区块的哈希值一起计算,所以说这些区块是通过哈希值连接起来的。 这样就形成了一个区块链,每个区块都包含前一个区块的哈希,如下:
由于下一个区块总是包含前一个区块的哈希的特性,所以在验证账本时,只需要验证最后一个区块,因为区块链中最后一个区块的哈希摘要间接包含了之前所有区块的哈希块,即当最后一个块被验证时,可以间接验证之前所有块的正确性,这样就不需要一个一个地验证整个区块链。 只需要验证最后一个块,只验证哈希值,所以速度还是很快的。
帐户所有权问题:
银行系统:
比特币系统:
我们都知道银行账户和密码的关系并不密切,但是私钥和地址是有关系的,因为地址是通过私钥哈希计算出来的。 虽然私钥可以推导出地址,但是地址不能推导出私钥。 银行账户不是由密码计算出来的,所以私钥不能像银行账户的密码那样轻易重置。 “重置”的唯一方法是打开一个新地址。 private和address的关系如下:
地址: 2A39CBa2390FDe
私钥: sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal
Hash(Hash(fun(sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal))) -> 2A39CBa2390FDe
{
"付款地址":"2A39CBa2390FDe"
"收款地址":"AAC9CBa239aFcc"
"金额":"0.2btc"
}
付款人需要有地址2A39CBa2390FDe的私钥才能进行支付。 在不泄露私钥的情况下,如何证明我们拥有某个地址的所有权,即如何使用某个地址进行支付呢? 这时候就需要非对称加密技术(对交易进行签名):
签名过程大致是这样的:
1. 对交易进行哈希处理,得到一个汇总信息(Hash value)
hash('
{"付款地址":"2A39CBa2390FDe",
"收款地址":"AAC9CBa239aFcc",
"金额":"0.2btc"
}') -> 8aDB23CDEA6
2、使用私钥对交易摘要进行签名(支付方在安全的环境下进行,避免私钥泄露),代码表示大致如下:
#参数1为交易摘要
#参数2为私钥
#返回签名信息
sign("8aDB23CDEA6", "J78sknJhidhLIqdngalket") -> "3cdferdadgadg"
签名完成后,交易将开始在全网节点广播。 播出内容包括:
广播过程实际上是向其他连接的节点发送信息,其他节点在认证通过后转发给连接的节点。 例如如何得到比特币,节点 A 发起了这笔交易的广播,并允许网络中的其他节点对其进行验证。 节点B与节点A相邻,因此先接收到广播信息,然后广播给相邻的节点C,节点C再广播给相邻的节点D,以此类推,直到广播到整个比特币网络.
其他节点收到交易信息的广播后,会对其进行验证,主要是验证签名信息是否是付款人使用私钥对原始交易信息进行签名生成的,以及验证付款人地址是否有足够的支付金额. 验证过程实际上是签名过程的逆操作。 大致过程用代码表示如下:
#参数1为签名信息
#参数2为付款方地址
#返回交易摘要
verify("3cdferdadgadg", "2A39CBa2390FDe") -> "8aDB23CDEA6"
如果验证输出信息与原始交易信息的哈希值一致,则验证通过并记录账本。 代码表示大致是这样的:
if(verify("3cdferdadgadg", "2A39CBa2390FDe")
== hash('{"付款地址":"2A39CBa2390FDe",
"收款地址":"AAC9CBa239aFcc",
"金额":"0.2btc"}')) :
# 写入账本
# 广播
else:
# donothing
查看签名和验证:
### 签名 ###
#参数1为交易摘要
#参数2为私钥
#返回签名信息
sign("8aDB23CDEA6", "J78sknJhidhLIqdngalket") -> "3cdferdadgadg"
### 验证 ###
#参数1为签名信息
#参数2为付款方地址
#返回交易摘要
verify("3cdferdadgadg", "2A39CBa2390FDe") -> "8aDB23CDEA6"
可以看出,签名就是计算交易的摘要信息和私钥,得到签名信息。 验证是通过对签名信息和付款人地址进行逆运算,得到交易的概要信息。 如果交易的概要信息能够反推成功,则表示验证通过,继续广播。
整个交易过程和计算不包含用户个人信息,确保匿名和隐私。 在安全方面,由于没有第三方机构或信用中心,任何人都无法冻结或减少您的账户金额。 账户的所有权在我们手中,只要私钥不泄露,就可以保证账户的安全。
补充说明
为了更好地理解,我简化了上面的一些信息。
比特币系统采用椭圆曲线签名算法。 该算法的私钥由32字节的随机数组成。 公钥可以通过私钥计算出来。 公钥可以通过一系列哈希算法和编码算法得到比特币地址。 可以理解为对公钥的总结。
为什么记账(挖矿):
簿记工作:
采矿 - 工作量证明:
我们知道,如果改变Hash的原始信息的任何一部分,那么Hash值也会随之改变。 所以在计算Hash的时候,不断的改变随机数的值,总能找到一个随机数,这样Hash的结果就可以在几个数之间变化。 0,最先找到随机数的节点获得本次记账的唯一记账权
在工作量证明之前,记账节点会收集交集记录集,获取方式为:
工作量分析,我们简单分析一下记账的难度。 Hash值是由数字和大小写字母组成的字符串。 每个数字有62种可能(可能是26个大写字母,26个小写字母,10个数字中的任意一个),假设任意一个字符出现的概率都相等,那么第一个数字为0的概率就是1/62(不管其他数字中出现的字符),理论上需要进行 62 次哈希运算才能尝试。 一旦第一位为0,如果前两位为0,则要尝试62的平方的Hash运算,如果从n个0开始,则需要尝试62的n次方运算。 我们来看看当前实际区块#522302的信息:
注:数据来自
以上是一个真实的区块,区块序号为522302,这个区块的工作量证明的哈希值以20个0开头,理论上需要尝试62的20次方,这个数字非常非常庞大,想不通了,应该是亿级以上。 如此大量的计算需要大量的计算设备和电力。 可想而知,其计算量是惊人的,单台计算机无法计算,所以现在的矿工组成矿池进行挖矿(矿池中的矿工按照算力的百分比分享收益)。
核实
节点成功找到满意的哈希值后,会立即将打包好的区块广播给全网,全网节点收到广播的打包好的区块后会立即进行验证。
如果验证通过,则表示部分节点已经成功计算出符合条件的哈希值,它们将不再竞争当前区块的打包,而是选择接受这个区块,记录在自己的账本中,然后进行竞争下一个街区。
只有网络中哈希值最快的区块才会被加入账本,其他节点复制它,从而保证了整个账本的唯一性。
如果节点有作弊行为如何得到比特币,将导致网络节点验证失败,打包区块将直接丢弃。 这个块不能记入总账,作弊节点的成本就白白浪费了。 因此,在巨大的挖矿成本下,也使得矿工自愿遵守比特币系统的共识协议,从而保证了整个系统的安全性。
谁的账为准? (共识机制):
上一节我们介绍了只有完成工作量证明才能获得唯一的记账权。 但是当很多矿工同时挖矿的时候,就会出现两个节点同时完成工作量证明的情况。 这个时候应该用谁的块呢? 这就涉及到比特币中的共识机制:
下面我们简单描述一下分叉的发生和解决。 当不同的矿工同时挖出同一个区块时,就会出现区块链的分叉,如下:
注:因为区块是保存上一个区块的hash,所以箭头指向的是上一个区块的hash
如上图,在区块3457上,发生了分叉,同时出现了两个区块3458A和3458B。 此时分叉不会立即解决,而是将3458A和3458B这两个区块分别广播到比特币网络。 比特币网络中的节点会分别收到3458A或3458B的广播,也可能同时收到3458A和3458B的广播,视网络情况而定。 只接收到3458A的节点按照3458A区块进行挖矿,只接收3458B的节点按照3458B区块进行挖矿。 如果同时收到3458A和3458B的节点,它会先判断哪个块的工作量更大,然后根据工作量最大的块进行挖矿,将另一个块放入备用块池中。 因为网络是不确定的,如果备份块池中的最后一个块是有效的,那么那个块将被替换。
上面我们提到,不同的节点只会在自己收到的分叉区块上挖矿,这样不同的分叉链之间就会存在竞争,最后总会有分叉区块链的区块输出慢一步,所以另一条分叉的区块链会变长,最终所有节点都会使用最长的那条链作为主链。 这将解决分叉。 说白了就是因为分叉出现的两个区块会竞争,最终总能竞争最长的区块链,所以网络中的节点都会以最长的区块链为标准。 比如最后3458B所在的链先出块,成为最长的区块链,则以3458B所在的链为准: