发布的

谈谈以太坊开发

作者

背景:

去年开始确立想要了解整个区块链,以太坊的技术情况。是基于如下的考虑,一是如果未来这一领域有很大潜力的话,那么基于对于技术层面的理解至少会提升我在这个领域的竞争力。分布式技术,智能合约的开发本身也是再不断迭代的,这种迭代需要关注者持续学习,随着时间的推移,也会赋予这些关注者一定的复利效应。二是,我本身有一定的开发基础,时常会冒出想自己亲自动手调用一下的的冲动,比如直接通过 js 调用链上合约,但是也仅仅止步于此,因为我知道这里面有不少内容,而且很多内容是不断更新迭代的,如果没有一定基础并且打算专门写合约的话,无论是客观还是主观都很难有条件去跟进与深入的。

基于此,之前我也是一直本着了解合约的一些基础操作,比如会调用合约。其他技术方面,比如分布式技术发展、其他链的技术实现,比如 NEAR,AVAX,DOT,也去会看看白皮书。但是依然觉得还是云里雾里,不能抓住其精髓。不过我有一种根深蒂固的感觉,就是放在整个中国,了解这些技术,并且能达到一定程度的人可能都不多。即便我不是最了解的那个人,但最起码知道一点,总归是好的。再加之如果未来发展,这项技术如互联网技术那样全面普及开来,我相信这一切都会有意义的。

尽管自己有着上述自己的如意算盘,但是实际情况依然常常感到一种有心无力感。首先分布式技术,一些主要公链的白皮书、黄皮书真的是部大部头,啃的人头大,硬着头皮了解一遍之后,总是感觉哪里还欠一点,但是又说不上来。二是对于合约的理解,也仅仅是达到合约调用的程度,更深一步的合约编写,安全方面的思考,实际的项目历练这些其实感觉离自己还是有些距离的,重要的是自己一开始也没想到要去专门写合约。

我正是在这样的困惑下,看到了 preethikasireddy 几篇相关的介绍文章:

以太坊是如何工作的?

web3 的整体体系架构

介绍分布式技术

可以说,如上文章介绍的程度,一方面满足了我了解的需求,对于整体技术有一个更高层面的理解,同时也有联系到具体的技术实现,另一方面,也让我有了一些新的感受,比如将说以太坊就类似于一个状态机,我们与其交互是通过与以太坊虚拟机(EVM)方式,每一次合约交互完成之后,都会改变该状态机的状态。与以往计算机形态不同的是,任何人在任何时候都可以与以太坊进行交互。这种解释虽然听起来很简单也很基础,但之前我从来没看到类似的解释,这让我很受触动。

另外一方面,对于分布式技术的解析,前面提到了,几乎是很多科学家,研究人员花费了很多的心血,在一个小的学术范围范围内进行研究,思维框架也一直在技术方面上思考,但经过了这么多年的实践与研究,BTC 是中本聪是第一个将分布式技术与经济模型结合的人,这种历史感的演进,这种边界上突破带来的革命,这种分布式技术发展几十年来具体的演变突然不让我有那么巨大的距离感,这些让我产生了电花火石般的感觉。我感觉一些大家觉得神奇的东西,在我心中正在去魅。

正是在如上的背景下,我偶尔看到 preethikasireddy 有培训 ethereum 开发,第一反应,如果是纯英文讲,可能吸收不了,二是随着看着这个领域的内容越多,很多有价值或者受到启发的文字都来自于英文世界。我觉得这个可以尝试下。三是 preethikasireddy 写的不少内容,与我起初思考的方向有着很多相似点,比如对于基础技术的拆解,对于重要公链的关注,对于以太坊的重视,以及对于合约开发的重点关注,这让我本能有种亲切感。

意外的锻炼与收获

如何在纯英文环境下跟进。

起初在与印度教练沟通的时候,我真的是一个单词都听不懂,不知道他们说的是哪国英语?不过看 chrome 即时字幕,也都能识别出来。只要有字幕,就能理解大部分的意思。

在第一次视频见面的时候,配上 chrome 英文即时字幕,这么一通操作下来,我突然有种很强烈的直觉,觉得达到和老外正常的沟通,基本理解老外要表达的意思,不是不可能的。只不过要达到如下条件。

1.需要即时反馈,这种反馈需要自身即时反馈,即可以借助工具(如 chrome 的即时字幕工具)看懂大部分的意思,如果能够即时输出比如文字或者口语,那效果更佳。

2.高频高密度的环境,这种高频的反馈是指自身可以在这种交流中跟上对方的思路,理解对方的意思。同时交流的内容要多,需要思考,去确认,这种思考与交互越频率效果越好,那种语言的陌生感也就会越来越淡。

3.一定时间的沉浸,说上两三句不会有什么效果的,沉浸上其中半小时至一小时,如果基本能跟上,那效果就达到了。

