banner
leaf

leaf

It is better to manage the army than to manage the people. And the enemy.

密码学是因,区块链是果

比特币是基于密码学构建的去信任数字货币。我认为他把密码学与区块链的关系说得很清楚,

怎么理解他们之间的这种因果关系呢?可能有的同学会认为是区块链需要有可追溯,不可篡改等特性,所以中本聪才设计了几种密码学算法去支撑他的构想。但这是完全错误的,属于颠倒黑白的想法。

你只需要理解两类基本算法就可以,那就是哈希算法以及非对称加密算法,而且学习密码学跟学习其他技术不太一样,理解密码学原理需要深厚的数学功底。其实工程师完全可以把密码学当作黑盒,你不需要太关注其技术原理,而只需要理解它的特性以及应用场景就可以了。

哈希算法 我们先一起看看之前提及比较多的哈希算法,哈希算法又称散列函数,它可以将任意长度的数据转换成短的、固定长度的数据指纹

其实哈希算法不是只有一个固定的实现,而是一类算法的统称,比如常用的有 MD5 跟 SHA-256。要评判一个哈希算法是否足够优秀,我们有 4 个标准:正向快速、逆向困难、输入敏感和避免碰撞

正向快速 什么是正向快速呢?这点很好理解,如果给定信息和算法规则,可以在有限的时间内计算得到信息的哈希结果。你说你设计了一个优秀的哈希算法,结果一次计算过程就花了好几 秒,那只能说你的设计不够优秀,虽然时间有限,但根本没办法在真实场景中使用。为了能给你更直观的感受,我专门写了一个程序,测试我们常用到的 MD5 跟 SHA-256 这两个哈希算法的计算到底有多快。

// 计算结果 //md5 count: 10064932 //sha256 count: 5727246

可以看到,最终得到的结果是非常给力的,在大概 1 秒钟的时间内,MD5 计算了 1000 万次,而 SHA-256 算法也计算了 500 万次。 我这里仅仅是用了一台普通的电脑,如果是在服务器上跑,相信结果会更震撼。通过这个测试,相信你对正向快速这个标准的解读应该足够清晰了。当然单纯分析哈希算法的计算速度是没有意义的,还是要将其带入到具体的业务场景中,此处只是给你一个直观的印象。

逆向困难 接下来我们看第二个标准,那就是如果给定哈希结果,在有限的时间内基本不可能逆推出原始信息。也就是说一个优秀的哈希算法是不可能通过密文反推明文的,这也就是不可逆的根源

这是我在电脑的命令行中执行的一条命令,得到了 “极客时间” 的 MD5 哈希值。想象一下,如果我不告诉你 e0aac893629b048e8797800294f55004 是 “极客时间” 的 MD5 哈希结果,你能通过这段字符,反推出它代表的明文是 “极客时间” 吗?不光你懵,我想计算机看到这问题也会懵,因为计算机只能通过穷举去猜结果。当然,并不是说哈希算法就是不能够被破解的。相反,MD5 哈希可以说已经被变相破解 了,既然逆向困难,那我提前穷举常见的数据组合存起来,有破解需求的时候我再回头查就好了,简单而又粗暴。

输入敏感

我们再看另一个标准,就是原始信息即使发生一丁点的变化,重新计算的哈希值与之前比较都应该有很大的不同。这个标准主要是降低原始信息被部分推断的风险。如果新产生的哈希值与之前的相差不 大,计算机就可以利用差异去推断变化,相比穷举,困难度当然是降低了,而这却是不被允许的。 还是来看一个例子:

避免碰撞#

你可能就会有疑问,以 MD5 算法为例,任意数据信息经过哈希算法后都可以得到 32 位哈希值,那不会重复吗,毕竟 32 位哈希值能表现的数据量是比较少的? 其实你只说对了一半,32 位在计算机中是用 128 位二进制数表示的值,所以实质上 MD5 哈希能表示的数据有 个那么多,你如果去算一算就会发现,这其实是一个很大的数字。如果你仍然认为不够保险,那还有更高位数的算法可以选择,比如 SHA-256 及 SHA512 等。当然,表示的数据量大,并不代表着就不会有两个不同的数据得到相同的哈希值,这确实在实践中已经出现过。所以,在设计哈希算法时,应该避免不同的明文信息产生相同的哈希值。

区块链中的哈希 现在我们了解了优秀哈希算法评判的 4 个标准,相信你对哈希算法的特性已经有所认识了。那区块链中是怎样应用哈希算法的呢?我们接着往下说。因为哈希算法相当于是对信息提取摘要,是数据的指纹,因此经常被用于数据完整性的校验,而区块链在此基础上又做了适当的延伸。区块链中用到哈希算法的地方主要是交易哈希和块哈希,主要功能就是校验交易及区块的 完整性,以及充当区块链网络中交易及区块的唯一标识。说到这里,你有没有想到上一讲

我留下的第二个讨论题?没错,在区块链数据落盘的时候,我们就可以使用交易哈希、区块哈希分别作为交易及区块的数据主键,只要保持了数据与标识对应索引关系,就可以把交易跟区块存储在任意数 据库中。

区块哈希还有另一个作用,区块属性中包含了前一个区块的哈希,从而构建成一条由区块哈希关联的数据链条,所以我们称区块链为哈希链也不为过。利用哈希算法对输入的敏感 性,作恶者如想篡改区块链数据,必须从被修改处开始依次修改后续的全部区块,哈希算法的加入增加了作恶者篡改的成本,可以说是哈希算法成就了区块链单节点的不可篡改特 性。 非对称加密算法 讲完哈希算法的内容,我们再将目光转向非对称加密算法。说到非对称,肯定有与之对应的对称加密算法。顾名思义,对称与非对称体现在对密钥的处理上。对称表示加密和解密都使用同一套密 钥。而非对称加密却不一样,分为公钥跟私钥,如果使用公钥加密,只有用对应的私钥才能解密,反之亦然。那既然有了对称加密算法,为什么还要发明非对称加密算法呢?这里我用一个快递的例子帮你解惑。你在外地打拼,给远在老家的父母寄了一份珍贵的礼物,用一个精美的盒子做包装。为了礼物不被破坏,其实最好的方法就是你亲自送回家,但这不现实,你只好发快递。

而父母收到你的礼物非常高兴,他们立马也快递给你一些老家的土特产,用的正是你送礼物的那个盒子。就这样来来回回好几轮,原来精美的盒子已经变得残破不堪,甚至可以透 过盒子看到内部的物品,也很容易丢失。这个例子让我们形象地理解了对称加密的不足。其中礼物跟土特产就是需要交换的信息,而那个起初精美的盒子就是密钥。 对称加密算法要想保证密钥不被泄露,最好的办法是面对面协商,而且即便是面对面协商了密钥,后续也不能多次使用,否则使用次数越多,泄密风险越高,且不能保证中途没有 其他人篡改。

还是用快递的例子,为了能保证快递物品不丢失,这次过年回家你给父母买了个快递保险箱,共两把钥匙,父母一把,你留一把。这样后续再寄快递时,就可以把物品放在保险箱 中,这样就算用快递运输,也不用怕物品被调包了,因为除了你跟父母之外,没有人可以

