区块链开发者入门指南

  • aisiji
  • 更新于 2021-09-18 15:15
  • 阅读 11128

翻译一篇我个人认为很非常有用的入门资料,如果你是小白,基本上看了这一篇也对区块链技术有了比较清晰的了解了。

一份帮你入门的资源清单

特别感谢 RNG 主持了产生本文的谈话。RNG是一个由游戏玩家、游戏开发者、区块链开发者、电竞爱好者、元老级爱好者、NFT爱好者以及几乎所有喜欢和这些人混在一起的古怪集体。

最近,有人在论坛上说,希望我为学习区块链的开发者推荐资源,于是我整理了这篇文章。

这不是一篇聊关于区块链优势和劣势的文章,只是一篇学习指南而已,给想要学习区块链的人一点帮助,也可以了解到开发区块链应用的步骤。不是所有东西都应该在区块链上。

外面有很多不同的资源,就像任何技术栈的选择一样,事情可能会变得很有意见。特别是对于这个领域的新人来说,仍然需要引导到正确的工具。我将尝试在我的意见和一般清单之间找到一个中间地带。

其实我们可以找到很多资源,然而就像任何技术栈的选择一样,可能会遇到一些比较片面或者有偏见的意见,特别对于这个领域的新人来说,更需要正确的引导。我会努力尝试选一个比较中立的清单推荐。

你想在哪条链上构建?

这其实并不重要--接下来我要聊的是以太坊上的工具和资源。其中有些与其他一些链兼容,有些不兼容(至少我是这么猜的)。我个人认为,如果你是第一次学习区块链应用,学习如何为以太坊编写和部署可能是最好的开始,即使你的目标是在不同的链上构建。因此,这里的列表是以以太坊为重点的。

A 警告

以太坊是变化非常快的,你知道三年前React的代码和现在有多不同吗?相比React,以太坊的变化要大的多。Solidity的发展速度很快,而且有时候还会出现突破性的变化。随着EIP不断的探索更优的定价机制,gas优化也在不断的变化。伴随不断的发现和推广新的模式,也就不断的出现新的bug,从而不断的解bug。今天你看到是这样的,到明天也许就不是这样了。即便如此,如果你学会了solidity 0.5,你仍然具备理解0.7的能力,不仅如此,会让0.7变得更容易,而不是更难。

编写智能合约

giphy.gif

要创建一个dapp,你首先需要具备写智能合约的能力,并且还要可以让其他东西与之通信。我先假设那些与合约通信的东西,无论是前端、API、或者其他任何什么,都是用JavaScript编写的。JS有大量的库可用,我觉得大多数主流语言都有与Ethereum通信的库,但是我个人对JS的系统了解的最多。

值得一提的是你可以不用写合约直接创建一个dapp。在公链上,你可以在别人的合约上创建app。你想为Uniswap创建一个前端吗?Uniswap是不会阻止你的。因为商标的原因,你不能以Uniswap团队的身份创建前端,但你可以说:“嘿,这是我的Uniswap前端,它可以做Uniswap前端能做的一切,更酷的是,每个月付我5美元你就可以使用它。”这样是完全没有问题的。通常,我们假定你至少具备在Ethereum上开发智能合约的一般知识。如果你看不懂合约,那么你很难写出一个与Uniswap合约的接口。

Solidity是一种智能合约语言,你可以从它开始学习。Vyper是一种超级酷的语言,我还有一个用Vyper写的PR,但是它不是你的起点。Solidity有更大的社区,这意味着更多的资源,并且当你卡住的时候可以有更多的人可以求助。

Cryptozombies可能仍是嵌入Solidity最好的工具,虽然我觉得它并没有好好维护。这是一个制作类似 Cryptokitties 游戏的教程。(有一个游戏制作教程,是Vyper 的一个阶段工作,点击这里查看)

我发现,Solidity 文档 是非常易读的,虽然我通常对阅读文档有心理障碍。特别是“Solidity by Example”部分,对于理解 Solidity 的不同元素非常有帮助。

Visual Studio Code 有很好的 Solidity 工具,据我所知,Atom 也有一些不错的工具。我觉得Vim 迫切需要一个新的维护者,我对 Emacs 不了解,但我肯定它也有一些支持者。

