概述
本文主要记述笔者在学习区块链技术的学习道路,希望读者可以在读完本文后可以在目前日益发展的区块链领域找到一条属于自己的学习路径。
本文主要分为以下三个模块:
- 迷茫的入门之路
- 坚实的学习坦途
- 陡峭的精进发展
尽可能全景展示笔者在区块链学习过程遇到的一系列问题,并给出对应的解决方案和建议。
迷茫的入门之路
当我入门区块链时,我感到极其的迷茫。我看到了无数从未听说过的名词,包括但不限于共识、区块、DeFi、NFT、ERC20等。当时的我查询了部分名词的含义,决定在区块链这一概念开始学习。然后,我发现仅仅对于区块链这一名词,我看到无数视频和文章,而且有很多内容出现了相互冲突。对于核心概念,很多资料也会各执一词,提出了相互矛盾的解释。更不用说区块链的衍生概念,这些概念更令人感到疑惑。
当时的我认为纸质书可能比较好,所以我阅读了《区块链实战》一书,但读完此书后,我没有感受到对区块链的深入理解,反而更加困惑。
相信大部分读者和笔者有相同的感受,我认为从概念入手区块链可能是一个错误。在这条道路上有太多良莠不齐的文章,而且在这条道路上很难遇到代码编写等技术内容。
坚实的学习坦途
在历经概念折磨后,我认为从代码入手可能更加具象化且更容易理解。根据我入门时期积累的一些知识,我选择了以太坊中的solidity
作为学习的主导语言。在此时,我也阅读了一篇对我区块链学习之路影响很大的文章——Web3 DApp 最佳编程实践指南。在此篇文章中,我了解了在web3
中进行编程的基本路径。
由于我个人对node
不是非常喜欢,所以我选择了foundry
。我十分推荐大家使用foundry
作为主力开发框架。原因有以下几点:
Rust
编写,编译源代码速度快- 一键安装,快速启动(仅限Linux系统)
- 只使用
solidity
进行编程,避免了使用者学习其他语言的成本 - 提供了
cast
和anvil
工具。前者封装了大量与以太坊交互的API,而后者可以快速搭建本地以太坊环境。 - 文档齐全,且开发者在交流群里较为活跃,可以快速解决问题
- 由以太坊著名投资机构
paradigm
开发,发展前景光明
如果读者想了解更多关于foundry
框架的内容,可以阅读Introducing the Foundry Ethereum development toolbox。
当我安装完Foundry
并配置好VSCode
后,我按照foundry
文档中的指引尝试编写NFT合约,此时我对solidity
并没有十分深刻的理解。为了理解NFT合约中每行代码的含义,我简单阅读了WTFSolidity。当然,我也阅读了部分英文文档。总体而言,solidity
是一门非常容易入门的语言。
如果读者也想快速入门,可以阅读我写的Foundry教程:ERC-20代币智能合约从编写到部署全流程开发。这篇文章涵盖了Foundry
安装、合约编写、测试、部署的全流程。当然,此文也完全面向零基础读者,实现了代码的逐行解析。
在我完成基本的合约编写后,我想更加精进一步。在此时,我想到了曾经接触过的一个比较复杂的技术问题,即合约升级
。我消耗了大量时间研究此技术,带来的回报是我学会了如何阅读EIP
标准,也学会了EVM底层相关的知识,比如以太坊汇编、EVM底层数据存储方式,当然大量使用Delegatecall
和Call
函数使我对于两者的区别有了更深的理解。
站在学习者的身份,我认为学习合约升级
技术有以下优势:
合约升级
概念具有现实意义,但功能单一- 合约升级是一个在长时间内逐渐发展的概念,从简单的
Eternal Storage
、EIP-897
到复杂的钻石合约EIP-2535
,其代码实现日益复杂,非常有利于读者逐渐加深编码水平 - 涉及5个EIP标准,初学者在学习过程中势必需要阅读EIP标准,这可以使初学者拜托阅读EIP恐惧
- 涉及简单的以太坊汇编,对于初学者理解EVM底层有非常大的作用,可以使初学者站在底层了解智能合约
基于以上优势,我推荐初学者在了解基础的智能合约编程后就可以学习此方面的内容,具体可以参考我写的以下两篇博客:
当我完成以上内容后,我发现随着日益深入智能合约开发,原本由solidity
提供的抽象性被打破,我发现我确实需要进一步深入了解以太坊的运作机制。但相较于之前的迷茫,现在我可以借助开发智能合约的一些经验研究以太坊底层。与智能合约直接相关的就是EVM汇编等内容,我学习了与可升级智能合约近似的用于部署最小化代理合约的EIP1167
。此标准的一大特点是为了达成最小化的目标,完全使用了汇编字节码进行编程。通过这次学习,我阅读了部分以太坊EVM的源代码,真正进入了底层世界。读者可以阅读EVM底层探索:字节码级分析最小化代理标准EIP1167来进一步了解我的学习成果。
更加完整的深入理解智能合约底层的文章可以参考以下系列:
- Part I: Introduction
- Part II: Creation vs. Runtime
- Part III: The Function Selector
- Part IV: Function Wrappers
- Part V: Function Bodies
- Part VI: The Metadata Hash
在阅读go-ethereum
源代码时,SourceGraph提供的非常好的代码阅读体验,使我可以在网页端使用大量的IDE功能,比如定义、引用跳转等功能。
但我也发现go-ethereum
有一个非常严重的问题:源代码虽然包含大量注释,但没有给出整体的设计思路,这使我阅读源代码时面临无法找到对应模块的问题。经过一段时间的探索,我认为另一个以太坊客户端Erigon
更适合探索源代码,因为它们在wiki中列出来每一个模块的设计思路。
当然,目前wiki还没进行更新,部分内容仍属于PoW的实现,还没有加入PoS设计相关的内容。
陡峭的精进发展
对于进一步深入学习区块链相关内容而言,在经历智能合约基础知识提供的平台期后,我又进入了一个陡峭的上升期。与简单的智能合约编程不同,在真实的区块链世界,编写DApp所需要的不仅仅是智能合约代码编写的技术,更需要一系列复杂的其他领域的知识,比如金融学、经济学等。
而且日新月异的区块链世界会不断挑战开发者,我将其大致分为以下几种挑战:
- 密码学的挑战,目前大行其道的
zeroknowledge
就是这一方面的典型代表。 - 金融学的挑战,DeFi项目往往涉及代币经济学、套利、AMM模型、MEV等内容,而部分涉及衍生品的DeFi则有更加复杂的金融设计。对于开发者而言,如果无法理解金融模型,就不太可能写出合适的智能合约
- 区块链底层挑战,这一部分包括具体共识算法的实现、P2P网络的构建、交易池的设计、Gas机制等。当然值得欣慰的是这一部分所涉及的知识领域主要在计算机学科内,对于程序员而言还较好理解。
- 编程语言的挑战,我们在区块链领域又进入了一次编程语言大爆发的时代,大量链专属语言出现,比如
aptos
和sui
共用的move
语言,StarkNet
上专门为zk
设计的Cairo
,Flow
链上的Cadence
等。 - 信息爆炸的挑战。我们可以看到一批批项目的涌现,看到协议的进步,看到语言的发展。开发者不得不关注大量信息源以确保自己的知识仍在前沿。
这些挑战很多都超出了简单的智能合约领域,为了解决上述问题,我目前的方法是以核心文章为抓手去解决这些问题。在此处,我给出我在部分领域认为比较好的网站:
- ETH2 Book,介绍了以太坊升级后的共识算法等,可以作为研究ETH2的核心材料
- ZK Hack,一个给出了很多资料的专注于ZK的网站
- MEV Wiki,专注于MEV的wiki资料
- Mirror Beats,可以简单地认为是
web3
的垂类搜索引擎
此处限于篇幅,我不再给出更多资料。
我目前也正处于此阶段,与之前类似我的面前依旧有着大量的概念等待理解,但经过智能合约的学习,我可以更加从容不迫地研究相关问题。我会在自己地CSDN账户和个人博客上发表我学习的成果。