再打开保险箱。 这里的保险箱就相当于公钥,而钥匙就相当于私钥。这个 “保险箱” 方案,其实在密码学里就对应着非对称加密算法的思想。非对称加密算法的密钥是一对,分为公钥跟私钥。公钥可以随便公开,而私钥需要私密保存,而只要私钥不被泄露,信息交换过程就是安全的。当然这个例子还是与非对称加密有所差异,真正的私钥应该只有一份。

非对称加密算法虽然解决了对称加密算法使用过程中遇到的问题,但其加解密的效率是远不如对称加密算法的。因此,在使用过程中常采用混用的方式,即明文数据采用对称加密算法进行加密,然后使用非对称加密算法加密对称加密的密钥和明文数据哈希,对方收到信息后,用匹配成对的另一个密钥解密数据并核对明文数据哈希,混用的方式可很好的平衡安全性与时效性。 非对称加密算法跟哈希算法一样,也是一类算法的统称。现用的比较多的是 RSA 跟 ECC 椭圆曲线加密算法,RSA 多用于互联网信息传输中,比如我们上网用到的 https 通信,而 在区块链中基本都使用的是 ECC 类的变种,比如 ECDSA 跟 ED25519 等。相较于 RSA,ECC 密钥较短,在拥有更高安全性的同时还有更好的性能。

区块链中的非对称加密#

了解了算法的特性,我们再回过头来看区块链中是如何使用非对称加密算法的。你如果之前了解过区块链,就会发现在区块链中,好像并没有哪个地方使用非对称加密对数据进行 加解密。的确,区块链中对非对称加密算法的使用并不是直接被用作数据加密,而是利用其具备身份确权的能力,也就是数字签名。什么是数字签名?顾名思义,其实跟我们平常手写签名的概念及作用是一样的,都是用于证明你的身份,且对所签署的文件或者数据进行确认授权。

在诸如比特币以太坊等公有链中都有类似于地址、账户的概念,我们可以认为这就是区块链中的身份证,这个身份证不同于现实中需要政府统一颁发,而是分散的基于非对称加密 算法的公钥的一种形变表示。这里可以引申一个小知识点,你通过数字货币手机钱包创建了一个账户,此时区块链网络并不知道,只有当你接收到一笔转账之后,网络中才有你这个账户的信息。那如何确认这个账户是属于你的呢?道理非常简单,只要你能证明你可以花费账户中的余额就可以了,而这证明的关键就在于数字签名。既然账户是公钥的形变表示,那么必定存在与之对应的私钥,且只存在你的手中。

image

可以将交易结构分成两部分,左边部分是交易的基本属性,而右边只包括签名。如果我们不看签名,其实左边部分已经能够基本表示交易的内容了,只是缺少了证明。因此我们将左边部分看作一个整体,然后对它进行哈希计算得到交易摘要,接着用你手中的私钥对交易摘要进行加密,而加密的结果就是交易的签名。而如果要验证交易,只需要按照相反的流程进行就可以了,将交易签名使用对应的公钥解 密得到签名中包含交易摘要,同时将明文的交易内容利用哈希算法再计算交易摘要,然后将签名中的交易摘要与自主计算的交易摘要进行对比,如果匹配,则表示交易验证成功

image

数字签名的本质也是一种加密,只不过针对的是数据的哈希摘要,并不是数据本身。这么做有什么好处呢?主要有两点,一方面证明了确实是你自己构建的这笔交易,因为其他人 没有你的私钥,无法假冒。另一方面,因为数字签名是有哈希算法参与的,因此也继承了哈希算法的特性,能保障交易的完整性,确保了交易不会被他人无故篡改。

总结#

这一讲我从哈希算法跟非对称加密算法为出发点,为你浅析了区块链中常用到的密码学算法。哈希算法被用来抽象交易哈希跟区块哈希,除了用于保证数据完整性外,还能用来构建由 区块哈希关联的哈希链条,增加作恶篡改的成本。

区块链中使用非对称加密算法并不是直接用于数据加密,而是主要用作交易签名,数字签名集成了哈希算法与非对称加密算法的双重特性,在保证交易完整性的同时,还能证明交易发起者的身份。 区块链中并不是只用到了哈希跟非对称加密,几乎所有的区块链都在此基础上做了些许的衍生,比如追求隐私交易的 ZCash 就引入了密码学中的零知识证明,专注于隐私计算的区 块链就引入了同态加密等等。密码学的知识浩如烟海,现在区块链用到的只是冰山一角。通过今天的学习我们可以发现,正因为有了密码学的加持,区块链就好像站在了巨人的肩膀上

对于密码学整体发展的历史,你可以参考密码学初探。

  • 这一讲重点讲解了区块链中最常见、最基础的密码学算法,想了解更多关于区块链中涉及的密码学的门类,可以阅读 V 神列的知识清单。

  • 如果你看得还不过瘾,想了解文中介绍的密码学算法原理,可以参考这几篇文章:哈希算法原理,RSA 加密算法原理以及ECC 椭圆曲线加密算法介绍。

主要就是理解私钥代表了所有权,证明身份的基石。公钥是给公开给别人(张三、李四,王五都知道)的,拿公钥对数据哈希值做加密运算,不能提现是张三、李四,还是王五操作的。就没有 “签名” 的意义了

image

网络模型#

为什么区块链会采用点对点网络模型作为节点间数据传递的纽带呢?要想真正搞懂这种思路,我们做个对比。 不管是点外卖还是买车票,在日常工作生活中,我们接触的大部分网络应用架构都是客户端 - 服务器模型。这个模型的运行机制是这样的:各个客户端向服务器发送请求,而服务 端负责接收并处理请求,最终给客户端返回处理结果。为了让你直观理解,我还画了一张 示意图

image

结合示意图,我们可以清晰认识到这是一个中心化的网络架构,其服务能力完全取决于中心的服务器,如果中心服务器因意外导致宕机,那整个服务就瘫痪了。整个应用的可用性仅依赖于服务器的活性,与客户端无关。

而点对点网络则完全不同,它是一种分布式的网络架构,并不存在单一的中心服务器网络中每个节点的权利与义务都是一致的。每个节点都拥有向网络中其他节点发起请求的权利,同时也有着必须响应其他节点请求的义务。

节点权利与义务的对等意味着什么呢?这代表点对点网络的可用性是随着节点数的增多而增强的,网络的运行并不依赖任何单一节点,节点可以任意地加入或者退出。即使一些节点宕机或者遭受攻击,只要还有正常运行的节点,整个系统依旧可以照常运作。

怎么形象地理解二者的区别呢?我们拿银行系统来举例,如果按现有的中心化架构,有一天银行网点大面积停摆,不对外提供服务。原因可能很简单,排除网络的干扰,大概率是 银行的总机房出现了问题,这就是中心化架构可能出现的单点故障。

而区块链架构则不同,一家银行就相当于一个区块链网络,每一个银行网点代表一个区块链节点,一个节点无法对外提供服务,我们可以随时切换另一个节点,一两个节点的问题不影响整个网络。当然,这个例子描述得非常极端粗暴,只是为了帮你理解,真正的银行系统架构不会这么脆弱。

网络拓扑#

从某种角度来说,不管是先有鸡还是先有蛋,点对点网络与区块链都是相互成就的 CP 组合。