最后:有很多通用的合约,可以直接拿来用,而不需要自己写。你听说过制作属于自己的ERC20代币或者NFT吗?你可以直接用一个经过审计的、可靠的、开源的模板,在模板的基础上创建,而不是从头开始写。黄金标准Open Zeppelin,这里是他们的合约库,他们也有自己的npm包

智能合约沙盒(开发链)。

Solidity 之后,我们要讨论的是合约沙盒。假设你已经写了一个合约,你现在想要测试一下,看看他是否正常工作。你该怎么做呢?没错,你不会想要把所有的”Hello world.“或者草案合约都部署到主网上。虽然有测试网(主网 Ethereum 区块链的本地版本,测试网上的 ETH 是没有价值的,也不可以转移到其他链上),但一般工作流也不会直接上测试网。取而代之的是开发链,这是你可以根据需要在自己机器上运行的虚拟链。它可以帮你看到你的合约是否在编译,并且可以测试合约的函数、变量以确保都按照预期正常工作。不过开发链有一些限制 —— 一个简单的例子,假如你正在开发与 DAI 交互的程序,这意味着除了部署自己的合约外,每次运行时都会在开发链上部署一个克隆Maker(DAI). 这是伟大的第一步。

主要工具:

  • Remix,如果你只处理合约而没有其他(没有前端)。Remix也可以连接测试网和主网,是一个非常强大的工具。它会有一个学习曲线,刚开始可能看起来像在胡言乱语,但是一旦你掌握了编译和部署,你就可以用它做很多事。
  • GanacheTruffle套件的一部分),和HardhatNomic Labs的一个独立框架)-- 我们将在一分钟内详细讨论这两个框架。它们是更大的框架的一部分,可以单独用于合约,但当你有一个完整的应用程序时又会大放光彩。

总结一下,传统的合约部署包含以下步骤。首先,合约需要被编译,从Solidity(或其他语言)转化为JSON 串。你会注意到一种特别的 JSON —— ABI,这是合约内容概要的 JSON ,这种 JSON 多被应用于开发中。然后到实际的部署了,需要通过一个交易把合约字节码发送到链上。为了可以与合约交互,你还需要知道它在链上的地址(合约地址),并且你还需要它的ABI。Etherscan是一个从链上读取合约信息的非常有用的工具。假如你知道合约地址,但是不知道它的ABI,通常都可以在Etherscan找到。

框架

这给我们带来了围绕合约制作一个用户界面(或API或其他什么)的问题。一旦你部署了,你的合约将如何被交互?在某些情况下,仅仅在链上有一个合约就足够了,任何参与互动的人都可以使用类似Remix的东西来与之互动,但通常不会。我首先假设你的项目中有某种图形用户界面。如果是这种情况,你会想要一个框架。区块链框架将把你的合约整合到前端项目中,把你的合约编译成可以被前端理解的JSON(使用适当的工具,后面会详细介绍),提供旋转开发链的能力,以及部署合约。