当然如上这些,我基本是在英文字幕的帮助下是被动实现的。就像沟通中文一样,要使用英文达到如上三点,需要更多的时间与这样的环境,还有自身怎么去实现这种主动反馈。

合约开发学习路径

一般情况下掌握一门语言,我理解的过程是这样子,熟悉其语法特性,了解其基础函数库,如果有编程基础,那么用这门新掌握的语言可以快速写业务逻辑。

而对于 solidity 的了解与掌握,其了解与掌握路径与上述路径则有所不同

1.语法特性,需要深入精确掌握,我不确定我的感觉是否正确,就是可能有不少程序员,对于自己当前语言的语法特性并没有达到一个很深入的程度,比如 java 虚拟机之于 Java,实际不少情况下,只要完成编写业务逻辑即可,更多情况下也没有过多的精力关注这些更深一点的技术层面或细节。但是基于以太坊上的 solidity,则从一开始就要真正了解其语法特性,否则一个 bug,就可能导致几百万美金的损失。另外,solidity 编译器也再不断更新,这种更新频率也相较于其他语言要快些。

2.开发环境的不同,传统 web2 的情况下,比如开发人员开发一套信贷审核流程,测试或者 debug 的时候,运行该系统,然后进行调试。web3 则是与自己完成的合约交互,该合约则需要部署再链上,部署在链上的合约代码不可改变。这里牵扯到两个不同点,一是链上测试环境,现在有公用的测试环境如 rinkeby、ropsten,自己也可以使用诸如 hardhat、truffle 等工具创建本地测试环境;二是 debug 的时候不能更改代码或者很不方便去重现一些场景。所以就会让人感到很麻烦,不像 web2 开发测试时,可以做到即时反馈与展现。不过有关开发与测试工具,也在不断的完善发展中,比如在与合约交互时,如果要改变整个区块环境参数怎么模拟?tenderly 就提供了这种方式。

3.安全,在编程中时刻保持对于安全问题的重视,这可能是相对于 web2 开发时最重要的一个不同点。完成的合约不仅仅是像 web2 开发时,一些逻辑操作流程,一些信息流转,更重要的是用户本身价值货币化的一种流转。而从以太坊的 The Dao 受到攻击,有关各种黑客实践就几乎没断过。

很好的了解安全的入口:https://www.secureum.xyz/

4.需要了解的其他语言,之前 web2 开发的时候,比如用 java 语言开发后台系统,很大一大部分精力则是主要使用 java 语言,偶尔可能会需要用一些前端页面技术如 js 等调用一下。但是基于链上与合约交互,我现在见到的还需要继续熟悉 javascript 新的语言特性以及 typescript,用其与链上合约交互,比如 hardhat 本身基本就是用 typescript 编写的,基础库如 ethers.js,web3.js 直接或者间接都会用到。也有开发者意识到这点,开发合约的时候,需要过多考虑的其他语言将会限制开发者的精力,因此出现了 foundry,本身就提供了使用 solidity 编写测试代码的功能,并且还提供了 fuzz-testing 测试功能,可以测试出一些安全问题。

5.工具的使用

随着逐渐有了一定程度度的了解,我越发越体会到工具的重要性与帮助。首先是需要多个工具搭配使用,传统 web2 开始时,基本上一个 IDE 工具就可以搞定所有辅助工作,如辅助测试、debug、打包等操作。但是在 web3,使用 visualstudio 编写代码,需要 truffle 或者 hardhat 进行部署、测试。有时测试的时候,需要手动测试不同的流程的展示结果,比如先调用合约 A 的某方法,再调用合约 B 的某方法,或者反之。这个时候 remix 就显得很顺手了。还有一种情况,就是需要不同的地址与其交互,比如从某个地址发送 ETH 或者代币到某个合约,要么通过 hardhat 或者 truffle 提供的 js 窗口输出命令行进行操作,要么可以直接 MetaMask 导入对应的钱包,进行钱包的操作,而可见使用 metatask 图形化方式操作就显得很方便、省时间也不易出错。

通过如上简述,大概就会体会到,这个准备工作还是不少的。我将其分为如下几个要素:

1.节点选择

节点环境可以使用 ropesten,rinkeby 等,或者一些节点服务提供商提供的节点配置。

也可以使用本地节点,如 hardhat,Anvil。

也可以使用 reminx 自带的节点选择其,其提供多种选项。如选择 injected vm.

2.图形化展示

remix 连接对应节点。或者使用 ganache。

3.钱包选择

metatask/hardhat 等工具,hardhat 需要使用 js 在命令行模式下进行交互。

4.debug 调试环境的选择

常用的为 remix,可进行可视化操作。本身也集成很多插件。

hardhat,当前主要使用的工具,但是 hardhat 写测试 js 比较麻烦,需要熟悉 typescript。