前面课程中,我说过区块链的去中心化是相对去中心化,而绝对去中心化只是一个理想状态,如果对应到点对点网络,这其实是由点对点网络的拓扑结构决定的。怎么理解这种对 应关系呢? 只有一个节点的网络实质就是中心化网络,此时区块链表现为中心化。而如果网络中所有的节点两两之间建立连接,此时点对点网络可以看作是完美对称的,区块链也就表现出绝 对去中心化特性。但如果我们不那么极端,允许点对点网络在这两个极端理论值间左右摇摆,就会发现区块链网络会一直处于中心化与绝对去中心化之间的动态平衡之中,而对去中心化程度的考量 主要依托于对点对点网络拓扑结构的选择。

这么说你可能还是有点懵,别担心,我们来一起理一理这中间的逻辑。相比中心化网络,点对点网络虽然优势明显,但它的不足也同样明显,那就是新的节点加入网络之前,必须 知道至少一个已经存在于网络里的节点,不然这个新节点跟整个网络就是脱钩的。这点非常容易理解:在中心化网络中,客户端要想让服务器响应自己的请求,必须先将自己的请求发送到服务器,而这就要求客户端知道服务器在哪,就像你上网必须要知道网址一样。而点对点网络则不一样,所有节点互为服务器客户端,因此节点必须知道其他节点的地址,才能加入网络。对节点发现机制处理的不同,也就形成了不同的网络拓扑结构,下面我分别为你分析一下。

第一种结构是引入了一个中心索引节点,用来保存其他所有节点的接入信息。新节点的加入首先将自身信息传入中心节点,从而换取已在网络中其他节点的连接信息,随后与其他节点组成点对点网络,这种结构与我们使用搜索引擎进行信息检索是类似的,但存在单点故障的可能性,一旦中心索引节点宕机,新节点将无法加入网络。

image

第二种结构你可以理解成一种无为而治的结构。新节点选择连接一个已存在网络中的节点,被连接的节点可以告知新节点它连接的其他节点信息,这样新节点可以随机选择再连接到其他节点,这样就形成了一张没有规律的网络拓扑结构。

而第三种结构则融合了前两种结构的特点,整个网络由多个种子节点形成主干网络,而其他普通节点则连接到某个种子节点,这样就形成了整体分散局部集中的混合结构。

最后一种网络拓扑是结构化的,它跟上面讲的三种拓扑不同,节点间的连接遵循某种算法,组成了一种有序的结构化网络,比如树形网络结构。大多数结构化网络的算法都是基 于分布式哈希表算法实现的,这是一种用于在大量节点的系统中快速定位目标节点的索引算法,具体原理你可以参考扩展阅读。

区块链网络拓扑#

了解了这 4 种网络拓扑结构之间的差异,那区块链中到底是如何组织节点拓扑的呢?纵观前面说的比特币跟以太坊网络,你会发现它们的选择是有差异的。比特币采用的是类似于混合型的网络拓扑结构,一个新节点的加入需要给节点指定几个已在比特币网络中的相邻节点信息,可以是普通节点,也可以是种子节点。当建立节点间连接以后,新节点将自身信息发送给相邻节点,相邻节点再将新节点的信息 依次转发给它们各自的相邻节点,从而保证了新节点信息在网络中被广泛传播。新节点也可以从相邻节点获取该节点的相邻节点信息,从而选择性地连接更多节点,增强节点自身与整个网络连接的稳定性。

比特币中的点对点网络相对简单,也更容易理解,但信息传递的效率不高,并且对网络带宽的负载要求较高,这点你看完后面交易的扩散过程就能明白了。而以太坊的选择则不太一样,使用的是结构化网络拓扑,打造这种结构,离不开基于分布式哈希表思想的Kademlia 算法(后面简称 Kad 算法)。虽然 Kad 算法的原理比较复杂,但如果你能先理解它干了什么事,就会大大降低学习难度。 简单来讲,Kad 算法定义了一种节点间距离计算的方法,用于新节点的发现。那具体怎么计算呢?我们接着往下看。

image

节点 A 首先从自身存储节点信息的 K 桶中找出 2 个与自己距离最近的节点,之后请求这 2 个节点,要求他们从各自的 K 桶中分别找出 2 个与节点 A 更近的节点。那么节点 A 最多可以得到 2 × 2 个新节点信息,随后再请求这 2×2 个新节点中距离节点 A 最近的 2 个节点,让它们再分别返回与节点 A 距离更近的 2 个节点,整个过程持续迭代,直到没有新节 点被发现。

通过这种办法,节点 A 只与自己距离最近的节点连接,这保持了以太坊网络中节点的有序。但你需要注意,节点间的距离是逻辑距离,而并非是物理距离,也就是说即便两个以 太坊节点运行在同一台电脑上,它们之间的逻辑距离也可能无限远,这是算法本身导致的,就比如图中的节点 C 明显离节点 A 更近,但这只是表象,逻辑距离还是 D/E 更近。 通过对比特币以太坊对不同网络拓扑的选择,我们可以发现,区块链中选择网络结构是没有定式的,没有唯一标准。如果你熟悉联盟链技术体系,就会发现联盟链对点对点网络的重视程度不如公链,主要有 两方面原因,一方面联盟链的节点是确定的,很少出现随时加入,随时退出的需求;另一方面联盟链节点个数比较少,并不需要节点发现机制引导新节点的加入。交易的扩散 有了前面基础知识的铺垫,我们终于可以将交易通过网络流动起来了,接下来我们通过交易的扩散进一步加深对网络的理解。之前我们讲过,区块链网络不生产交易,而只是交易的搬运工。从区块链网络示意图中可以看到,在区块链网络外围有大量的手机、电脑、汽车等外联设备,这些设备与任意的区块链节点连接,就能从该节点获取与自身相关的信息,诸如余额、历史交易等等。 同时,外联设备所构建的交易会随之发送到与之相连的节点,所以它们是区块链网络的交易源头

image

传播过程是相对容易的,但是我们应该注意到不同网络拓扑对重复接收相同交易处理上的差别。以太坊网络的节点只与自己最近距离的相邻节点连接,交易的扩散并不存在回路的可能 性,它的扩散路径更像是一种单向的持续向外广播,就像水永远只向低处流一样,交易会逐渐远离最初的节点,交易扩散效率较高。而比特币的交易扩散对此的处理则有所不同。它的网络拓扑是随机的,交易扩散的时候是扩散至与之连接的节点,但扩散前并不知道对方是否已经接收过相同的交易,因此网络扩散的效率是较低的。随着网络节点规模的扩大,节点间连接关系更为无序,大量的网络带宽浪费在对交易的重复扩散中。节点接收到重复交易并不会再次理会,而是直接丢弃,白白做了无用功。你看,比特币的网络拓扑虽然结构简单,但也为此付出了代价。对区块的扩散也遵循交易扩散的通用逻辑,只不过此时并不需要外联设备的参与,而是由

首先满足共识条件的矿工节点发出,你可以先留下一个印象,等下一讲我们学共识算法的时候,我再详细讲解。

总结#

点对点网络是区块链中最常用的网络交互模型,相比于中心架构的客户端服务器模型,每个节点具有对等的权利与义务,与区块链的去中心化特性相得益彰。但点对点网络节点发现机制比中心化网络复杂得多,对此处理的不同衍生出中心、随机、混合及结构化等不同的网络拓扑结构。不同区块链有不同的选择,影响了区块链网络对交易及区块扩散处理上的不同。其实,区块链中是先有去中心化思想还是先有点对点网络的启蒙,这个问题其实不是最重要的。讨论这个问题,是因为研究二者的关系可以让你更深刻地理解区块链网络。而在最后,我也想给出我的观点倾向,我认为是点对点网络的思想启发了中本聪,让他想到利用其无绝对中心的特性去构建去除第三方中介的数字货币系统。

智能合约基础#

你知道么,智能合约并不是区块链的专属,其实早在上世纪 90 年代,就有人提出了 “智能合约” 的概念,基本可以概括如下。以数字形式制定的一系列承诺,包括各参与方履行这些承诺的协议。

a set of promises, specified in digital form, including protocols within which theparties perform on these promises

只不过因为当时缺少有效的载体,智能合约未能进一步发展。直到以太坊出现,才将区块链技术与智能合约相结合,最终呈现在我们面前。怎么理解智能合约的概念呢?我们不妨从 “合约” 开始联想,利用我们原先熟悉的知识做 对比。想想平时工作生活中的合同和协议,我们就能很清晰地认识到,智能合约跟它们的概念其实是相通的,只不过智能合约是数字形式的。当然,智能合约跟传统合约还是有差异的。二者约束力的产生机理并不相同,传统意义上的合同协议的约束力来自于权威机构背书,一旦合同签订的多方未履行协议规定的义务,其他参与方是无权对违约方进行私自的追责及惩罚的,必须通过法院等司法渠道进行合理合法的诉求。

但智能合约则有所不同,其约束力的一部分就来自合约本身,智能合约实质就是一段计算机程序代码,因此具有极强的逻辑缜密性,说一不二,代码本身就描述了各参与方的权利及义务,以及各种条件下的处理逻辑流程,可以说代码即法律。那你可能就有问题了,既然代码即法律,那为什么我们平时所接触到到的各类软件应用并不 能叫做智能合约呢?这其实就要说到智能合约约束力的另一部分了,那就是为智能合约提供运行环境的区块链网络。那区块链网络与软件应用提供的运行环境有什么不一样呢? 结合前面几节课对区块链性质及基础技术的讲解,你会发现差异就在于区块链的特性。传统软件应用是由单一的企业机构或个人提供的个性化服务,软件的最终解释权在应用开发者,因此在特殊场景下,很难令用户产生信任感。另外你使用了应用,其实这相当于你与开发者签订了传统意义的合同协议,约束力还是来自权威机构。而区块链网络是由网络的所有参与方共同维护的,由全体成员共同遵守的区块链协议为智能合约提供信任约束力。

智能合约的执行依靠的是交易的链外发起,一旦上链,其运行可以排除任何第三方的干扰。另外,即便是对合约执行的流程有异议,也能利用可追溯特性对智能合约的执行过程 进行追踪。

正是因为约束力的不同,智能合约存在部分落地问题。因为智能合约缺乏权威法律的监管,只受制于代码约束及区块链信任约束。这样就使得在当下这样的一个时间点,普通大众还是缺乏一些对智能合约的信任感,尤其是在涉及重要的合同协定的时候,还是普遍信任权威机构。

当然,这只是新事物在推向市场时都要经历的过渡阶段。随着区块链及智能合约的不断推广,民众对区块链的信任感会加深,智能合约的普及也只是时间问题。为什么我会这么乐观呢?这是因为以太坊不仅是将智能合约引入到区块链中,为智能合约落地提供运行环境;更是为智能合约的推广及普及提供了通道,而这也就是以太坊改进提 案 EIP。

以太坊不仅提供技术能力支撑,还提供了可复用模版。入门难度降低了,对使用体验的提升影响深远。因为全世界的用户都可以提交各类以太坊改进意见稿,如果社区接收了意,随后的以太坊新版本就会实现这些方案。这相当于在以太坊社区运营者跟用户间搭建了直通的交流通道。少数人的思路毕竟有限,但汇聚群众的智慧,平台的发展潜力就是无穷的。

而在这些改进方案中,有很大一部分方案是对智能合约标准的提议。相较于区块链对智能合约的支持,反而我更看重智能合约标准。如果你懂一些面向对象程序编程,那么你一定会非常喜欢接口 Interface,因为它可以约束及规范具有相关性的一类行为。而智能合约标准也是类似的,可以说通过通用行为标准去引导智能合约的发展是一种捷径,价值网络的落地离不开智能合约标准的制订。纯粹的理论描述,可能无法带给你特别深的感受,接下来我就用当前正火的一个智能合约标准 EIP-721 为例(721 就是提案编号,NFT 是提案的名称),为你说明智能合约标准对价值网络的影响。

这个标准的由来,全称是非同质化代币,简称 NFT。既然有非同质化代币,那肯定有同质化代币。所谓同质化代币,指的就是互相可以替代,且可以进行拆分的货币。就比如人民币,你手中的 100 块跟我手里的 100 块的购买力并没有什么区别,而且我们还可以将 100 块钱分成 2 个 50 或者 10 个 10 块。而非同质化代币则不一样,每一个 NFT 都是独一无二,且不可拆分的。你还记得前面我们 用到的房产抵押例子么,你会发现 NFT 似乎为此提供了解决思路。房产信息具有唯一性且不可复制、拆分,如果能够通过 NFT 标记房产的所有权,那么就实现了房产在虚拟世界的锚定,而一旦锚定关系成立,我们就可以在区块链网络中实现对房产的转移,这个过程会像转账一样方便。而且,NFT 的应用场景并不止于此,我们可以通过 NFT 完成多类资产的绑定,一张照片,一幅画,一首歌,一段文字,一张门票等等,任何具有资产属性的事物都可以将其登记成 NFT,例如 Twitter 的 CEO 就想通过 NFT 将其发布的第一条 Twitter 拍卖。

有了 NFT,我们才能够有一种手段将虚拟与现实的价值锚定。当然这并不是说 NFT 是实现价值网络的唯一手段,价值网络的搭建是离不开所有智能合约标准的支持。但是,标准 的制定并不是一蹴而就的,首先市场上必定要先出现一款爆款应用,因其创新的模式引得大家争相模仿,进一步粗暴的推动此类应用达到一个顶峰,随之而来的是泡沫的破灭。而当市场情绪变得冷静之后,有一些人会静下心来思考泡沫背后的深层逻辑,从而抽象出应用背后的蕴含的共性行为模式,进而将其总结成 EIP 提案,最终为未来类似应用场景提

供标准化解决方案。#

智能合约标准制定的不易,更凸显了价值网络的可贵。你也许已经迫不及待想要穿越到未来,领略价值网络时代到底多么先进。但别急,虽然现阶段价值网络还并不成熟,但其雏形已经初现端倪,那就是元宇宙,我们可以通过它窥探价值网络。

元宇宙与价值网络

如果你跟我一样曾经都是爱看书的叛逆少年,那你一定看过玄幻小说。上初中的时候,我非常痴迷于网游系列的爽文,被其中描绘的沉浸式游戏座舱深深吸引,真心希望有生之年 能够体验一番。我一度以为这只是美好的幻想,但没想到,元宇宙可能会将这一切变成现实我第一次听说元宇宙这个词,还以为是哪个中二少年起的名字。但了解以后才知道,其实是科幻小说《雪崩》中描绘的一个称为元宇宙(Metaverse)的多人在线虚拟世界。 这一下子激起了我的兴趣,元宇宙代表的是一个沉浸式的虚拟世界,玩家能在其中进行文化、社交、娱乐等活动。相较于传统游戏,元宇宙拥有可靠的经济系统、虚拟身份与资 产、更强社交性、沉浸式体验、开放内容创作等特点。可以说,在元宇宙中,除了物质是虚拟的,其他方面与现实世界无异。与区块链技术一样,元宇宙并不是单一技术构建的,而是由区块链、游戏、网络和显示四

