为何自定义密码学原语对在区块链上的开发相当重要?

区块链是一个基于密码学、经济学和网络科学的新技术。对于通常的大众来讲,其中的密码学并非一门容易亲近的学科,甚至是上面提到的三个学科中,你们以为最有距离感的学科。但身处区块链圈的朋友们必定会经常听到「区块链是一部 Trust Machine」这样的说法,或者有人会说在区块链的世界里是「In Math we Trust」,可见密码学对于区块链技术来讲是根基同样的重要存在。 git

好了,那么问题来了:github

  • 区块链究竟在哪些地方用到密码学呢?
  • 密码学为何对区块链技术相当重要?

区块链的哪些地方用到了密码学?

首先,若是你是一个区块链用户,可能在你房间里的某个角落,会有一张纸条,上面抄着十二个不知道怎么来的单词,有的人还有不少张,甚至有些大 holder 会把这十二个英文单词刻在钢板上,而后锁进保险箱里。 算法

是的,为何这十二个助记词,或者像一长串乱码般的私钥可以表明你对资产的全部权呢? 编程

这背后的原理其实就是密码学。 安全

咱们的密钥、地址和钱包都是经过密码学去实现,利用非对称加密技术——椭圆曲线算法(ECC)能够验证某人持有的私钥是不是吻合某个公钥,经过这个方式咱们能够证实这我的是不是这笔加密资产的持有人,由于除了拥有私钥的人以外,其余没有该私钥的人是没有办法解锁这笔资产的。 网络

咱们在此用比特币举例私钥、公钥和地址生成的原理,一个比特币钱包中包含一系列的密钥对,每一个密钥对包括一个私钥和一个公钥。私钥一般是一个随机选出的 256 位的数字。基于私钥,咱们就可使用 secp256k1 标准的椭圆曲线这个单向密码函数产生一个公钥。基于公钥,咱们又可使用一个单向哈希函数 SHA256 和 RIPEMD160 生成比特币地址,再经过 Base58 check 编码将比特币地址变成如今这较为简洁的形式。而像咱们比较经常使用的助记词,则是经过基于 BIP 39 标准而生成的随机英文单词。若是没有私钥或助记词的人,是没法使用这笔加密资产的。函数

image.png

比特币的公钥和地址的生成过程工具

(图取自精通比特币) 性能

当咱们有了能够配对的密钥对后,能够在各类类型的钱包或者客户端上作验证,确认资产的全部权,而且经过这个客户端来进行各类资产的使用。例如最简单 BTC 转帐,或者再进阶一点的用某个钱包去签署智能合约的交易:好比用 Metamask、imToken 或者 Alphawallet 等钱包里的 ETH 去购买加密猫,或者在 DeFi 的平台上面进行借贷,以及用 Uniswap 交换某些 ERC20 Token 等。 学习

除了转帐等基本的验证外,如今甚至某些平台的身份验证均可以用公私钥来作登陆验证,或者经过验证你是某笔资产的全部人来进行各类权益的证实。简单来讲,公私钥验证系统背后的密码学就是用户想畅游区块链世界的通行证

在区块链中,还有另一个不可忽视的密码学使用场景,就是区块中的交易排序以及 Merkle Tree 等决定区块排序的过程。比特币就是将每笔交易用 SHA256 算法进行加密,在这里加密算法确保了区块链的安全性,以及几乎不可能被篡改的特性。光是在这两个比特币的基础使用场景中就都用到了密码学,因而乎甚至还有许多人在猜想,中本聪多是个密码学大佬,才可以把密码学在这个点对点的现金系统中使用的淋漓尽致。

固然,除了在区块的生成和公私钥验证这两大区块链的核心功能上能够发挥用途以外,密码学在隐私保护甚至扩容等方面均可以派上用场。

如今的公链如何使用密码学?

  • Wow,这是一条新的公链吗?
  • 那它有没有钱包啊 ?
  • 又要多一组新地址和抄一组新的助记词了。。。

若是一个用户真的愿意本身好好地保管本身的资产,也勤于投资不一样的公链,我相信他们必定也会有相似的经验和好几组不一样的助记词或私钥。但到最后,他们可以保存好的,可能只剩下那些最主要的持仓资产,有些人甚至忘记备份某些资产的助记词。

长期下来,区块链资产管理的问题也致使区块链的门槛愈来愈高。因此一些钱包为了解决这个问题,已经提出了不少的优化方案。有些钱包甚至能够作到一个身份钱包的单一助记词,能够管理多种资产等功能,但仍然有许多组不一样的地址必需要由用户来作管理。这样的问题对于不少新公链而言可能更为严重,由于若是用户要去经过他们的网页或手机钱包,去尝试链上的应用,用户就会增长许多管理公私钥的成本,更况且他们不像邮箱的密码同样能够任由用户本身定义,既不滑顺也不香。

但为何区块链会有这样的限制?

