前言
区块链是一个信息技术领域的术语。从本质上讲,它是一个共享数据库,存储于其中的数据或信息,具有“不可伪造”“全程留痕”“可以追溯”“公开透明”“集体维护”等特征。基于这些特征,区块链技术奠定了坚实的“信任”基础,创造了可靠的“合作”机制,具有广阔的运用前景。-- 百度百科
区块链要素
两种结构:
- P2P组网结构,点对点的灵活网络
- 链式账本结构,验证和存储数据
两种算法:
- 密码算法,保证数据传输和访问的安全
- 共识算法,维护节点间的数据一致性
一个合约:
- 智能合约,编程和操作数据
区块链记账原理
区块链(1.0)是一个基于密码学安全的分布式账本,是一个方便验证,不可篡改的账本。
区块链在记账时会把账页信息(包含序号、记账时间、交易记录)作为原始信息进行Hash, 得到一个Hash值,如:787635ACD, 用函数表示为:
Hash(序号0、记账时间、交易记录) = 787635ACD
账页信息和Hash值组合在一起就构成了第一个区块。在记第2个账页的时候,会把上一个块的Hash值和当前的账页信息一起作为原始信息进行Hash, 即:
Hash(上一个Hash值、序号1、记账时间、交易记录) = 456635BCD
这样第2个区块不仅包含了本账页信息,还间接的包含了第一个区块的信息。依次按照此方法继续记账,则最新的区块总是间接包含了所有之前的账页信息。
所有这些区块组合起来就形成了区块链,这样的区块链就构成了一个便于验证(只要验证最后一个区块的Hash值就相当于验证了整个账本),不可更改(任何一个交易信息的更改,会让所有之后的区块的Hash值发生变化,这样在验证时就无法通过)的总账本。
比特币所有权及隐私问题
比特币的账户是用地址来表示,账本上不显示个人信息,转账是把比特币从一个地址转移到另一个地址。转账记录如这样:
{ "付款地址":"2A39CBa2390FDe" "收款地址":"AAC9CBa239aFcc" "金额":"0.2btc"}
接下来问题就变为了:谁有权用某个地址进行付款?
比特币的解决方案:谁拥有某个地址的私钥,谁就能用这个地址进行支付。(所以私钥一定保管好,如果私钥泄漏,比特币就可能丢失)。
比特币地址和私钥是一个非对称的关系,私钥经过两次Hash之后,可以得到地址, 但是无法从地址反推得到私钥。
地址: 2A39CBa2390FDe私钥: sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgalHash(Hash(fun(sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal))) -> 2A39CBa2390FDe
如何证明你拥有某个地址的私钥?
对交易信息进行签名,流程如下:
- 对交易进行hash, 得到一个摘要信息(Hash值)
hash(' {"付款地址":"2A39CBa2390FDe", "收款地址":"AAC9CBa239aFcc", "金额":"0.2btc" }') -> 8aDB23CDEA6
- 用私钥对交易摘要进行签名(付款方在安全的环境下进行,以避免私钥泄密)
#参数1为交易摘要#参数2为私钥#返回签名信息sign("8aDB23CDEA6", "J78sknJhidhLIqdngalket") -> "3cdferdadgadg"
① 广播
在签名运算之后,付款节点就开始在全网进行广播:我支付了 0.2btc 到 AAC9CBa239aFcc ,签名信息是 3cdferdadgadg 。(发信息到相连的其它节点,其它节点在验证通过后再转发到与之相连的节点,这样的扩散过程)
② 验证
其它节点在收到广播信息之后,会验证签名信息是不是付款方用私钥对交易原始信息签名产生的。验证过程实际是签名过程的逆运算:
#参数1为签名信息#参数2为付款方地址#返回交易摘要verify("3cdferdadgadg", "2A39CBa2390FDe") -> "8aDB23CDEA6"
如果验证输出的信息和原始交易信息的hash一致,则验证通过,记录账本
if(verify("3cdferdadgadg", "2A39CBa2390FDe") == hash('{"付款地址":"2A39CBa2390FDe", "收款地址":"AAC9CBa239aFcc", "金额":"0.2btc"}')) : # 写入账本 # 广播else: # donothing
补充
比特币系统使用了椭圆曲线签名算法,算法的私钥由32个字节随机数组成,通过私钥可以计算出公钥,公钥经过一序列哈希算法和编码算法得到比特币地址,地址也可以理解为公钥的摘要。
挖矿原理——工作量证明
前言
在中本聪(比特币之父)的设计里,完成记账的节点可以获得系统给与的一定数量的比特币奖励,这个奖励的过程也就是比特币的发行过程,因此大家形象的把记账称为“挖矿”。
记账工作
大家争相记账,大家一起记账就会引起问题:出现记账不一致的问题,比特币系统引入工作量证明来解决这个问题,规则如下:
- 一段时间内(例如10分钟左右,具体时间会与密码学难题难度相互影响)只有一人可以记账成功
- 通过解决密码学难题(即工作量证明)竞争获得唯一记账权
- 其他节点复制记账结果
不过在进行工作量证明之前,记账节点会做进行如下准备工作:
- 收集广播中还没有被记录账本的原始交易信息
- 检查每个交易信息中付款地址有没有足够的余额
- 验证交易是否有正确的签名
- 把验证通过的交易信息进行打包记录
- 添加一个奖励交易:给自己的地址增加12.5比特币(如果节点争夺记账权成功的话,就可以得到12.5比特币的奖励)
工作量证明
为了保证10分钟左右(比特币为例)只有一个人可以记账,就必须要提高记账的难度,使得Hash的结果必须以若干个0开头。同时为了满足这个条件,在进行Hash时引入一个随机数变量。
# 未加随机数Hash(上一个Hash值,交易记录集) = 456635BCD# 加入随机数使结果以4个0开头的情况Hash(上一个Hash值,交易记录集,随机数) = 0000aFD635BCD
率先找到随机数的节点就获得此次记账的唯一记账权。
目前没有单矿工独立参与挖矿,基本都是由矿工联合起来组成矿池进行挖矿(矿池里的矿工按算力百分比来分收益)。从经济的角度讲,只有挖矿还有收益(比特币价格不断上涨也让收益变大),就会有新的矿工加入,从而加剧竞争,提高算力难度,挖矿就需要耗费更多的运算和电力,相互作用引起最终成本会接近收益。
验证
- 在节点成功找到满足的Hash值之后,会马上对全网进行广播打包区块,网络的节点收到广播打包区块,会立刻对其进行验证。
- 如果验证通过,则表明已经有节点成功挖出区块,自己就不再竞争当前区块打包,而是选择接受这个区块,记录到自己的账本中,然后进行下一个区块的竞争。
- 网络中只有最快解谜的区块,才会添加的账本中,其他的节点进行复制,这样就保证了整个账本的唯一性。
- 假如节点有任何的作弊行为,都会导致网络的节点验证不通过,直接丢弃其打包的区块,这个区块就无法记录到总账本中,作弊的节点耗费的成本就白费了,因此在巨大的挖矿成本下,也使得矿工自觉自愿的遵守比特币系统的共识协议,也就确保了整个系统的安全。