大技术融合而成的虚拟世界。

区块链技术为元宇宙提供了去中心化的资产交易平台,NFT/DeFi 等智能合约为玩家的虚拟资产提供承载的媒介;游戏为元宇宙提供交互内容;5G 网络为数据的传输提供可靠保障;

可以发现,如果抛开区块链技术不谈,元宇宙所代表的仅仅是一个比传统更加逼真的沉浸式游戏环境,还不能看作一个虚拟世界。但如果有了区块链技术的加持,就能够保障玩家 的虚拟资产及身份的安全,从而在这个世界中实现公开透明的资产交易,实现价值的转移。这样看来,区块链才是元宇宙能够成为虚拟世界的关键所在。

我们对元宇宙的痴迷,绝不仅仅是因为它为下一阶段的游戏行业指引了方向,更是因为元宇宙给现实世界的价值网络提供可借鉴的思路。 探索元宇宙,其实就是在摸索价值网络。可以这样说,如同智能合约标准制定过程一样,现阶段的元宇宙就是我们期待的爆款应用,随着其不断发展,泡沫肯定随之而来,而冷静过后的抽象思考,终会为价值网络的搭建提供标准化的解决方案。

总结#

没有区块链技术,智能合约仍旧只是个概念。而没有智能合约加持的区块链,在应用上就无法大展身手。为区块链 “引荐” 智能合约的正是以太坊,而且以太坊不但是智能合约的伯乐,更为智能合约的推广提供了标准化思路,可以说智能合约标准化是价值网络真正落地的前提。NFT 为现实资产与虚拟价值的锚定提供可行的解决方案,实现了价值网络落地中关键的一步。现阶段,虽然离价值网络还很遥远,但我们却可以通过元宇宙的发展进程去窥探价值网络落地的思路。

区块链是由区块哈#

希前后关联形成的链式结构,主要目的就是保持数据的持续完整性,让区块链在保持不可篡改特性的同时获得可追溯特性。而数据归档是将区块链从某历史区块开始,将之前的数据清理掉,但随后的区块还保持原

有的顺序不变,因此数据归档的本质是在保持不可篡改的前提下牺牲部分可追溯性。但如果我们能在将区块历史数据清理以后,还提供一种方式将被归档的区块再次读取出来,那数据归档其实是一个比较优秀的解决方案。

如果我只是一位比特币的持有者,我只关心我的余额以及历史交易记录,其他的信息我一概不关心。因此我并不需要因为这一小小的需求去同步 350G 的存量数据,这些数据对我 来说并没有什么意义。但对于某些大型的节点来说,它就可以同步历史数据,并以此数据作为生产资料,对外提供相关服务,比如挖矿的矿工节点以及区块链浏览器背后的节点。公链普遍采取的就是这 种节点角色分类的方案。

image

比特币网络现在有大概 10000 个全节点,由它们维护完整的区块链数据,而持币者只需要在手机上运行一个钱包节点就可以进行交易。可以发现,虽然节点角色区分是缓解存储冗 余的一种有效手段,但这是以牺牲去中心化特性作为前提的,从某种程度来说,这也是一种妥协。

解读了两种不同的存储冗余的解决方案,可以发现我们无法从根源上解决存储冗余的问题,只有通过不同的技术手段缓解数据的增长。联盟链以牺牲区块链可追溯性作为突破 口,而公链以牺牲去中心化为前提。另外,其实我们还可以有另外一种办法解决存储冗余,那就是减少数据量,减缓数据增长的趋势。比如在区块链上存储的是原始数据的哈希,而不是数据本身。当然,这只是一种业务层面的解决方案,并不是一个技术维度上的办法

量子计算威胁

说完关于存储冗余的问题,我们再看看另一个大家津津乐道的问题,那就是量子计算对区块链的威胁。我们普遍觉得,量子计算机一旦成熟,以比特币为首的区块链系统就会面临 崩溃,因为量子计算机的算力与经典计算机相比,不可同日而语。但事实真的是这样吗?为了更好地帮你理解这个问题,我觉得有必要先为你科普一下什么叫量子计算。当然,我无法为你去解释叠加态 / 量子纠缠等复杂特性,因为太高深了,所以我只能通过一个从《科学声音公众号》借鉴过来的例子帮助你理解。想象一下,如果让你使用 1 只手,你可以同时表示出几个数字呢?毫无疑问,你只可能 同时表示出 1-10 这 10 个数字中的一个,而这也正是我们使用经典计算机存储数据的基本规则,同一时间一个比特位只能存储一个二进制数,要么是 0,要么是 1。而如果让你将你的手揣入口袋,请问如果让你将手从口袋里拿出来,那么你这只手有可能表达出多少数字呢?答案肯定是 10 种可能,而且在你没将手拿出来前,数字是不确定的。例子说完了,从这个例子就可以看出经典计算机与量子计算机存储数据的差别,一个是存储具体的值,而另一个是存储值的概率。

什么是存储值的概率呢?其实就是把值的所有可能性叠加在一起存储。比如 5 比特位的经典计算机,同时只能表达一个数字,而同样是 5 比特位的量子计算机则可以同时表示 个数字,二者有着 32 倍性能的差距,而且存储的效率也会随着比特位的增多而成倍增长。而这还仅仅是量子计算机的存储能力,只有强大的存储能力还不足以体现出量子计算机对经典计算机的碾压效应,更重要的是量子计算机的并行计算能力。怎么形容这种并行计算的可怕呢?我还是用例子说明。假设现在你面前有 64 × 64 根水管分成两列,其中只有一组水管可以联通,那么请问需 要多少次尝试,我们才可以找到那唯一一组可以联通的水管呢?如果按照经典计算机的思路,我们只有一组一组尝试,左侧列的第一个水管与右侧列的第一个水管联通,如果不行,保持左侧列的第一个水管不变,将右侧列水管换成第二个。这样依次比较下去,直到找到可以联通的两根水管。极端情况下,我们需要尝试 64 × 64 次才可以找到。而量子计算机则大不一样,它可以同时表示 64 根水管,因此一次尝试就可以找到那唯一匹配的结果。通过以上对量子计算机在存储及计算两方面的解读,你是不是也对量子计算机时代的区块 链产生了某种担心呢?不过要我说,这些担心仅仅是杞人忧天,你相信吗?这不仅是因为量子计算机还仅存在实验室环境中,离真正的商业化还很远,或许我们这一代人都不一定 能够赶上。另一方面,量子计算机在发展,区块链难道就会原地踏步吗?这几乎是不可能的,现阶段,我们主要担心量子计算机可以瞬间把以比特币为首的、使用 PoW 共识算法的区块链 的奖励都挖完,从而让其他矿工无币可挖;或者使用量子计算机破解比特币的公私钥,盗取其他用户的比特币。

你可以停下来稍加思考,刚才说的担心真的有道理么?其实在我看来也是多余的。先不说现阶段的量子计算机,它能否完成哈希计算或者破解非对称加密算法,而且也这样推理忽 略了区块链协议的作用。我们以比特币为例分析一下,你就懂了。

