本文专为非技术人员设计,从架构思想的角度阐述区块链技术。即使您没有计算机基础,甚至对密码学一无所知,只需将密码学模块视为普通数学函数,了解函数f: y=f(x)表示输入x与输出y之间的关系即可。
1.区块链只有一个功能:所有人共同备份数据,以防止数据被篡改
计算机中的数据很容易修改,例如编辑Word文档或对图片进行处理。要检查原始数据是否被修改,需要一个参照物,例如将文件复制一份作为存档,然后在修改文件后与存档进行对比。但如果黑客入侵并修改了存档,就无法通过参照物进行比对。因此,关键在于如何确保存档不被修改,而区块链技术能确保数据永远不被篡改。
上图表示区块链实现数据不可篡改的原理,就是通过将数据发送给全世界,让全球的计算机一起备份,从而提供无数个参照物来检查数据是否被篡改。
此时很容易会想到一个问题:为什么全世界的人都愿意帮您备份数据呢?答案很简单,这种事情你们可以花点钱嘛,哪怕花点儿,因为可以通过支付一定费用来激励大家。用户主动付费以获得全球备份支持,这就是区块链的激励机制。
2.区块链银行:不需要中间机构,也能进行金额转账
如果全世界的计算机一起备份同一份数据,这些数据就是银行交易记录,从而实现了数字货币。
区块链的初始形态是比特币,利用区块链的防篡改特性。上图中绿色箭头的两边就是比特币账号,类似于银行卡卡号,所有用户的余额和转账记录被保存在全球的计算机中,从而实现可信的数字银行。
更重要的是,这份防篡改的银行账本由全球共同维护,所有人都可以备份,而不是依赖于可信的银行机构或公司如支付宝进行存储,这实现了网络世界的去中心化。如上图所示,个人用户不再需要中间可信机构,区块链世界自定义了规则用来维护区块链的运行。
这就像是现实中的欠债还钱,总需要担保人负责中间交易,这个担保人可以是双方共同信任的第三方,例如银行或政府。为了消除银行这种担保机构,例如A应向B偿还一万元,可以让新闻联播主持人向全世界都公布这一条消息,实现了全世界帮忙作证,区块链也是这个作用,让全世界都知道交易细节。
3.向全世界广播我的数据,达成共识
如果您拍了一张纪念照需要永久保存,使用区块链技术,那么全球80亿人都会复制并保存这张照片。作为数据的发起者,您首先将照片数据发送给附近的邻居,邻居再传递给他们的邻居,像是病毒一样逐步扩散,直到全球都保存了您的数据,听着都让人想起来前几年不好的回忆。这种技术被称为P2P网络,但您不必关注技术细节,可以忽略该术语。
如果网络邻居不小心传错了数据怎么办?就像是我过年回家说我在外面送外卖,你到处说我在外面卖。应该有一种机制来确保全球所有人获得的数据信息一致,这就是共识机制。
了解区块链的人可能听说过比特币挖矿,这指的就是达成共识的过程。全球的计算机利用显卡计算数学难题,最先计算出结果的用户将被选为临时领导人,所有人都按照他的要求保存指定数据,他也因此获得所有交易费用和奖金。
至于竞选的规则和显卡计算的内容,这取决于区块链的架构,但这些并不重要。您只需知道成为临时领导人即代表挖矿成功,计算速度越快成功概率越大。此外,多个参与者可以共同计算,成功后分配收入,这被称为矿池。
4.先交钱,全世界再帮我备份数据
用户发布待备份的数据需要支付费用,区块链在这里借鉴了现实生活中支票的概念。在使用支票时,需要填写金额并签名。如果在支票上增加一栏填写要备份的数据,便可将这笔费用、数据和用户签名绑定在一起,然后发布支票。
数字签名技术即在计算机中实现了这一想法,将手写签名转化为数字签名。区块链用户准备数字支票,填写待备份的数据和支付金额,最后附上数字签名,表明用户主动支付费用请求全球备份数据。
如图所示,数字签名的原理也很简单,类似于银行卡,数字签名的公钥(pk)类似卡号,私钥(sk)类似银行卡密码。数字签名包括签名函数sig=Sign(sk, 待备份数据+支付金额)和签名验证函数True/False=Verify(pk, sig, 待备份数据+支付金额)。使用私钥sk生成不可伪造的数字签名sig,全球用户都可以利用公钥pk验证sig的真实性。如果签名验证通过,则说明拥有私钥sk的用户主动为待备份数据支付金额,全世界都愿意帮忙备份这一份数据,毕竟这位玩家花钱了。
如果没看懂数字签名的原理,也不重要,毕竟数字签名仅限于比特币这种公链数字货币的交易过程。数字签名基于区块链技术,才可以永久保存用于验证,所以数字签名和区块链技术本身并没有关系。
5.合理存储全球数据:区块链结构
区块链由两个词组成:区块和链。
5.1区块:数据块
我们将区块视为数据块,在一定时间内,全球人们需要永久保存的数据将被整合到一个区块中,定期生成下一个区块,按时间顺序形成多个区块。如果不合理规划这些区块的存储,那么八十亿人民的硬盘里将会是很多坨区块堆在一起,拉了个大的。
初学者通常看到区块中的交易记录和账本等词汇,这些词与金钱相关,容易让人误解区块链,请忽略交易一词,我门只将区块视为一块数据。而且我国只把区块链当作防篡改的数据存储平台,坚决抵制区块链加密货币扰乱经济市场的行为。
5.2哈希函数:压缩数据块
此时需要引入一个密码学模块,即哈希函数y=Hash(x)。作为函数,它有输入和输出,输入为数据,输出为数据的哈希值,即与输入数据一一对应的随机数。以SHA256哈希函数为例,无论输入长度如何,其输出总是256个0或1。例如,对于输入“hello”:SHA256(hello)=1110010001010111111111001010100000110100001011100001011101101010010111100001100010111010011110011010001110010001010000111101101010110110110010101000101111011100111001001010010000001001001110011000110011010000010011010011110100011011011011110101011001000
这串随机的0和1有2的256次方种可能,远远超过了地球的原子总数(2的172次方),所以很难找到两个不同输入对应相同输出,这串0和1可视为输入数据的压缩版,形成一对一映射关系。
我故意错误地说哈希函数是一对一映射,是因为一些专家总强调哈希碰撞现象,两种输入得到同样的输出。这就像说我有机会中五百万一样。对于区块链初学者,这一知识是不必要的,碰撞几率可以暂时忽略。(类似于小学生在学习除法时,需牢记除数不能为零的情况,在实际应用中很少遇到)
如上图所示,通过哈希函数,无论区块中数据量多大,都可被压缩为256个0和1。根据哈希值排序,可以快速找到目标区块。
5.3链:根据哈希值前后顺序,链接多个区块
如前所述,哈希值是随机的,相邻区块的哈希值没有数值上的规律,因此需要对多个无序哈希值进行排序。一本书有页码,因此页码间有顺序,如1、2、3、4、5。如果页码无规律,如何确定顺序呢?很简单,在当前页记录上一页的页码。例如,用随机数0100、1010、0101、0001作页码,在第1010页记录上一页为0100,继续推演即可。这类似iPhone开屏广告跳转到app,左上角的返回按钮记录了两个app间的顺序。
回到区块链,我们将书中每页内容视为区块数据,并生成随机哈希值作为页码,每个区块只需保存上一个区块的哈希值(previous hash),就可以确保区块之间的顺序。假设上图中绿黄红三个区块数据为x1、x2、x3,生成第2个区块时,需要对第1个区块进行哈希得到h1=Hash(x1)=1Z8F,因此第2个区块数据为x2+h1。类似地,生成第3个区块时,计算第2个区块的哈希值h2=Hash(x2+h1),第3个区块为x3+h2。此时,整体区块链结构为x1、x2+h1、x3+h2,通过哈希值h将三个区块x连接,形成区块链。
这样一来,如果x2被篡改为x5,由于第三个区块中的x3+h2包含h2=6BQ1,可以验证Hash(x5)≠h2,从而立刻发现第二个区块有误,并从邻居节点获取正确的x2进行本地存储。
至于区块链教程中常出现的默克尔树的概念,只是为了优化哈希函数的计算性能而已,我简化地说是将整个区块都进行哈希,本质上并没有区别,不要让默克尔树阻碍我们学习区块链的进度。
6.终极目标:代码不可篡改的软件
我们最初为区块链定义的唯一功能是防止数据篡改,因此可进一步构建银行账本,实现数字货币交易。进一步地,若将程序代码及其输入输出保存在不可篡改的区块链中,则可实现不可篡改的程序软件,即智能合约技术。比特币是第一代区块链技术,实现去中心化数字货币;以太坊为第二代,加入智能合约技术,实现不可篡改的程序执行。
6.1公开透明的服务器代码
设想一下,若游戏服务器代码部署于区块链上,用户数据备份于区块链中,则无需担心游戏进度丢失。若微博后台代码和数据备份于区块链上,所有博文将被永久保存无法篡改,发布后即无法删除,虽然可增加封号功能,但规则公开透明,不可能存在后台黑箱操作。同样,若淘宝实现区块链架构,天然支持数字货币交易,购物全流程的数据都会抗篡改。
6.2免费查看历史数据,增加数据需付费
只需要记住一点,如果仅读取程序的历史结果,不会增加区块链账本数据,因此无需支付费用;但若需上传游戏进度或微博发帖这种,新增数据存储则需全球用户备份,因此需要支付费用。
pragma solidity ^0.4.2;
contract HelloWorld{
string name;
function HelloWorld(){
name = "Hello, World!";
}
function get()constant returns(string){
return name;
}
function set(string n){
name = n;
}
}
以这一段智能合约代码为例,调用get()函数并不会修改变量name的值,也就并不会修改区块链的存储状态,所以不需要扣费。但是如果调用set()函数,则会修改name的变量,影响了区块链的存储状态,区块链必须新增一份数据用于保存这个新的name变量,全世界都多出这一份数据,当然需要付费服务。
每一次执行set这种函数,都会修改区块链的状态。其实这个过程也称为一笔交易(Transaction),存在对应的哈希值作为交易地址(Transaction ID/Address),可以根据交易地址查看交易内容,也就是函数名set、函数值n、调用时间等等。我们只需要将交易理解为调用函数时保存新数据到区块链,并生成一个哈希值用于查找这一笔交易的内容。
7.我国唯一推崇的区块链:联盟链
数字货币交易、全球数据备份或智能合约执行都需用户支付费用,以激励全球区块链参与者备份数据。这种由全球玩家参与的区块链称为“公链”,其原因是缺乏中心化管理者,数字货币是必要的激励机制,否则无人愿承担存储大量数据的成本。因此,免费和去中心化无法兼得。
但是我们使用微信、微博、高德地图等基本功能时也无需付费,众所周知这是因为厂商通过广告获得收益,甚至有时为了吸引用户还会主动提供福利红包。由于区块链的免费和去中心化无法兼得,为吸引免费用户,可以部分放弃去中心化,将区块链交由大型厂商管理。当然,不可完全放弃去中心化,因为它是区块链防篡改的核心。
联盟链的理念是让几家大型厂商组成联盟,一起备份区块链数据。只要这些厂商足够可靠,也能勉强实现数据不可篡改。必须指出,联盟链几家厂商共谋篡改数据的难度,与公链全球用户共谋篡改数据相比是不言而喻的。然而,联盟链的优势在于不需要全球用户参与,性能大幅提升。此外,联盟的服务节点可作为管理员对用户请求进行监管,选择性添加账本数据,并可以限制用户权限。管理员作为中介,有效地实现监管,符合我国的法律法规。据目前资料显示,数字人民币的架构原理就是联盟链。
这也解释了为什么本文一直不强调共识机制、激励机制、数字签名等技术细节,因为这些技术并不适用于国内的联盟链产业。例如一些教程强调显卡挖矿的共识原理、UTXO交易的数字签名机制,即使没有掌握这些公链技术,也丝毫不影响读者开展区块链的现实应用。
8.如何应用区块链
8.1只需要学习智能合约
对于区块链初学者,应该只把区块链当作抗篡改的存储平台和智能合约,着重学习智能合约的代码编写和部署,实现可信的代码执行过程,解决实际应用的可信问题。
例如使用ganache或geth模拟以太坊智能合约环境,部署hyperledger、fisco bcos等联盟链,体验作为区块链管理员的操作流程,可以参考我以前的博客:ganache以太坊、fisco bcos联盟链。
8.2智能合约重写服务器代码
为了将现有的数字服务迁移到区块链平台,原本的服务器-客户端架构不需要改变,只需要服务器端将后台代码使用智能合约重写一遍即可,甚至只是重写一部分核心代码即可。商家为了展示后台确实使用了区块链技术,会主动将涉及到修改用户数据时生成的交易地址发给用户查看。
例如上图所示,区块链会记录每一件货物的生产、运输、销售状态,生成多笔交易记录(交易是指存储新数据到区块链),用户可以根据交易地址去查看每次记录的详细信息,进行商品信息溯源,查看所收到货物的历史信息,二维码是表示交易地址的有效方案。
细心的用户可以记录下这些交易地址,定期查看这串交易地址有没有被篡改,从而检验商家的服务器端有没有篡改内部的联盟链数据。毕竟一旦商家想要篡改区块链数据,必须重新生成一遍交易地址,而交易地址又是通过哈希函数随机生成的,商家不可能再一次生成同样的交易地址,所以可以防止中心化商家进行篡改数据的行为。
8.3研究子领域
对于区块链从业人员或研究者,除了掌握智能合约的编写与部署,应选择自己的研究方向,例如共识机制优化、公链交易性能优化、隐私交易等内容。这些子领域之间互不隶属,甚至存在隔行如隔山的状态,例如研究共识机制的不会去学习隐私交易的密码学基础。
以2024第一届全国大学生区块链+应用大赛的获奖作品为例,“基于区块链的供应链财管分布式平台、基于区块链的产学研项目对接管理平台的设计与开发、区块链智能合同管理与签约平台、基于区块链技术的数字音乐原创链系统”这是前四名的获奖作品,基本上都是将区块链当作是可信的存储平台,用于备份财管文件、项目文件、合同文件、音乐文件等内容,然后构建可信的智能合约代码应用,实现文件管理、用户管理等功能模块,构建区块链应用。