登陆 | 注册 设为首页 | 加入收藏 | 联系我们
太和养老网
热词老年艺术  助老机构  养老系统  

中心区域北京 天津 河北 山西 内蒙古 辽宁 吉林 黑龙江 上海 江苏 浙江 安徽 福建 江西 山东 河南 湖北 湖南 广东 广西 海南 重庆 四川 贵州 云南 西藏 陕西 甘肃 青海 宁夏 新疆 香港 澳门 台湾 全国城市养老院目录 全国县市养老院汇总目录 太和AI作品展 太和养老艺术网AI作品展示

安全智能合约工具:端到端开发人员指

 

2023/7/11 5:35:03 ('互联网')

译者 | 李睿

对一些人来说,编写安全智能合约很难。本文将介绍Web3中的一些安全工具,以提高智能合约的安全性。

毫无疑问,编写安全智能合约比较困难,即使是高级开发人员编写的智能合约也可能被黑客攻击。由于这些智能合约通常具有很高的经济价值,因此黑客攻击和破解它们的动机也很高。再加上Web3的不变性,安全性变得更加重要。安全性因此成为了智能合约开发人员的首要任务。

本文将介绍智能合约开发的每个阶段可用的一些安全工具,并对采用这些工具提供一些建议。

1、为开发做好准备

当开始开发智能合约时,安全性应该是开发人员首要考虑的问题,而一些工具可以在准备编写代码时提供帮助,这其中包括文档、检测和编写可重用代码。

首先,文档是任何开发项目的关键,智能合约开发也不例外。以太坊自然规范格式(NatSpec)是一种记录智能合约的好方法。

NatSpec是一种特殊形式的注释,用于为合约、接口、库、函数和事件提供丰富的文档。例如以下Tree Contract的稳定性代码片段:

复制

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 < 0.9.0;

/// @title A simulator for trees

/// @author Larry A. Gardner

/// @notice You can use this contract for only the most basic simulation

contract Tree {

/// @notice Calculate tree age in years, rounded up, for live trees

/// @dev The Alexandr N. Tetearing algorithm could increase precision

/// @param rings The number of rings from dendrochronological sample

/// @return Age in years, rounded up for partial years

function age(uint256 rings) external virtual pure returns (uint256) {

展开全文

return rings + 1;

NatSpec 对Solidity Contract的注释

通过使用NatSpec注释,可以很容易地向其他开发人员、审核人员或只想与合约交互的人解释代码。简单地说,它是干净的、可读的、容易理解的。

其次,重用经过实战测试的代码是降低智能合约中漏洞风险的另一种经过验证的方法。目前有许多广泛使用的开源智能合约库,例如OpenZeppelin,其中包含用于实现访问控制、暂停功能、升级等的预先编写的逻辑,以及用于优化使用的Solmate合约。

最后,检测是在智能合约代码中发现潜在问题的具有价值的工具。它可以在代码中发现风格错误、违反编程约定和不安全的结构。有很多很好的检测工具可用,例如ETHLint(以前的Solium)。检测可以帮助发现潜在的问题(例如重入漏洞这样的安全问题),甚至在它们成为代价高昂的错误之前。

通过在智能合约开发过程中考虑文档、检测和可重用代码,可以提高合约的安全性。从长远来看,花时间正确地设置这些将会在安全性和效率方面得到回报。

2、开发

现在了解可以在编码时提供帮助的两类工具——单元测试和基于属性的测试。

单元测试显然是创建安全可靠代码的重要组成部分。通过测试代码的单个单元,可以确保合约按照预期的方式运行,并希望在生产中出现问题之前发现任何潜在问题。

有几种不同的工具可用于为智能合约编写单元测试。Foundry、Truffle和Brownie都是支持各种编程语言的流行框架。

Foundry(用Rust编写)是一个用于编写智能合约的框架,其中包括测试框架Forge。伪造单元测试可以直接在Solidity中编写,包括许多欺骗代码,这些代码可以提供断言、改变EVM状态的能力、模拟数据等等。Foundry还带有内置的Fuzzing(将在后面的文章中详细讨论)。

复制

// SPDX-License-Identifier: Unlicense

pragma solidity 0.8.10;

import "ds-test/test.sol";

import "../StakeContract.sol";

import "./mocks/MockERC20.sol";

contract StakeContractTest is DSTest {

StakeContract public stakeContract;

MockERC20 public mockToken;

function setUp() public {

stakeContract = new StakeContract();

mockToken = new MockERC20();

/// @notice Test token staking with different amount

function test_staking_tokens() public {

uint256 amount = 10e18;

mockToken.approve(address(stakeContract), amount);

bool stakePassed = stakeContract.stake(amount, address(mockToken));

assertTrue(stakePassed);

在Foundry中的Solidity单元测试示例

Truffle也是构建智能合约的框架。Truffle中的单元测试可以用Solidity或JavaScript编写。开发人员通常使用基于JavaScript的测试与合同进行外部交互,并使用Solidity测试评估合同在实际区块链上的行为。Truffle使用Mocha进行异步测试,使用Chai进行断言。

Brownie是一个基于python的框架,用于开发和测试智能合约。Brownie与pytest集成用于单元测试,并提供了一个堆栈跟踪分析工具来测量代码覆盖率。

在编写单元测试时,通过测试尽可能多的代码不同部分来实现高测试覆盖率,以确保所有功能都能按预期工作。Foundry不需要额外的插件来测量测试覆盖率。对于其他框架,可能至少可以添加一个插件来衡量这一点。

虽然单元测试是确保智能合约正确性的可靠方法,但基于属性的测试允许对智能合约进行更深入的验证。这是一个相对较新的概念,与传统的单元测试相比,它提供了一系列优势。基于属性的测试侧重于测试智能合约的属性,而不是单个组件。

在指南中,“属性描述了智能合约的预期行为,并声明了关于其执行的逻辑断言。属性必须始终为真。基于属性的测试工具将智能合约的代码和用户定义的属性集合作为输入,并检查执行是否在任何时间点违反了它们。”

基于属性的测试基于模糊概念,这是一种通过引入随机输入来测试系统的技术。这意味着基于属性的测试可以在更广泛的层面上检查智能合约,因为它不依赖于开发人员提供的特定输入。正因为如此,它正成为一种越来越流行的测试智能合约的方法。

以之前的合约为例,使用基于属性的方法来测试一个简单的staking函数。为此,将使用Scribble,这是一种规范语言和运行时工具,它使这一切变得更加容易。

复制

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

error TransferFailed();

contract StakeContract {

mapping(address => uint256) public s_balances;

/// #if_succeeds {:msg "Stake created successfully"} $result == true;

function stake(uint256 amount, address token) external returns (bool){

s_balances[msg.se



扫码加微信详细咨询太和智慧养老产品和平台服务!

 

 





版权声明:

---------------------------------------------------------------


所有信息来源于互联网,本文的版权归原作者所有,不代表本网观点和立场。

本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 81480447@qq.com 举报,一经查实,本站将立刻删除。



扫码加微信详细咨询太和智慧养老产品和平台服务!

 

养老资讯
助老机构介绍
评论
已有 0 条评论

最新评论

推荐养老院

您希望养老院位于
  • 不限
  • 东城
  • 西城
  • 崇文
  • 宣武
  • 朝阳
  • 丰台
  • 石景山
  • 海淀
  • 门头沟
  • 房山
  • 通州
  • 顺义
  • 昌平
  • 大兴
  • 怀柔
  • 平谷
  • 延庆
  • 密云
您希望的价格范围
  • 不限
  • 500以下
  • 500-1000
  • 1000-2000
  • 2000-3000
  • 3000-5000
  • 5000以上
老人的情况是
  • 不限
  • 自理
  • 半自理
  • 全护理
  • 特护

姓名

年龄

电话

全国城市养老院



关于我们 | 联系方式 | 网站地图 | 友情链接

Copyright 2010-2022 京ICP备18035644号-3 北京太和 版权所有