比特币协议中就有这样的规定:不管全网络的算力如何变化,区块的出块速度应保持在平均 10 分钟左右,如果出块间隔较短,则会加大挖矿难度,如果出块间隔较长,则会降低难度。而如果量子计算机加入挖矿,出块间隔势必变短,因此挖矿的难度会增加。即便增加的难度不足以难倒量子计算机,也不过是后续所有的区块奖励都由量子计算机获得,瞬间 将比特币挖光的情况并不可能出现。

再者,为什么比特币不能通过硬分叉的方式将现阶段的密码算法换成与量子计算机匹配的抗量子密码呢?量子计算在发展,区块链技术也不会原地踏步。我相信,车到山前必有 路,终归会有解决之道。

智能合约安全#

最后,我想特别强调的一点是智能合约安全方面的遗憾相比前面两个问题,或多或少都是因为技术本身或者其他威胁造成的,而智能合约安全完全是人的问题。

智能合约是软件工程师基于以太坊等区块链平台自主编写的程序代码。而我们都清楚,天底下几乎不存在没有 BUG 的软件系统,智能合约当然也不例外。可以说几乎每天都存在因 智能合约编写不规范而造成的攻击事件,不过是或大或小的差别罢了。就比如前面课程中提到的直接造成以太坊分裂的 The Dao 合约攻击事件,我们在这里可以列出该合约中有漏洞的代码,其实逻辑很简单。

  • function withdrawBalance() {

  • amountToWithdraw = userBalances[msg.sender];

  • if (!(msg.sender.call.value(amountToWithdraw)())) { throw; }

  • userBalances[msg.sender] = 0;

  • }

结合代码我来给你做个解读,这里要表达的意思是,如果用户需要提款,先给用户打款再将用户的余额清空。然而打款这一步骤会递归调用该方法,因此逻辑一直卡在打款那一 步,而用户的余额一直没有被清空,悲剧就此发生。而其实解决方案也很简单,将两步动作调换顺序即可。

image

所以,后续如果你有机会编写智能合约,就需要时刻谨记要搞懂你写的每一行代码,否则有漏洞的智能合约对黑客来说就是一份诚意满满的馈赠。总结这一讲我们通过三个例子,说明了区块链技术虽然已经发展了十多年,仍然存在不成熟的地方。但问题的出现也仅代表着当前所处的困境,并不是无法改变,技术总是在不断的迭代向 前,每一次的技术更新其实都是服务于实际问题的破解,当前的遗憾并不代表着后续无法美好。

目前的区块链行业,个人认为市场在关注以下几个方向

  • 1. 更强大的性能:比特币转账成本越来越高,本质上是数据库的性能越来越差。

  • 1. 真正解决更多实际问题:目前大家对区块链认知仅限于比特币,还没有另一个现象级的应用。

  • 1. 更加易用:目前使用区块链应用是有学习成本的,小白根本无法使用

区块链 + 电商#

通过前面的解读,我们已经对行业链这个概念建立了初步认识。接下来,我会从区块链 + 电商这个角度,设想一下行业链到底要如何运作。开始具体内容前,我需要先给你打一剂 预防针,接下来的内容纯粹是我自己的脑洞大开,而且在未来,也不太可能会出现去中心化电商行业链,毕竟牵扯面太广。之所以还是要讲,是因为区块链的发展,或者说区块链的推广不能仅靠墨守成规,应该勇于去突破思维定式。希望你也一样,不要被现实束缚。

电商行业链和传统电商最主要的区别是什么呢?用一句话概括,就是利用智能合约的标准化思路,规范电商行业流程。具体怎么理解呢?我们可以将电商行业中的流程进行抽象,形成智能合约标准,每个标准可以有不同的实现,最终呈现的效果就是,电商行业的参与者可以任意组装跟自己角色相 1/8/27 14 | 区块链 + 电商:如何实现在线购物新体验?关流程的不同智能合约实现。 举个简单的例子,用户可以采用阿里的商品聚合服务进行商品的搜索并下单,使用微信支付进行付款,指定京东物流进行配送。听到这里,你是不是有些向往呢?为了给你更直观的感受,我以书籍这类商品为例带你展望下电商行业链的设计思路。现阶段,在电商领域,区块链应用做得最成功的案例无疑是商品追溯平台。利用区块链技术的不可篡改及可追溯特性,可以实现对单个特定商品自原材料到用户手中,整个生命周期全流程的追溯。我们可以基于商品追溯应用,顺着追溯的思路,分析一下行业链的特点。

image

而这其中描述的书籍印刷的过程,我们就可以抽象出商品生产智能合约,如果你还记得智能合约章节中的NFT,就会发现其实已经有了实现路径。商品的生产商在行业链的流程中,每生产一个商品,就将该商品对应的资产信息(包括但不限于商品基础信息,比如资产编码、出厂价格、分类等等)进行上链,之后商品就可以由此进入市场进行流通。这是行业链和现有商品生产模式最基础的差异,现有商品生产基于流水线进行批次化生产,比如批量生产一万册书,每册书的商品编码可能都是一个。但在行业链上流转的不是商品类别,而是一个个独立的唯一商品,可以做到一物一码。 那这样有什么好处呢?行业链是价值网络的前置阶段,如果其上流转的也是资产,也便于后续价值网络的普及。所以简单来说,行业链是特定行业的价值网络,而价值网络是所有行业链的集合。

渠道分发 出版社把书籍印刷出来以后,就可以根据不同的电商渠道分发不同数量的书籍。在行业链中,这一过程其实并不是必须的,这是为什么呢?通过前面对行业链的解读可以发现,行业链其实是在弱化企业的存在感,也就是在淡化渠道的概念。渠道主要是为商品生产商与用户间建立买卖的平台,而区块链去中心化特性恰恰是在抑制中间商。

而在这个阶段,我们可以抽象出商品分发智能合约,可以简单的理解为批发。在链下,是将商品从生产商转移到渠道商仓库,而链上是将商品的所有权从生产商转移到渠道商。但要注意,这里要做到链下商品的仓储周转与链上所有权的协同转移,什么意思呢?行业链中的每件商品都是具备资产属性的,并不能简单以数量进行商品的调拨,而是链上的资产与链下的商品要匹配,否则就有串货的风险。

在出版商将书籍资产信息上链以后,在行业链中的其实就有了该书籍的信息。不过对用户来说,在商品种类繁多的行业链中,搜寻书籍无疑是大海捞针,因此就有必要抽象出商品聚合搜索智能合约标准,方便用户浏览、搜索商品。此时平台的作用,就是基于聚合搜索合约,将行业链中的商品个性化地呈现给用户。而用,也可以根据自己的需求定制合约,比如只关 注特定书籍类别。

