一、唠叨两句
最近一直在考虑一个事情,就是怎么给不太了解技术的人讲清楚区块链。我先试着写下来,然后在逐步打磨吧,目标就是让哪些说看区块链看的云里雾里的同学能对区块链有一些认知。
二、定义
简单的给区块链下个定义:基于加密算法的,去中心化的分布式账本技术。这里有三个关键词:加密算法、去中心化、分布式账本,下面我就尝试从三个关键词为线索,介绍一下区块链的概念。
三、分布式账本
比特币是一个点对点的电子现金系统,既然是现金系统,那么就得记账呗,这大概就是这个账本的由来,就是流水账嘛,张三给了李四一百块钱,王五给了张三五十块钱,blabla。这种东西,就是一条一条的数据,记录在文件里,数据库里等等。区块链的账本存储,当然就是区块和链了。分布式账本,就是在说不仅存一份数据,每个全节点都存一份数据,只要不是全部节点挂掉,总有节点可提供数据的。
1. 区块:块由区块头和区块体组成,区块头包含一些前一个区块的Hash啊,当前区块中所有交易的默克尔树根啊,时间戳啊,随机数啊,等等。区块体里就是一笔笔的交易。
简单说下默克尔树,比如当前区块有4比交易A,B,C,D,AB取hash,CD取hash,两个Hash结果再取hash,就形成了默克尔树,树根可以理解为一个checksum,任何一个交易改一点,整棵默克尔树就都变化了,可以保证没有篡改,这个树还可以支持轻钱包SPV验证。
2. 交易:每一笔交易主要包含了一个或多个Input和Output,Input记录的是引用到的前一笔未花费交易的索引,Output记录的是将资产转移到那个地址。这里讲脚本的时候,还要讲。
3. 链:刚才讲了区块头包含了前一个区块的Hash,这东西就是为了把区块连接起来,成为一个链,链上的交易顺序不能认为严格的前后关系,但是基本可以认为是有一个追溯的结构。作为程序猿,你会想需要遍历链,怎么整,拿到创世块,它没有前一个区块Hash,取到它的默克尔树根作为key去存储里面找下一个区块,如此往复。
四、去中心化
我想把这部分通过和一般NoSql数据库的一些方式做对比,NoSql数据库为了达到读的并发性能和数据的安全,通常都会保存多个副本,ReplicaSet的概念。同时对于写的数据,总要先找个主节点写,写完了再同步给副本集,选主的时候,数据一致的时候,都需要几个节点达成共识,通常会有Paxos,Raft这样的算法来保证。把这部分放大到公网上,就基本可以映射到区块链上了,区块链的各个全节点都保持一个完整账本,全网的ReplicaSet;获得记账权要记账写块了,谁来写,区块链上通过PoW,PoS,DPos等等共识算法来达成共识,又和Paxos,Raft对应上了。
说到共识了,我们想一下记账权这个事,就是挖矿,首先是个经济问题,我干嘛要挖啊,你得给我奖励,比特币系统中获得了记账权生成了区块,就能获得比特币的奖励,比特币价格高,当然可以激励记账这个事了,那么问题来了,这个经济问题变成了一个博弈问题了,这么赚钱,凭啥你挖啊。这时候就得有个算法来规定好游戏玩法,比特币怎么个玩法PoW,就是来个数学谜题,谁算出来谁记账。这个数学谜题可以简单这么理解,就是你生成的块,加上一个随机数位可以调节,然后基于一种Hash算法,你生成出来的结果必须小于某某数,这个某某数就是难度,可以动态调节的,现在比特币的这个难度很高,所以你也就别跟矿主彪啦。那为什么叫PoW了,就是工作量证明,因为这个Hash之间没有关联型,我上次随机数计算的结果和我这次随机数计算的结果之间没有半分钱关联,这也就是为啥算力规模越来越大了,可以并行计算,算力越大,概率越大。你要非较真说,其实理论上,你可能很少计算就刚好碰到了正确结果,没错,这事就可以类比高考了,你说有没有神蒙,蒙得高分,有,但是大体上这个考分大概其能证明你努力过吧。
五、加密算法
非对称加密大伙都明白,不多讲了,利用非对称加密的签名验签可以实现区块链最关键的特点,确权。只有我用我的私钥签名过的数据,你用我的公钥才能验证通过,其他谁想仿造都不行,所以这钱就只能是我来花了。说到确权,这事可大了,区块链为啥火,就是因为确权,数字资产能确权了,这意味着什么?意味着互联网变成了价值互联网了,价值可以传递了。
那这签名验签的用哪儿了,也没见哪儿使啊,别急,刚才咱介绍交易的时候不是留了一个箭头么,这交易上记的不仅仅是转移到对方的地址,而是一个脚本。如果就一地址搁那,都说是自己的,那不乱套了,这钱谁能用,得确权,这就需要脚本系统了。
首先说说比特币的地址啊,地址咋生成,下图讲的特清楚,我从网上拷的。你说好好一图,我随便用,不能卖钱,为啥,不就是因为没法确权嘛。
然后我们简单说说这个比特币的脚本系统,它是基于栈的脚本系统。这里我暂时不展开,仅已最常用的比特币锁定脚本P2PKH脚本作为例子讲讲。
锁定脚本
DUP HASH160 [Public Key Hash] EqualVerify CheckSig
花钱的时候你得通过锁定脚本的验证,这个就是一个确权的过程,你要想验证通过你得提供解锁脚本
[Sig] [Public Key]
简单说下验证过程吧,下面这堆脚本基于栈执行
[Sig] [Public Key] DUP HASH160 [Public Key Hash] EqualVerify CheckSig
1. [Sig]入栈
2. [Public Key]入栈
3. DUP复制栈顶[Public Key]再入栈
4. 拿出栈顶[Public Key]执行HASH160(这个正是Public Key Hash的算法),入栈
5. 锁定脚本里的常量[Public Key Hash]入栈
6. 取出栈顶里脚本里的[Public Key Hash]和计算出来的比较,相等就继续
7. 这下栈里从底到顶分别是[Sig][Public Key],CheckSig拿出栈里这俩验签,通过钱就是你的,请用。
比特币的脚本指令很多,你可以自己写脚本出来,就是有点麻烦,写汇编似的,但是这东西也是个好东西,直接就引出了后面的智能合约来了,
六、小结
今天主要从加密算法,去中心化和分布式账本三个方面简单介绍了一下区块链,感觉没达到我的预期让没接触过的突然开窍的感觉,后面打磨打磨吧的再。本文里主要以比特币作为实例进行介绍的,我觉得比特币最牛逼的地方就是确权和智能合约,打开了无限遐想。公链上开发,很多选择,我其实不太喜欢比特币,开发起来太麻烦,而且就现在这个币值,搞些大宗交易,跨境大额转账啥的还成,其他的,呵呵吧,但是币王还是币王,这里面的原理还是值得细细琢磨的。