首页 > 技术 > 区块链

老司机看substrate | 区块链开源框架

人阅读 2023-07-02 12:52:01
广告 X
欧意最新版本

欧意最新版本

欧意最新版本app是一款安全、稳定、可靠的数字货币交易平台。

APP下载  官网地址

【老司机看substrate | 区块链开源框架】lot物联网小编为你整理了的相关内容,希望能为你解答。

原文地址 zhuanlan.zhihu.com

自从中本聪 2009 年开启比特币这个潘多拉魔盒,向世人释放出比特(代码)和金钱结合的魔力,10 年来各路神仙(鬼怪)纷纷上场,给区块链带来盛名(污名)之余,也在技术和应用方面留下了很多的探索。 作为一个把玩了比特币、以太坊多年的老司机,并带着团队开发了一个实现了 VRF 的主链 dipperin(htTPS://github.com/dipperin/dipperin-core),对于开发一个区块链和其上的应用还是深有感触的。不久前我离开了 dipperin 团队,但还有很大一部分精力和兴趣在区块链这个领域。最近一段时间有机会深入了解 substrate 这个框架,从一个技术老司机的角度给大家解读和分享我的思考和收获,要说的其实还真不少,因此会有一个系列,可能有 10 几篇吧,从最基础的概念,到带你彻底玩转 substrate,成为 substrate 技术大拿。本文就作为一个开篇,系统的讲一讲我对 substrate 理念的理解,文章有点长,需要一点耐心读完。

1.当我们谈 substrate,我们在谈什么

首先得理解,我们在谈区块链的时候,我们在谈什么。公链、联盟链、通证经济、智能合约等热点纷杂:做应用的说,开发一个火爆全场的加密猫、fomo3D、DeFi、菠菜吧;做技术的说实现一个超牛的算法、突破 TPS 性能瓶颈吧;做投资的说量化、炒币、韭菜、交易所;18 年公链元年,19 年 DeFi 元年,2020 年又会是什么?所以谈区块链,一定要明确从哪个角度入手,在什么阶段(“我是谁,我在哪”),才可能真正有自己的观点,不然只会落入俗套,就跟任何脱离历史阶段谈文明都是耍流氓一样。

谈 substrate 必然会和 polkadot(波卡)联系在一起,波卡是 19 年开始火起来的 “跨链” 项目,谈波卡的时候大多时候是谈跨链,平行链、你大爷算法(GRANDPA)看起来好酷的样子,可是你去问 10 个人关于对跨链的理解,就有 10 个不同的答案,其中一个就是各种非主流链(非 BTC,非 ETH)都不知道哪一个会发展起来,跨链通信的意义在哪里?

而 Substrate 是开发波卡的过程中发展出来的一个区块链开发框架,所以我们谈 substrate 的时候,主要谈的是技术。本文就从一个技术老司机的角度谈一谈这个技术为什么值得关注。

2. 从语言看区块链技术发展的阶段

上图是一个区块链技术发展变迁的语言断代史,可以看到在 C 时代,大家做的最多的是 fork 比特币的代码,改出一个山寨币出来,做出来另外一个比特币,当然也有不多像源于 EOS 这样的石墨烯原创,代码重用基本限制在工程级别。而以太坊就完全摒弃了 C ,投向了 golang 的怀抱,在其开发过程中引用和自身主导了很多网络、存储等 golang 的包,也被社区共享用在其它的项目中,代码重用力度可以做到更细到包级别,但以太坊由于自身在代码结构并没有做到充分的解耦,各个模块之间的关联度很高,在可测试性方面做的也不够好,重用以太坊代码并非一件容易的事情,我们的 dIPperin 主链开发选型的时候就尝遍了这个痛苦,最后通过自己引入有限状态机、中间件设计模式等对以太坊的代码做了很多的修补才能基于它来做自己的工作。也就是在这个时候,我关注到 Gavin Wood 提出来做一个区块链的 framework,他提出的几个理念还真的是击中了只有做过底层链开发的人才能理解的痛点:链上状态机基于 wasm 可以热更,共识算法等高度解耦随时替换,至于一键发链就是自然而然的事情了。

在展开讲 substrate 的三个核心技术点之前,我想对 substrate 和 rails 做一个类比。

3、substrate 和 rail

研究 substrate 的时候,总是让我联想起 rails,二者有很多的相似之处:都是在某一种应用开始发展的时候,各种技术各种方案层出不穷,由一个天才程序员提出来一个集成了过往很多好的想法并做成一个框架用于共享,就连二者的宣传口号都一定程度上相似:15 分钟 xxx。Rails 的火爆催热了 Ruby 这门语言,正如 substrate 必然会带火 Rust 一样。当然 Rails 的高度现在还不是 substrate 可以望其项背的,GW 的历史地位和 DHH 也无法相提并论,主要是因为 Substrate 还年轻着,区块链的应用也还在早期,如果有一天基于 substrate 开发出一个 twitter/github 这样的扛鼎之作,substrate 和 GW 的成就就会是另外一个故事了。

4、为什么需要一个区块链的框架,以及我们需要一个什么样的框架

技术发展都是遵循类似的规律的,先是应用驱动,做出来 BTC,以太坊这样的成功应用,然后就会有人琢磨我是不是也可以做一个更好的应用出来,这个过程中,光是复制粘贴 BTC 以太坊的代码,后面就发现这是不够的,需要把 p2p、trie、共识算法等都可以模块化,方便组合调用,过程中就自然的发展出来框架了。这个框架就是用于开发更多的区块链的,链多了自然就需要一个 “互链网” 来跨链通讯,这个工作交给了 polkadot。所以一个好的区块链框架应该是:把 p2p/trie/db/encrypt/hash/transaction / 等等都封装好了,共识算法可以方便替换,容易添加一个新的功能,系统高度可测,容易部署,文档完备。高兴的是,在 substrate 上看到了这些大部分优点,有些不是那么完美的,也会逐步优化。另外最关键的是,没有其它对手,tendermint 勉强算一个。在这个阶段,大力拥抱一个有活力的开源生态是非常关键的,因为大型商业公司更关注商业变现,在技术选型上也会选择开源,之前一堆公司是站错了队伍,选择了 hyperledger,而遗憾的是基本没有顶级黑客为其贡献代码。所以区块链领域,未来不管是 substrate 或者其它的框架,也一定会有一个框架会得到大量商业公司的支持。

(以下部分文字和图片很多来自互联网)

4.1、substrate 的技术锚之一:WASM

为了根据待定的操作去更新链的状态并改变其存储,我们需要有一个决策点。这些决策点可以表示为一个函数,它接受当前状态和一组待定的操作,并产生另一个应被视为新的状态的状态。在区块链世界中,这样的函数被称为状态转换函数(state transition function),简称 STF。Substrate 可以让你以一种可管理和可移植的方式来定义这样一种功能。跟在网页上执行的 JavaScript 非常相似,你可以编写一组统称为 runtime 的函数,这些函数将充当 STF。此外,这样的实现将是可移植的,并不依赖于处理器架构、操作系统、浏览器,或者任何其他依赖平台的方式。

Substrate 使用 WebAssembly 作为其 runtime 的通用语言,这正是 Mozilla、Google 和 Apple 等大公司目前正在集成的技术,在编写 web 时作为一种更快但仍然兼容的 JavaScript 替代品。用 Wasm 编写链的逻辑和智能合约,意味着你将拥有最好的工具来以快速可靠的方式执行逻辑。但是,Substrate 有一种方法可以更快地执行代码,并且没有任何虚拟机的开销。

Substrate 最革命性的部分是,包含 STF 的 runtime 图像与其他有效载荷一起存储在链上。这意味着 runtime 和整个链的业务逻辑可以以安全和可验证的方式进行更新。更重要的是,由于 Substrate 及其 Runtime Module Library³ 都是用 Rust 编程语言编写的,所以它们可以被翻译成本地代码和 Wasm。

在任何时候,客户端软件都有两个编译 runtime 的副本:一个是在软件中本机编译的,另一个是要在 VM 中执行的 Wasm 图像。执行 runtime 函数时,客户端软件检查 runtime 的链上 Wasm 版本是否与其编译的本机内置版本匹配。这样做后,客户端软件将 runtime 函数的执行委托给本机代码版本。

当 runtime image 在链上更新时,某些客户端还没有更新其软件。在这种情况下,他们的节点将通过在 Substrate 的集成 Wasm 虚拟机上解释 runtime 来执行正确的版本。因此,在任何情况下,网络上的所有节点总是能够正确地同步链(尽管效率不同),从而防止链分叉。

4.2、substrate 的技术锚之二:Libp2p

Libp2p 是一个便于使用者开发去中心化点对点应用的网络框架,它原先是 IPFS 的网络协议延申,如今已自成一家。

与传统网络最大的不同在于,分布式计算不适用 “客户端 / 服务器” 这种模式。典型的 客户端 / 服务器 ”是:在你的家用网络中,每台设备都有个私有 IP ;当你向服务器请求数据时,路由器会用家里的公用 IP 替换掉设备的私有 IP ,同时记下应该向哪一台设备返回数据。Libp2p 负责处理对等网络通信及握手协议。加密和安全性是 WEB3 设计的基础,libp2p 支持非加密传输协议( e.g. TCP、UDP)及加密传输协议( e.g. TLS、 Noise )

Libp2p 从一开始就设计得非常模块化,因此能够部署在不同的点对点网络上。我们通常会以一组 IP 地址及通信端口来描述传统的点对点应用,但 libp2p 使用多重地址的概念。举例来说:

/ip4/90.46.231.22/udp/25000 —— 节点 IP 地址是 90.46.231.22 ,且在 25000 端口上监听 UDP 协议。/ip6/fe80::0202:b3ff:fe1e:8329/udp/1567/quic —— 应该在 UDP 端口 1567 上使用 QUIC 协议传输信息。/dnsaddr/example.com/tcp/80/ws —— 在 TCP 端口 80 上使用 WebSocket 协议,同时以 DNS 服务器解析域名 example.com 。

事实上,使用多重地址的想法就是为了让 libp2p 能够扩展新的协议(就像上面那个使用 QUIC 的例子一样),因此使用 Libp2p 的项目不要求支持所有协议。后续我们希望,比如,将蓝牙通讯加到传输协议中。

Libp2p 模块化的第二个原因主要是针对协议协商过程。一旦两个节点建立通信, libp2p 就只需处理用于连接的协议了。

虽然 libp2p 鼓励节点支持一组通用的协议,但就技术角度出发,这不是必须的。模块化能让 libp2p 工具面对新的协议、想法,及部署新的协议版本时,轻松地支援旧的版本,不需要增加技术负债。

推荐使用 libp2p 的另一个原因是它被去中心化项目所采用。Libp2p 在 IPFS 早期时就提供支持,并且将继续支持多个新兴项目,如 Filecoin 、以太坊 2.0 、 Agoric,当然还有 Substrate 和 Polkadot 。多个项目共用同个网络协议的优势在于:节点性能能够在多个网络中共享。Libp2p 设计的初衷就是为了支持未来的去中心化网络协议,它的宗旨是让开发者进行应用程序开发时,能确保他们的服务是可达且可用的。Libp2p 在 Rust 、JavaScript 和 Go 语言上完成实现,在 Java, Haskell 和 Python 上的开发也正快速地推进中!

4.3、substrate 的技术锚之三:Rust

Rust 本身的语言特性(安全、高性能、并发编程)与区块链的特性(分布式、加密、安全敏感)天生有相当大的重合性。不仅如此,Rust 作为一个编程语言显得不同,不是因为它的语法多么漂亮(实际有些人甚至觉得有点丑)或者社区多么受人欢迎,而是因为当用它写代码时获得的那种信心。厉害的是,Rust 在实现内存安全和并发安全的同时,并没有以损失性能为代价。更牛逼的是,它甚至是用同一套抽象解决了内存安全和数据竞争这两个不同领域的问题。Rust 的零开销抽象让你在享受安全性的同时,又不损失性能。这正是传统的程序员梦寐以求的。

所以,通过使用 Rust,我们消除了一大类最复杂和最不可预测的错误。Rust 中内嵌了形式化证明理论,不过仅限于对内存安全和并发。Rust 在内部用逻辑证明了你的程序是正确的。这也就是你为什么写 Rust 代码会写得如此有信心的原因。你的每一次编译,都有一组数学理论在为你提供证明服务。

以上内容为【老司机看substrate | 区块链开源框架】的相关内容,更多相关内容关注lot物联网。

LOT物联网

iot产品 iot技术 iot应用 iot工程

Powered By LOT物联网  闽ICP备2024036174号-1

联系邮箱:support1012@126.com