看到这里你可能有所疑惑,这似乎跟现在的电商平台区别不大,并没有什么新的体验?那我们就用前面说的大数据杀熟这个问题来说明,现在电商平台之所以能够杀熟,基本上是依靠用户历史购买记录推断出用户的购买意愿,再利用平台与用户间的信息不对称和用户对平台的依赖性,使用户在无形中被带节奏,从而以较高的成本购买商品。而行业链支撑的电商平台则有所不同,首先用户的历史购买记录属于个人隐私,用户可以使用智能合约对数据进行定向授权,在用户未授权平台获取这部分数据之前,平台无法提前得知用户的购买倾向,进而也就无法进行商品推荐。 另外,关于商品的这部分信息在链上应该是公开的,任何人都可以查看,因此也就不存在平台与用户间的信息不对称。只是平台更有技术实力能够将商品从繁杂的商品库中聚合出来而已,而一旦用户对平台的聚合服务不满意,也可以随时切换另一个智能合约实现,抛弃原有平台。也就是说,电商行业链对平台是苛刻的,但却可以为用户带来较好的体验。

书籍订购 而在用户找到想要的书籍后,就到了下单进行订购支支付这一环。在这个阶段,我们可以抽象出很多智能合约标准,比如库存扣减合约,支付合约,物流合约等等。其实这些合约都从属于同一个订单合约。从务逻辑分析,购买商品的本质就是用户跟其他各参与方签订了合同协议,合约内容可以理解为如果商品所有权转移给用户,之后选择某某物流公司送达以后,用户就会把锁定在合约中的货币按商品价格组成,分别释放给平台,商家及其他参与方。通过刚才的讲解,我简要为你梳理了书籍生产到用户订购的过程,描述了我对于电商行业链生态的理解。描述的内容并不专业,你也不必过于纠结其中的细节,比如商品如何划拨,又该如何退货退款等等。你只需要理解,在电商行业链中,商品信息在同一条区块链网络中共享,电商平台的竞争逐步就表现为对链上数据的聚合、分类及差异化营销。

  • 现阶段具有某些业务往来的企业逐渐联盟起来形成小范围的联盟链试点,一旦新型业务模式形成,势必会有其他企业加入,小联盟逐渐壮大,从而形成以核心企业为主导的业务联盟链。

  • 而随着核心企业业务联盟进一步扩大,多个核心企业所围拢的多条联盟链也会因为业务需求、监管要求统一成一条超级行业链。其最终形态是业务流程的标准化以及实现的差异化,企业间的竞争,将会逐步变成拥有相同数据情况下的差异化服务竞争

image

ERC-20、ERC-721、ERC-1155、ERC-46 代币标准和可组合性#

ERC-20、ERC-721、ERC-1155、ERC-4626、ERC - 之类的,不知道各种以太坊代币标准是什么?为什么这些标准很重要?有兴趣了解哪些代币标准都服务于什么目的?想要了解整体情况?这个长推为你解答

image

  • 以太坊是一台世界计算机。它是由匿名和不受信任的节点组成的网络所维护的共享资源;通过共识达成一致,并且在经济上保障网络的安全。以太坊网络提供可信的中立性,任何人都可以在上面独立和协作构建。

  • 应用程序编程接口(API)是一种不同程序进行通信和开发者进行协调的机制。开发者会尽可能地隐藏他们程序的内部工作。通信被最大程度地简化和改进。

计算机科学基础:API 解释

从抽象(abstraction)的角度来说,API 是抽象在现实世界中的最常见的表现方式。一个 API 是一组定义好的规则,解释了程序 / 应用如何与彼此进行通信。

举个例子,我们设想一下,一个电商网站有一个价格机器人;用户向价格机器人给出水果的特质,而机器人会返回一个价格信息。

为了用价格机器人整合信息,你需要给它一个对象(水果)信息,并接受一个价格。因此,首先需要打包所有的对象信息:fruit_a = [apple, red, 200g, harvested 3 days ago]

,我们需要将这些信息喂给价格机器人。首先,我们调用(price_bot),接着通过让 price_bot 使用 calculate_price 的函数计算 fruit_a ,从而给我们一个价格,即 price_bot calculate_price (fruit_a)。

price_bot 将倾其所能计算出价格。作为用户,我们不知道也不关心屏幕背后发生的计算,我们只知道,最终 price_bot 会给我们一个的价格,即 price_bot.calculate_price (fruit_a) = price_fruit_a。

这就是价格机器人的 API:一个价格机器人支持的函数列表和如何使用他们的说明。这是一个示意图,由此开发者可以在无需掌握应用程序的情况下集成它。假设这个例子是真实的,那么这个 API 的文档应该是这样的:

在世界计算机中,我们到处用得上 API:

  • 集成协议

  • 转移资产

  • 构建可组合的投资

  • 借入、借出和抵押资产

基本上,所有链上发生的事物不是 API 就是直接由 API 整合。事实上,你可以将不同类型的代币标准视为符合某个 API 模板的一段代码。如果智能合约遵循了特定模板,那么它就是那种代币。(https://t.co/GoMlbfN9Vq)

ERC-20

这是 ERC-20 的代币模板。为了生成一个 ERC-20 智能合约,开发者需要创建用来执行下面所有的方法和事件的代码。所有 ERC-20 合约都支持这些函数;一位(不同的)开发者可以依靠下面这些来使用任何 ERC-20 合约。

image

ERC-20 是最为基础的代币标准,代表着当前大多数有效代币。它包括了治理代币、ve-toke (投票托管代币)、稳定币等。(ETH 不是 ERC-20 代币。)

image

ERC-721#

ERC-721 代币一般被称为 NFT(非同质化代币)。这些代币(通常)代表着收藏品内独一无二或者可识别的物品,包括 PFP、艺术收藏品、财产等。

ERC-1155#

ERC-1155 代币标准结合了 ERC-20 和 ERC-721 代币标准的特性,提供了一个单一接口来管理这些代币类型的任何组合。这可以用作一个更现代化的 ERC-20 和 ERC-721 替代方案,并且具有服务于游戏的独特功能。

ERC-4626#

ERC-4626 是最新的代币标准,描述着有收益的金库。该标准为存入金库(或从金库赎回)的 ERC-20 代币提供了一个共同接口,以获得收益。这可以包括流动性挖矿和聚合,但还可以用到更多领域中。

ERC-777#

ERC-777 是高度可配置却很少被使用的代币标准。它为 ERC-20 提供了升级,允许开发者附加在发送和 / 或接受代币时运行的代码。尽管它被纳入在 https://ethereum.org,但我们在实践中很少看到 ERC-777。

,计算机科学是魔法,开发者是魔法师,而抽象就是咒语。可组合性则是目标

抽象这一概念支撑着世界计算机展现其最重要的能力。

DeFi 之所以是一种更好的方式 —— 可组合性:是指让两件独立的事物的组合超过它们部分的总和的一种能力。

原生 ETH ..... ERC-20、721、777、1155、4626...... 随着每次 ERC 的增加,我们正在变得更加先进。每一种代币类型可以拥有更多的功能,每一个金钱 Lego 都将带来更多增值。

每个 ERC 标准的增加都将让我们更加靠近可编程的货币。可编程的货币是全新的概念。如果货币是具体的、可编程的,就像乐高一样。每一个协议会吸收塑料(即价值)并生产乐高积木(通常是钱)。这些积木可以和其他的积木结合在一起,创造某些定制的、全新的事物。

可编程的货币是全新的概念。如果货币是具体的、可编程的,就像乐高一样。每一个协议会吸收塑料(即价值)并生产乐高积木(通常是钱)。这些积木可以和其他的积木结合在一起,创造某些定制的、全新的事物。 代币标准指的是可组合性如何在以太坊上展现(的一种方式)。哎呀...... 我们都是构建者!不然你们觉得我们还会构建什么???

:可组合性。我们之所以能拥有可组合性:抽象抽象的目的:管理复杂性管理复杂性有什么意义?—— 改变世界。

过去十年来诞生的最强密码学技术大概要数通用简洁零知识证明,通常称为 zk-SNARK(zero knowledge succinct arguments of knowledge)。

zk-SNARK 允许你生成一个证明 (这个证明是针对一些运算得出的特定输出,可用于对该运算的验证),通过这种方式,即使底层计算十分耗时,该证明也可以被快速验证。“ZK”(零知识)为证明新增了一个额外特性:证明可以隐藏计算的某些输入。

例如,您可以对以下声明生成一个证明:“我知道一个秘密值,如果你将数字添加到挑选的单词 cow 的末尾,然后对其进行 1 亿次 SHA256 哈希运算,那么输出的哈希值以 0x57d00485aa 开头”。个秘密值,如果你将数字添加到挑选的单词 cow 的末尾,然后对其进行 1 亿次 SHA256 哈希运算,那么输出的哈希值以 0x57d00485aa 开头”。

验证者验证该证明的耗时可远小于自行进行 1 亿次哈希运算的耗时,而且证明也不会泄漏秘密值。

在区块链领域中,该技术有两大应用场景:

  • 可扩展性:如果一个区块的验证十分耗时,某个人可以验证区块并生成一个证明,而其他人只需快速地验证证明即可

  • 隐私:你可以证明你有权转移某些资产(你收到了该资产,而且你还没有转走),而不透露该资产的来源。这不会对外泄漏交易双方的信息,确保了交易的安全性。

然而,zk-SNARK 是相当复杂的;实际上,就在 2014-17 年,它们还常被称为 “月亮数学”。好消息是,从那时起,协议愈发简化,我们对它们的理解也愈发深入。本篇博客将试图以一种数学水平普通的人能理解的方式来解释 ZK-SNARKs 的工作原理。

在区块链领域中,该技术有两大应用场景:

  • 可扩展性:如果一个区块的验证十分耗时,某个人可以验证区块并生成一个证明,而其他人只需快速地验证证明即可

  • 隐私:你可以证明你有权转移某些资产(你收到了该资产,而且你还没有转走),而不透露该资产的来源。这不会对外泄漏交易双方的信息,确保了交易的安全性。

然而,zk-SNARK 是相当复杂的;实际上,就在 2014-17 年,它们还常被称为 “月亮数学”。好消息是,从那时起,协议愈发简化,我们对它们的理解也愈发深入。本篇博客将试图以一种数学水平普通的人能理解的方式来解释 ZK-SNARKs 的工作原理。

  • 注意,我们将聚焦于可扩展性;一旦有了可扩展性,这些协议的隐私性就相对容易实现,因此我们将在最后回归这个主题。

为什么 ZK-SNARK “会” 很难

以开头例子为例:我们有一个数字(我们可以将末尾跟着秘密输入的 “cow” 整体编码为一个整数),我们计算该数字的 SHA256 哈希,然后重复做 9999999 次,最后我们检查输出的开头。这里面的计算量特别大。

一个 “简洁(succinct)” 证明指的是证明大小和验证耗时的增长远慢于需验证计算量的增长。如果我们想要一个 “简洁” 证明,我们就不能要求验证者在每轮哈希中做一些运算(因为那样的话,验证耗时将与计算量成正比)。

相反,验证者必须以某种方式检查整个运算过程,而不必窥视运算过程中的每个部分。 有一种自然的技术就是随机抽样:让验证者只在 500 个不同的地方检查运算的正确性,如果所有的 500 个检查都通过了,那么认为运算过程的其余部分也大概率没问题?

该流程甚至可以通过使用 Fiat-Shamir 启发式(Fiat-Shamir heuristic)转化为非交互式证明:证明者计算运算过程的默克尔根,基于默克尔根伪随机地选取 500 个索引,并提供对应的 500 个默克尔分支。

核心思想是证明者并不知道将要揭示哪些分支,直到他们已经对数据生成了 “承诺”。

如果恶意证明者在了解到需要检查哪些索引后试图篡改数据,那么这会改变默克尔根的值,而这将导致一组新随机索引被选出,这将需要再次去篡改数据... 让恶意证明者陷入无休止的循环中,无法达成目的。

但不幸的是,简单地随机抽查运算过程存在一个致命的缺陷:运算过程本身并不健壮。如果恶意证明者在计算过程中的某个位置翻转一个比特,可以导致一个完全不同的结果,而随机抽样验证者几乎永远不会发现。

image

只需一次故意的插入错误,就会导致计算得出完全错误的结果,而这几乎不会被随机检查所捕获。

image

如果要提出一个 zk-SNARK 协议,那么很多人会走到上面这步,然后陷入困境,最终放弃。不单独查看每个计算片段的情况下,验证者究竟如何才能够校验每个计算片段?事实证明,有一个绝妙的解决方案。

多项式

多项式是一类特殊的代数表达式,具有以下形式:

image

只需一次故意的插入错误,就会导致计算得出完全错误的结果,而这几乎不会被随机检查所捕获。

如果要提出一个 zk-SNARK 协议,那么很多人会走到上面这步,然后陷入困境,最终放弃。不单独查看每个计算片段的情况下,验证者究竟如何才能够校验每个计算片段?事实证明,有一个绝妙的解决方案。

多项式

多项式是一类特殊的代数表达式,具有以下形式:

image

从这里开始,我们简单地用 SS 重复上面的游戏,逐步 “降低” 我们关心的多项式的阶,直到多项式的阶低到我们可以直接校验的程度。

image

我们能再回顾一下吗??

最优秀的三类多项式承诺是 FRI、Kate 和 bulletProof。

Kate 在概念上是最简单的,但它依赖于非常复杂的椭圆曲线配对 “黑盒”。

FRI 很酷,因为它只依赖哈希;它的工作原理是将多项式逐渐归约为阶越来越低的多项式,并在每步进行随机抽样检查,使用 Merkle 分支来证明等价性。

为了防止单个值大小的膨胀,我们不在整数上做算术运算和多项式运算,而是在有限域上做所有事情(通常是对一些素数 图片 进行模运算)

多项式承诺天然支持隐私保护,因为生成的证明已经比多项式小得多了,因此多项式承诺只能暴露多项式中一点点信息。但我们可以往多项式添加一些随机性,将暴露的信息从 “一点点” 减少到 “零”。

哪些问题仍在研究当中?

  • 优化 FRI:已经有很多涉及精心挑选的取值域的优化,“DEEP-FRI”,以及一系列其他让 FRI 更高效的技巧。Starkware 及其他人正在研究这块。

  • 将计算编码为多项式的更佳方法:找出将涉及哈希函数、内存访问和其他特征的复杂计算编码为多项式等式的最高效方法仍是一个挑战。在这方面已经取得了很大的进展(例如,见 PLOOKUP),但我们仍需更多的进展,特别是如果我们想将通用虚拟机执行编码为多项式的话。

  • 增量可验证计算:如果随着计算继续能够高效地 “扩展” 证明,那就太好了。这在 “单证明者” 情况下很有价值,而且在 “多证明者” 的情况下也很有价值,特别对于不同参与者创建区块的区块链而言。最近一些在这方面的工作,请参见 Halo。

  • 原文链接:https://vitalik.ca/general/2021/01/26/snarks.html

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.