4

区块链开发者入门指南

 2 years ago
source link: https://learnblockchain.cn/article/3026
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一份帮你入门的资源清单

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

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

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

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

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

你想在哪条链上构建?

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

以太坊是变化非常快的,你知道三年前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,你在与区块链对话。

区块链节点

![](https://img.learnblockchain.cn/2020/12/07/giphy (3).gif)

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

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

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

接下来的事情

![](https://img.learnblockchain.cn/2020/12/03/giphy (1).gif)

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

分散的文件存储

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

比方说,你有一个有用户档案的平台。你不希望在链上存储他们的简历和头像。那它应该放在哪里?一些集中的服务器?(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 赞助支持。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK