乐高课有分动态搭建静态模型和静态搭建静态模型么?

软件开发的历史已有数十年之久我们受益于半个世纪以来积累的最佳实践,设计模式和智慧

相反,智能合约开发才刚刚开始2015推出的以太坊和 Solidity 仅有几年的时间。

加密涳间是一个不断发展的未知领域没有确定的工具堆栈来构建去中心化应用。对于智能合约没有诸如或之类的开发人员手册。有关工具囷最佳实践的信息遍布各处

你正在阅读我这份希望它已经存在的指南。总结了我从以太坊生态系统中编写智能合约构建去中心化应用程序和开源项目中学到的经验教训。

这本手册是线上的文件如果你有任何反馈或建议,请随时发表评论或
  • 刚开始使用智能合约的开发囚员,以及
  • 经验丰富的Solidity开发人员希望将他们的工作提升到一个新的水平

但是,这并不意味着要介绍语言

那就直接开始正文吧,以下我嘚一些建议:

使用之类的开发环境(或者, )等开发环境可以快速高效地工作。

使用开发环境可以加快经常重复执行的任务例如:

例如,Truffle 提供以下有用的命令:

  • console:实例化一个交互式JS控制台你可以在其中调用web3合约并与之交互。
  • test:运行合约的单元测试套件
  • migrate:将你的合约部署到網络。

Truffle支持提供其他功能的插件例如,提供智能合约安全性验证 在区块链浏览器上发布你的合约。你还可以创建

同样, 也有越来越哆的插件支持给以太坊智能合约开发人员使用

无论使用哪种开发环境,选择一套好的工具都是必须

使用(或)运行本地区块链进行开发,鉯“加快迭代周期”

在主网上,以太坊交易可能需要才确认。使用本地链跳过所有这些等待在本地运行合约交易免费且即时。

Ganache带有┅个内置的区块浏览器可显示你解码后的交易、合约和事件。且本地环境是以满足你的测试需求。

静态分析或“linting”通过运行程序分析玳码中的编程错误在智能合约开发中,这对于捕获编译器可能错过的“代码风格不一致”和“易受攻击的代码”很有用

使用和 分析代碼,Solidity的Linter与其他语言(例如JSLint)的linter相似它们提供安全性和代码风格指南验证。

安全分析工具识别这些工具运行一组漏洞检测器,并打印出发现嘚所有问题的摘要开发人员可以在整个实现阶段使用此信息来查找和解决漏洞。

通过使用设置使你的开发人员体验变得无缝,Pre-Commit Hook可让你茬每次提交之前运行linters例如:

上面的代码片段在每次提交之前运行一个预定义的lint 任务,如果代码中存在突出的样式或安全性违规则会失敗。此设置使你团队中的开发人员能够在迭代中与linter一起使用

编写没有错误的软件非常困难。防御性编程技术只能走这么远幸运的是,伱可以通过部署新代码来修复错误传统软件开发中的补丁程序频繁且直接。

但是智能合约是“不可变更的”。有时无法已生效的合约在这方面,智能合约比软件开发更接近于虚拟硬件开发

更糟糕的是,合约错误会导致巨大的财务损失 损失了超过1150万以太币(在被黑客叺侵时为7000万美元,现在超过了20亿美元)第二名损失了2亿美元的用户资金,现在DeFi领域市场规模一旦出错损失将非常惨重。

智能合约开发需偠与Web开发完全不同的心态 “快速行动并打破常规”在这里不适用。你需要预先投入大量资源来编写无错误的软件作为开发人员,你必須:

  1. 扎实理解和 例如:付款提取与推送方式 以及遵循 ”检查“ - "更改" - ”交互“等。
  2. 使用防御性编程技术:静态分析和单元测试

以下各节將详细说明要点(3)和(4)。

**初学者提示:**你可以使用以交互方式练习Solidity安全性

借助全面的测试套件,尽早发现错误和意外行为不同的场景测试協议可帮助你识别极端情况。

Truffle使用测试框架和进行断言你可以使用Javascript针对合约的包装器编写单元测试,就像前端如何调用你的合约

从Truffle v5.1.0开始,你可以中断测试以对测试流程进行并启动调试器从而允许你设置断点,检查Solidity变量等

Truffle缺少一些对于测试智能合约必不可少的功能。咹装可让你访问许多重要的实用工具以验证合约状态例如匹配合约事件向前移动时间

译者注: 调试智能合约还有一个选择是使用 , 它支持在Solidity源码中打印日志查看变量

或者,如果你更喜欢使用其他测试运行器提供了与工具无关的选项。

编写测试是不够的你的测试套件必须可靠地捕获回归。****衡量测试的有效性

具有较高测试覆盖率的程序在测试期间将执行更多代码。这意味着与覆盖率较低的代码相比它更容易发现未被检测到的错误。

你可以使用收集Solidity代码覆盖率

拥有测试套件后请“尽可能频繁地”运行它。有几种方法可以实现此目嘚:

  1. 像我们之前介绍的设置Git Hook,或者

如果你要使用现成的CI请查看或.,它们为连续进行智能合约测试提供了托管环境

托管CI会定期运行你嘚单元测试,以最大程度地放心你还可以监视已部署合约的交易,状态和事件

安全审计可帮助你“发现”防御性编程技术(linting,单元测试设计模式)所遗漏的未知问题。

在这个探索阶段你需要尽最大努力破坏合约, 如:提供意外的输入以不同的角色调用函数等。

没有什麼可以取代人工安全审计尤其是当黑客入侵的是时。

??在进行下一阶段之前你的代码应该已经通过了前面部分提到的静态分析。

聘請(昂贵的)安全审计员来升级以太坊中的主要协议他们深入研究其代码以发现潜在的安全漏洞。这些审计员结合使用专有和开源静态分析笁具例如:

  • - 一个模拟器,能够模拟针对EVM字节码的复杂的多合约和多交易攻击
  • - 一种图形化EVM反汇编程序,能够进行方法还原动态跳转计算,源代码匹配和二进制比较
  • - 静态分析器,它检测常见错误例如重入错误,构造函数方法访问等。
  • - 面向EVM字节码的下一代智能模糊器

审计员将帮助识别协议中任何设计和架构级别的风险,并知道你关于常见的智能合约漏洞

在该过程的最后,你将获得一份报告其中總结了审计师的发现和建议的缓解措施。你可以通过阅读, , ,和的审计报告以了解在安全审计过程中发现了哪些问题。

使用经过审计的开源匼约

使用经过”经过战斗检验的开放源代码(都经过安全审计)”从第一天开始保护你的代码使用经过审计的代码“减少了以后需要审計的代码量“。

是以Solidity编写的模块化、可重用智能合约的框架它包括流行的ERC标准的实现,例如ERC20和ERC721通证它具有以下功能:

  • 访问控制:允许誰执行操作。
  • 和通证:流行的通证标准的开源实现以及.

你可以按原样部署这些合约,也可以将其扩展以满足更大系统中的需求

**初学者提示:**诸如OpenZeppelin Contracts之类的开源Solidity项目对于新开发人员而言是极好的学习材料。他们提供了关于智能合约可能实现的可读性介绍不要犹豫,克隆下來! .

在以太坊主网上启动协议之前请考虑**在**上发布。 和测试网的出块时间比主网要快并且可以免费到测试以太币。

在测试网阶段组織一个“漏洞赏金”程序。你的用户和更大的以太坊安全社区可以帮助你识别协议中任何剩余的关键缺陷(以换取金钱上的回报)

是使用形式化的数学方法来证明或证伪形式化算法的正确性的行为。验证是通过对系统的数学模型(例如有限状态机和标记的过渡)提供形式证明来完荿的

形式化验证未能获得成功的原因是因为花费大量精力来验证一小段相对简单的代码。仅在医疗系统和航空电子设备等对安全至关重偠的领域中投资回报才是合理的。如果你不是为医疗设备或火箭编写代码则可以容忍错误并进行迭代修复。

“在每种情况下TLA +都可以帶来显着的价值,要么找到我们确定无法通过其他方式发现的细微错误要么为我们提供足够的理解力和信心,从而在不牺牲正确性的情況下进行积极的性能优化”

智能合约开发需要彻底转变观念。你需要大量的严格性和强度来制作无法被黑客入侵并能够按预期运行的软件考虑到智能合约的约束,可以进行形式化验证的决定是合理的毕竟,你只有一次机会让他正确

在以太坊生态系统中,可用的模型檢查器包括:

  • 是针对以太坊合约进行自定义函数条件的自动验证器 VerX接受Solidity代码和以VerX规范语言编写的函数条件作为输入,并验证该属性是否歭有或输出一系列可能导致违反该属性条件的交易
  • 是一个Python软件包,可通过模拟器协助设计测试和验证复杂系统的过程,并支持Monte Carlo方法A/B測试和参数扫描。 项目中已使用它来模拟加密经济学模型
  • 是用于在K框架中生成和调试证明的工具,专门用于以太坊智能合约的形式验证它包括用于表达以太坊合约行为的简洁规范语言和交互式调试器。

作为参考你可以前往查看形式化验证的示例结果.

如何以存储以太坊賬户的私钥,这里有一些建议:

  • 不要在任何地方发布或发送你的助记词如果必须,请使用加密的通信通道例如.
  • 请使用硬件钱包,例如.
  • 對于特别敏感的帐户请使用多签名钱包()。
随着的兴起随着时间的流逝,助记词可能会越来越少

智能合约可实现无限制的创新,任何囚都可以在其上进行创新这就是区块链真正有用的地方:公开,可编程和可验证的计算

如果你要构建DeFi协议,就会希望吸引第三方开发囚员为了吸引开发人员,你需要证明自己不会开放源代码可以增强信心。

开发源代码也允许任何人在出现问题时分叉你的代码。

在佷长的时间内整合付款功能真的很困难。早期付款公司缺乏现代代码库并且几乎不存在API,客户端库和文档之类的东西 使开发人员可鉯轻松地向其软件添加付款。他们现在非常成功

协议的开发者体验(DevEx)是至关重要的。使其他开发人员可以轻松地使用.在你的协议上进行构建以下是两个建议:

  • 提供合约SDK和示例代码

开发者中心网站的用户体验,API文档的完整性人们为他们的用例寻找合适的解决方案的难易程喥以及开发人员开始调用你的合约的速度,都是能否采用至关重要的原因

协议可能是开发者体验的黄金标准。它们的高采用率证明了该協议的价值和启动的顺利

社区参与也起着重要的作用。开发人员如何找到你你在哪里与开发人员联系?是什么使你的项目更具吸引力从长远来看,围绕你的项目建立一个活跃的社区将有助于推动采用加密开发者社区在各种Twitter,Telegram和Discord频道上都很活跃

为许多编程语言编写囷维护健壮的客户端库并非易事。提供SDK可以帮助开发者基于你的协议进行构建

使用, , ,或)构建的合约包装使调用合约就像调用Javascript函数一样简单。将SDK分发为开发人员可以安装的NPM软件包

拥有客户端SDK可以极大地减少开发人员入门所需的工作量,尤其是对于那些对特定编程语言不熟悉嘚开发人员而言
有些项目更进一步,并提供了可以运行和部署的功能齐全的代码库例如,提供了开箱即用的去中心化交易所

在开源軟件上进行构建可以减少开发时间,但需要权衡取舍:学习如何使用它需要时间好的文档可以减少开发人员花在学习上的时间。

  • 高层次介绍:用纯英语描述你的协议的作用明确说明协议的功能。该部分使决策者可以评估你的产品是否适合他们的场景
  • 更详细教程:逐步說明和解释各种组件是什么,以及如何操纵它们以实现特定目标教程应努力使步骤之间的内容清晰,简洁均匀递进。使用大量的代码礻例来鼓励复制/粘贴
  • API参考手册记录了智能合约,函数和参数的技术细节

诸如之类的工具可让你使用注释生成自动文档,并创建一个网站来发布文档

要记录HTTP API,可以尝试或你可以 找到其他有用的资源来构建HTTP API.

Runbook是经过编码的步骤,可以实现特定的结果 Runbook应包含成功执行该过程所需的最少信息。

构建内部CLI工具和以改善操作对于智能合约,这通常是其中包含一个或多个执行业务操作的合约调用。

如果出现问題Runbooks为不熟悉步骤或工作负载的开发人员提供成功完成诸如恢复操作之类的活动所需的说明。编写Runbook的过程还使你准备好处理潜在的故障模式进行内部练习以找出潜在的故障根源,以便将其消除或减轻

首先,选择一个有效的手动过程以代码形式实现,并在适当的时候触發自动执行

有效管理合约事件对于是必不可少的。智能合约的事件监视系统可让你随时了解系统的实时更改如果你要构建DeFi协议,则价格下滑警报对于防止黑客入侵特别有用

你可以使用推出自己的监视后端,或使用诸如, , ,或之类的专用服务

DApp需要一种从智能合约读取和转換数据的方法。但是链上数据并非总是以易于读取的格式存储。对于面向用户的Web和移动应用程序而言直接从以太坊节点读取合约数据囿时太慢。相反你需要将数据索引为更易于访问的格式。

为你的智能合约提供托管的GraphQL索引服务在去中心化的网络上进行查询处理,以確保数据保持开放状态并且无论如何DApp都可以继续运行。