这样的限制是由于目前许多的公链,都将不少密码学原语的使用场景写入了共识层,所以在这些公链中,像公私钥签名、客户端验证,以及区块生成的哈希和经常使用的加密算法,基本上都是镶嵌在共识层中的。例如地址所使用的验证、交易使用的签名等,其实都写在底层协议中,所以会变得很是难以改动。另外,许多公链的虚拟机性能都不足以支持灵活的密码学原语部署,所以对于这样的公链而言,若是底层的虚拟机不预先支持某个密码学原语,那么基于该密码学原语的场景可能很难直接被开发者使用。

若是要更动,惟一的办法就是硬分叉!

拿以太坊为例,以太坊的共识层写入了哪些密码学的场景呢?

除了区块的加密签名和 Merkle Tree 的哈希外,还有交易签名和客户端的验证。若是有任何人想要在这些点上作改动,例如将以太坊公私钥的哈希算法 keccak-256 换成其余签名算法,那么惟一的办法就是提一个 EIP (Ethereum Improvement Proposal),而后等待、祈祷这个提案被排入硬分叉之中。由于写在协议层的内容,就是全网的全部用户都必须听从的规则。

然而硬分叉每每须要很是长的时间,以 EIP 152 为例,这是一个 2016 年就提出的提案,但愿将签名算法 BLAKE2 加入以太坊中,但直到 2019 年末的伊斯坦布尔提案中才被加入到升级的内容当中,整整历时 3 年之久

从刚才 EIP 152 的例子中咱们还会发现另外一个限制,那就是在以太坊上若是要使用虚拟机不支持的密码学原语,几乎是不可能的。由于对于以太坊虚拟机而言性能是一大限制,光是简单的运算,就可以消耗大量的 gas。

所以咱们若是回顾以太坊上历次的分叉,就能够发现从家园(HomeStead)的硬分叉升级开始,以太坊就不断地把全部可能经常使用到的密码学原语,例如 sha256 hash、ripenmd160hash 等持续的经过预编译(precompiled)的方式,加入到底层的虚拟机中。这点在拜占庭(Byzantium)或者伊斯坦布尔(Istanbul)的升级中也能够看到。以太坊经过硬分叉的形式,来预编译密码学原语以及这些密码学原语运算的 gas 订价。

若是不经过预编译合约在节点先进行实现,那么许多签名算法的智能合约部署将花费很是很是高的 gas 费,致使其根本没法部署。例如 EIP 19六、 EIP 197 之因此被采纳,就是预见了 zkSNARK 须要大量的 gas 进行链上的运算。所以预先将这些加密算法,如椭圆曲线加法、乘法和配对验证等编译进了底层的 EVM 中,好让这些计算成本能够节省下来。因此,咱们能够说在以太坊上除了已经作了预编译的签名算法外,其他的加密算法基本上是没办法使用的。

上述这些固化的密码学使用方式,对于开发者而言是一个很大的限制。

因为交易和客户端的签名验证都被写入共识层,所以验证工具和流程都必须按照规定的加密算法进行。例如在比特币或以太坊中,若是咱们要建立一个帐户,那么咱们依旧须要管理一组新的密钥对。

对于想要带来良好用户体验的开发者而言,这样会产生不少的限制,而且须要经过其余方式,去弥补固化的底层设施带来的不友善的用户体验。好比在建立助记词以后,咱们能够在某些钱包中使用 FaceID(如 imToken),好比在 ABC Wallet 中,用户起初只须要靠像手机里的六字验证码就可以登入,等你真的以为你须要把私钥或助记词导出了,再进行导出和备份。

这些都是开发者试图提高用户体验所想出来的好办法,但对于每一条新的公链,密钥对管理的本质都是须要有一组新地址和密钥,这个问题是一直存在的。

上述的公私钥验证方式不够灵活的问题,在比特币、以太坊等较为先发的公链上或许还不明显,由于他们已经有既有的用户,这些用户也被折磨习惯了。但对于近期兴起的公链而言,若是还存在和先前公链一样的进入摩擦成本,那么就是给用户设置了障碍,也会影响开发者是否想要在这个公链上开发的意愿。

一个对用户有学习成本的公链,在获取用户上就存在着先天的壁垒,即便这些公链有其余的亮点,可能对于开发者而言,也不会那么有吸引力,由于他们知道不少的用户可能都被这些不友善的用户体验给吓走了。

另外,密码学原语不可以灵活使用的问题,影响的层面还不止于公私钥的保存。对于开发者而言,若是之后他们想用更先进的密码学原语来保证隐私及安全,同样会面临到底层的虚拟机能不能部署,以及支持签名验证的挑战。固然还会影响目前你们讨论的很热的话题:跨链,由于不一样的链使用的密码学原语也会有所不一样,在虚拟机验证交易时就会遇到这个难题,这也是为何目前许多同构跨链的解决方案(Cosmos / Polkadot )可行,但对于异构跨链的方案却停滞不前的缘由。