而再使用工具的过程中,也会保障一些基本的要求,如安全,gas 优化。可以看到具体的 gas 消耗量,一些安全问题可以测试出来。

站在更高处看待整个技术情况

几年前,我听到一个作家讲互联网的发展历史,如 BBS 时代到门户网站,再到用户可以提供内容的博客时代,与此同时这其中所涉及的技术也在不断发展变化,这里我理解的技术脉络是门户网站可能使用的是大量的静态网页,用户更多是看,无法进行更多的交互。再到用户可以交互,类似于 java 的 jsp,可以让用户进行更多的交互,javascript 的 ajax,可以实现异步交互,即可以同时与不同的服务内容交互。与当前的 web1,web2 的定义可以做个对应,如 web1 实现的是 read,web2 实现的是 read+wirte.

这里让我有一个很明显的感受或者也与我接触的程序员群体有关,大家更多想的是又出现新的技术,新的框架了,变化迭代真快,要学习这些东西,才能进入大公司,找到一个好岗位。而基于这些技术发展的脉络及其历史背景,说的人寥寥无几。而这会进一步导致进入一种境地:陷入只见树木不见森林的情况,大量的时间与精力陷入到技术细节,攻克难以理解的问题上,但是其效果,是否符合自己面临的实际现实情况往往让我存疑?

所以这也是认为站在一个更高的 high level 理解的重要性。比如我理解到 ethereum 是一个状态机,外界则是通过 tansaction 与 EVM 进行交互,从而导致整个以太坊状态的变化。

那么是怎么定义这些状态的?怎么描述这些状态的变化?在实际的与太坊交互中,并不是每次一个 transaction 就导致整个以太坊状态发生变化,而是将这些 transaction 封装成区块,区块确认之后整个以太坊的状态才会发生变化。而外界与以太坊交互的方式都是通过与以太坊地址进行交互,以太坊的地址又可以分为 EOA(Externally Owned Account),CA(Contract Account),不同的地址交互导致了不同的交互类型。伴随着这些基本问题的澄清,会逐渐感受到一些基本概念的澄清,比如 hash 函数在这里非常重要,是我们更好理解其机理的基础。

又或者说 gas 为什么会存在?一方面是避免了图灵机的实现之于 ethereum 存在一个缺陷,如果遭受攻击,gas 的存在将会使得避免 ethereum 陷入资源被耗尽的境地。同时 gas 的存在也使得攻击者存在成本。而对于 gas 的费的设计也是整个社区讨论的一个核心话题,因为这里面不仅涉及到了如上所指,还有矿工的奖励,整个 ethereum 的经济模型,比如 EIP1995,对于 gas 的调整。

站在更高层面去理解,一方面给了我们认识整个技术框架的底座,也给了一份指导。对于我而言,也感受到了很多乐趣点,比如从历史上来讲,BTC 的定位就是很保守,就是数字货币。而以太坊相比较于 BTC,从技术演化上来讲,更是尝试之前不可能完成或者很难完成的事情,去成为新的形式的计算机,任何人在任何时刻都可以与其交互,而且交互的逻辑可以自定义编写。每当我想到这点,还是感觉挺兴奋与挺有意思的。

结语

我有一种观点,也可能是个人的一种臆想。

就是基于链上生态发展的,对于程序员,尤其是符合一定标准的将会需求加大并且显得很重要,为很多程序员跨越国界,参与全球性产品的开发提供了可能性,这与之前在某个行业某个平台,业务逻辑的积累深度与平台所绑定的现状截然不同,在这种绑定的情况下,随着时间推移要么走上管理岗位,要么转向其他岗。而且整个社会环境的认识与观念可能会认为在中国这样的环境下高龄敲代码不是一个正常的存在。

而我认为随着链上生态的发展,开源宗旨的传播,链上个人贡献的验证,经济模型的巨大的潜力,将会使得这类程序员不再受制于平台的限制,甚至反过来会重塑社会的某些认识与观念。即为纯粹搞技术的人提供了经济基础与社会认可度。不过这不容易,有很多关要过,个人觉得这种潜在门槛其实不低。

也可能仅仅是个人的感觉而已,我总觉得用英语看一些技术内容更顺畅与更容易理解一些。同时看下英文环境下人们的讨论,也是提供了一个更好的视角,促进自己去观察与思考。很多情况下,是需要自己去看一些更高水平的人讨论,去看下他们的设计,这样才能真正会有所体悟,这个时候具有一定质量的社群或者同频的人就显得极为重要。

想一想,自己可以参与全球性产品的开发,与分布在世界各地的程序员或者其他伙伴讨论问题,这一过程中见证一项产品的诞生,去体会不同国界文化不同思维的碰撞,看一下一项技术是如何慢慢吞噬整个世界(如果是的话)。还是挺让人备受鼓舞的与挺有意思的。