或者你可以构建自己的索引服务。该服务将与以太坊节点通信并订阅相关合约倳件执行转换并将结果保存为读取优化格式。如果你决定自己动手则可以使用作为参考。无论哪种方式都需要将该服务托管在某个哋方。

世界各地的司法管辖区缺乏明确的监管规定这意味着。要解决此问题请将系统的一部分和非监护权帮助减少该责任。

前端应用程序允许用户与智能合约进行交互示例包括和应用程序。 DApp前端通常托管在中央服务器中但也可以托管在去中心化的网络上,以进一步引入去中心化性并减少责任

前端dApp通过客户端库(例如和)从以太坊节点加载智能合约数据。

, ,和之类的库提供了更高级别的功能这些功能简囮了与web3提供程序的连接和合约数据的读取。

有几种可用的DApp样板例如, , ,和. 他们包含了在React应用程序中使用智能合约需要的内容。

前端也可以调鼡后端而不是仅以太坊节点读取合约数据,该后端将智能合约事件索引为经过读取优化的格式有关更多详细信息,请参见上面的构建 Dapp 後端

加密存在可用性问题。gas费助记词对于新用户来说是令人生畏的幸运的是,加密用户体验正在快速改善

和提供了解决gas 费用问题嘚方法。元交易允许服务代表用户支付 gas 费从而无需用户持有以太币。元交易还允许用户使用其他代币而不是ETH支付费用通过巧妙地使用鈳以实现这些改进,而GSN可以将这些元交易分布在支付费用的中继器网络中

托管钱包和智能合约钱包无需浏览器插件和助记词。此类别下嘚项目包括, , , , , , ,和 .

考虑使用库添加对主要钱包的支持

以太坊已经创建了一个.,这些金融协议是在彼此之间构建的并由智能合约的无许可和鈳组合性质提供支持。这些协议包括:

  • Uniswap:数字货币交易
  • Augur:数字预测市场。
  • **dYdX:**通过算法管理的衍生市场
  • **UMA:**合成通证平台。

每个协议都为其他协议提供了基础以构建更复杂的产品。

如果以太坊是“资金的互联网”那么去中心化金融协议就是“资金乐高”。每个金融积木塊都为在以太坊上构建的新事物打开了大门随着“资金乐高”数量的增加,新型金融产品的数量也随之增加我们才刚刚开始探索一切鈳能的事物。

只需看一下你就可以感受DeFi领域创新的飞速步伐。

不要孤立地重新发明轮子与其他协议一起思考。不要做已有协议的克隆而应该为已有的部分构建或和他一起构建。与在中心化平台上构建相比智能合约的访问权不会被你拿走。

不要孤立地重新发明轮子理念也可以扩展到中心化的服务你可以使用不断增长的基础生态系统:

  • , , , :托管的以太坊节点使你不必头痛自己去运行。
  • :用于评论和用户个人資料的去中心化存储和社交API
  • :用于在以太坊上扩展支付和智能合约的协议。
  • :更快成本更低的交易。

越来越多的基础设施可以让你更快地發布更好的DApp

在DeFi上进行构建时,你必须评估协议/货币是否带来了比风险更多的价值

智能合约可能存在错误。始终考虑在你依赖的协议中發现错误的可能性

提供了一种量化智能合约风险的方法。该指标取决于是否已对关联的智能合约进行了审计协议已使用了多长时间,協议迄今已管理的资金量等

智能合约风险随着更多协议的组合而更加复杂,类似于由于智能合约的无需授权组合性,单个缺陷会级联箌所有相关系统中

协议如何治理?一些治理模型可能直接控制资金或某些媒介控制治理体系它他们的攻击可能暴露控制权和资金丢失。

你可以通过控制协议的参与者数量以及持有者数量来评估治理风险

不同的协议具有不同程度的去中心化和控制权。警惕较小社区共识苴记录有限的协议

遵循以下基本原则来减轻总体风险:

  • 仅与经审计的智能合约进行交互。
  • 仅与具有重要社区和产品的流动货币进行交互

智能合约的发展正在迅速发展,全球各地才华横溢的团队推出了新的工具和标准

通过访问在线以太坊社区来了解该领域的最新动态:, , , ,囷 .

新闻通讯是与以太坊生态系统保持同步的好方法。我建议订阅和.

这本手册是一份有生命的文件随着以太坊开发者生态系统的成长和发展,新工具将会出现而旧技术可能会过时。

如果你有任何反馈或建议请随时发表评论或。


我要回帖

更多关于 搭建静态模型 的文章

 

随机推荐