最流行的框架是[Truffle](https://www.trufflesuite.com/)。许多教授dApp开发的在线资源也教授Truffle。Truffle可以编译,以Ganache的形式公开开发链工具,以及更多

既然如此,我推荐[Hardhat](https://learnblockchain.cn/docs/hardhat/getting-started/)。与Truffle类似(我相信它实际上是建立在Truffle之上的),你可以编译合约,并获得对开发链的访问。不过,还有更多。Solidity没有开箱即用的`console.log`,但Hardhat基本上做了他们自己的黑客EVM,可以让你登录你的合约。根据我的个人经验,Hardhat的编译问题也比较少。(看着你,node-gyp。)也有更多的便利设施。在你去尝试建立你自己的Hardhat环境之前,让我们来谈谈web3库,然后我有一个建议,这应该会使你更容易

web3库(小写字母 "w")是在非区块链代码(如JavaScript)和区块链之间搭建桥梁的半官方术语。用于实例化合约对象的JavaScript代码在哪里,然后在该合约上调用一个函数?实际上,你到底用什么函数来连接到链上?很明显,JS没有内置这个功能。这就是web3库的作用。它们暴露了所有你需要做的事情的函数。JavaScript中最突出的两个库是Web3.js(在写这篇文章时,链接到当前最新稳定版本的文档)和Ethers.js。我个人认为后者更容易操作,并建议你也这样做。一个建议是,目前的Ethers(v5)的文档仍在编写中。如果你在查找或理解v5的文档时遇到困难,也可以搜索[v4文档](https://web3js.readthedocs.io/en/v1.3.0/)。搜索的功能更强大,而且有更多的代码片段)。)

我不知道有什么资源能真正放大到web3库的熟练程度,但我在最后给出的建议也涵盖了web3。

你需要合约、框架环境和web3库,这已经是很多了。如果有什么能把这些整合到一个环境中来管理它们,那不是很好吗?

一个管理它们的环境

自然是有的。Scaffold-Eth有一个开箱即用的环境,在React应用的背景下设置了Hardhat和一大堆其他东西。Web3.js和Ethers都是通过同一个yarn安装来安装其他的依赖项。这是迄今为止最简单的入门方式,因为它几乎没有任何配置。Scaffold里有很多东西,包括自定义钩子和组件。甚至还有一个自定义合约组件,为你提供了与合约交互的近乎无障碍的方式,这与Remix非常相似。编译完合约(然后自动注入前端)后,只需在App.jsx中放入一个<合约名称="YourContract />组件,其中名称是合约的名称。Austin Griffith(作者)在Scaffold的旧版本上有一个三分钟的超级超级模式的演练here,还有一个更长的演练here

围绕它还有一个超级友好的Telegram频道,在GitHub的README中列出。我强烈推荐它。这就像在Webpack和Babel中挣扎的人与Create-React-App的区别。

我想谈的最后一件事是区块链栈中的另一个细节。区块链是一个由节点组成的网络,每个节点都存储着区块链的历史(或一些历史,我在这里不做过多的迂腐的讨论)。你的React应用是如何接入网络的?虽然web3库确实暴露了一个web3提供者,但它如何知道节点的位置,以及如何查询它们?答案是,它不知道。你需要运行你自己的节点,或者连接到一个运行它们的服务。这就是最终完成的桥梁--你的JavaScript使用web3库来发送一个链上理解的命令,该命令通过web3提供者发送到网络(如上所述的节点或服务),然后,viola,你在与区块链对话。

区块链节点

虽然我推荐运行自己的节点,甚至还写了一篇长文关于安装Geth,我不得不承认使用服务是更普遍的做法。我会折中一下,给你一些关于两者的信息。出于各种原因,我推荐Nethermind来运行你自己的节点。为了能够做到这一点,你需要一个固态硬盘,它应该有至少500GB的空间。你可以用4GB内存进行同步,但可能至少要有8GB。这些都是为主网计算的,测试网需要的空间要小得多,而且可能用更少的内存就能搞定。如果你还在做高强度的图形工作,你可能已经有了更多的内存,你可以很容易地调整Nethermind使用多少内存。Nethermind是用.NET写的,但我在*nix系统上没有遇到任何问题。在服务方面,Infura是最著名和最广泛使用的,尽管新来的Alchemy也值得好好看看。

我把这个推到这里,之前没有提到的原因之一是,它有点不伦不类。就你的实际开发而言,无论你是否运行你自己的节点或使用服务,当你实例化一个web3对象并需要知道将其连接到什么时,对你的代码库的实际影响大约是半行。

钱包

同样,你可能要在你的浏览器上安装MetaMask来测试钱包的交互。你也可以使用其他钱包,但在我看来,MetaMask仍然是国王。

接下来的事情

一旦你掌握了这些基本知识,你会很快遇到一篮子新的问题和关注。我不可能在这里涵盖所有的问题,我自己并不了解所有的问题,也没有足够的知识来明智地解决其他问题,但我会试着谈一谈接下来你可能要关注的一些事情。

分散的文件存储

对区块链的写入是昂贵的。你要为你在链上写入或更改的每一点信息付出代价。不仅如此,每一个与链同步的节点都必须在同步时执行你放在链上的东西。这使得代码有了一些有趣的优化,但它也让你思考什么应该放在链上。链的作用很差,就是数据存储。

比方说,你有一个有用户档案的平台。你不希望在链上存储他们的简历和头像。那它应该放在哪里?一些集中的服务器?(Cue overly dramatic music:) 如果恶意的一方可以任意改变用户的头像,那么整个平台去中心化的意义何在!?别担心,仍然有去中心化的方式来存储数据。去中心化的文件存储也依赖于去中心化的点对点网络,就像区块链。(现在的一些人还与他们自己的区块链沟通,但这既不是这里也不是那里)。不过,他们专门拿数据来存储。现在它们中最引人注目的是Filecoin,尽管我个人也会提到Swarm和Sia。Swarm尤其如此。不同的供应商可能有不同的优势,这取决于你需要存储什么样的数据(音频、视频、文本),你需要什么样的功能(我相信只有Swarm接近于如何删除数据的解决方案),等等。

Layer2 解决方案

以太坊本身已经到了交易成本过高,或开采时间过长的地步了。此外,在主网上,隐私可能是一个困难的冒险。Layer2 的解决方案已经被开发出来,以缓解拥堵问题,有些还提供了更强大的隐私保证。我们正处于一个百家争鸣的L2s阶段。有大量的看起来强大的、可用于市场的解决方案。Reddit希望有一个L2来投放一些平台内的货币,并收到了20多份材料。我无法比较和对比现有的平台--我缺乏信息和知识。如果你想让我挑出一个来先看看,我会推荐StarWare的Cairo或用它构建的东西。

预言机

有时你想根据链外发生的事情在链上做一些事情。比方说,如果以太币的美元价值超过一定数额,你就想卖掉它。美元不在链上(目前),那么区块链怎么会知道呢?你可以写一个机器人来调查价格,并在满足条件的情况下执行交易,但假设你需要在智能合约中拥有这些信息--合约应该如何知道?这就是预言机所要解决的问题。

不幸的是,那些看起来很简单的解决方案不一定是充分的。Samczsun,一个相当传奇的以太坊白帽子,最近放出一篇文章关于预言机攻击。其结果是要小心你在那里做的事情。

也有预言机服务。Chainlink几乎可以肯定是其中最有名的,但要确保它能满足你的需要。Samczsun在他的文章中对这个问题的论述比我可能的要好,所以我就把你引到那里。

终于有了一个类似结论的东西

我们在这里还可以谈一谈:链上治理(无论如何),可升级性(请不要),安全性(是的,请),以及更多。正如你所知道的,我主要是通过主观的方式来挑选主题。这篇文章绝不是详尽无遗的,尽管我认为它可以给一个置身事外的开发者提供良好的方向。随着你越来越熟练,你将能够轻松地找到自己的方向。以太坊社区的一个重要方面是它的许多人都很友好。好好利用,但也要把它发扬光大。总有一天,会有另一个开发人员试图摸索这些奇怪的区块链东西,也许你会是那个在Twitter上收到他们的DM或在Ethereum StackExchange上看到他们的问题的人。有了强大的以太坊,就有了保持以太坊强大的责任,或类似的东西。

资源清单

我将在这里放上一堆资源,包括上面提到的那些,以及一些教程。

首先,我应该链接到更全面的资源。我的目标是列出足够多的资源,以满足初学者的需要,但又不至于多到让人不知所措。这里有许多我将探讨的资源。ConsenSys保留了一个资源清单这里,它被链接到/r/ethdev的这个主题中,这意味着那里的评论甚至有更多。我也要向ethereum.org喊话,因为他们有一个非常棒的开发门户,他们正在不断努力改进。

核心资源

教程

资源

  • ethereum.org
  • StackExchange
  • /r/ethereum
  • /r/ethdev
  • Twitter - 它确实是一个了不起的地方,可以看到正在发生的事情,与社区成员联系,并建立对毒性的抵抗,你可以使用hive.one获得一个良好的开端。
  • Week In Ethereum
  • 众多的播客,我甚至不打算去尝试
  • EthGlobal在2020年的虚拟黑客大会上做得非常好,这是一个与其他以太坊开发者会面和互动的好方法,尤其是当你在自学时。

这次真的要结束了

5fbd1ab05d0fa2a2570a3d1b_conclusion

唷!这是个很长的清单。我希望这是一个很好的概述,足以让你开始并走上你的道路。你很快就会找到你自己的道路。


本翻译由 CellETF 赞助支持。

点赞 17
收藏 20
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

4 条评论

请先 登录 后评论
aisiji
aisiji
江湖只有他的大名,没有他的介绍。