Nervos 的设计有何不一样?

在 Nervos CKB 中,除了交易排序外,没有其余硬编码的密码学原语,资产全部权的验证是经过 cell 中的 lock script 来作验证,其中的验证规则和使用的密码学原语都是能够自定义的,所以几乎全部的密码学原语均可以被开发者灵活的使用。

套用一句 Nervos 研究员 Cipher 老师的话来讲,就是:「在 CKB 上除了最基础的交易排序之外,其他都是应用层的内容。」这让开发者拥有了很是大的开发弹性,去进行各式各样的开发,例如更自由的帐户验证方法等。

由于在基于 RISC-V 的 CKB-VM 中,要求的就是一套可以符合 RISC-V 编码的验证规则而已,开发者有不少可以自由挥洒的空间。下图能够看出 Nervos 和其余能够支持智能合约的公链在灵活度上的差别,应用层的内容表示的是能够去作自定义的,协议层表明的是须要通过「分叉」才能改动的内容。

1591691785720.jpg

以目前 Nervos 的 Grnats 团队 Lay2 为例,为何他们开发的 pw-sdk 可以用以太坊的地址,甚至是 ENS 来接收 CKB?是由于在 CKB 上,地址是开发者能够任意把玩的应用层内容。理论上只要链上有已经有验证规则的 cell 和非对称加密的加密算法库,这种地址生成规则就可以被验证。例如咱们能够把以太坊的 Keccak-256 (SHA-3)的签名算法和验证规则和比特币的 SHA-256 都部署在链上,那么将来的其余开发者就能够用 cell deps 进行调用。

也所以,任何的开发者将来若是想在 CKB 上 ,为他的资产添加更先进的加密算法作为解锁的规则,是彻底可行的。由于任何人均可以部署各类密码学原语库在 CKB 上,而且能够经过优化去节省存储空间以及减小验证所需的 cycle 去下降部署的成本,让任何先进的密码学原语不用等到硬分叉也可以被使用。

在 CKB 上可能看见的区块链将来:直逼互联网的用户体验

基于灵活的密码学原语,咱们能够说在将来,不少互联网上用户很是习惯的验证规则,也彻底可能被写成 RISC-V 能够读取的形式,而且被部署到链上,例如 PGP Key 验证或者指纹解锁等功能。若是在链上有一个可以对应他们所使用的验证标准的脚本,而且有能够支援这种验证的可信环境,那么如此方便的使用方式在将来是真的可能实现的。

再更深刻一点地看,将来的应用层,会有更多的场景会使用到密码学的各类算法。

近两年在分层扩容的领域(Layer 2),除了原先的闪电网络、状态通道以及其余的侧链解决方案以外,又出现了一种新兴的密码学扩容应用:Rollup,也就是利用签名算法来压缩交易。

目前在 Rollup 上最主流的压缩交易的方式是零知识证实 (zkp),也就是所谓的 zkRollup。将来若是在 Rollup 上有其余更先进的零知识证实解决方案,或者利用其余去签名算法(如 BLS 等),对于 CKB 而言,只要开发者能够想到低成本的实现方法,均可以直接让 CKB-VM 验证,而不须要经过硬分叉。由于这并不涉共识层的内容,并且 CKB-VM 相较于 EVM 而言也更加地高效。目前安比实验室也在开发在 CKB 上可以使用的零知识证实库,将来可供开发者任意使用。

另外,CKB 由于能够支持灵活的密码学原语,也在区块链跨链资产转移方面,比其它的公链有更大的先天优点进行来自不一样链的交易验证,让 CKB 更有机会完成异构跨链的资产流通与转移。

打从中本聪的比特币白皮书问世开始,区块链就是一个能够在中心化的环境下用密码学去证实共识的新技术,这是在互联网上没法完成的事情。但要大规模的使用区块链,咱们要作的不是让用户在体验上委曲求全,而是像 Lay2 团队的 Frank 说的那样:「咱们须要一个可以有能力去支持开发者‘开门迎客’的基础设施」,让区块链不会由于底层设施的不灵活,而成为少数极客或圈内人的玩物。

公链若是可以灵活的支持各类密码学原语,让开发者能够有更高的弹性,那么就更能够跳过「教育用户」的这个缓慢的过程。由于就和互联网同样,虽然如今你们都是无网不欢的人,但对于纯粹的 C 端用户而言,他们依旧不须要知道互联网到底分了几层,或者 P2P 网络是怎么回事。

一样的,区块链的纯 C 端用户在使用区块链技术时也不须要知道区块链的底层知识,咱们要作的是打造一个能够拥有互联网体验,又有区块链的凭证,以及安全和去中心化等加成效果的基础设施,而具备高度编程灵活性的 Nervos CKB 正在这条道路上奋勇向前。

感谢 Lay2 的知县,SECBIT 的志鹏,史迪仔等人对本篇文章的意见和启发

Source:


相关文章
相关标签/搜索