偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

安全智能合約工具:端到端開(kāi)發(fā)人員指南

譯文
安全 應(yīng)用安全
本文將介紹智能合約開(kāi)發(fā)的每個(gè)階段可用的一些安全工具,并對(duì)采用這些工具提供一些建議。

?譯者 | 李睿

審校 | 孫淑娟

對(duì)一些人來(lái)說(shuō),編寫(xiě)安全智能合約很難。本文將介紹Web3中的一些安全工具,以提高智能合約的安全性。

毫無(wú)疑問(wèn),編寫(xiě)安全智能合約比較困難,即使是高級(jí)開(kāi)發(fā)人員編寫(xiě)的智能合約也可能被黑客攻擊。由于這些智能合約通常具有很高的經(jīng)濟(jì)價(jià)值,因此黑客攻擊和破解它們的動(dòng)機(jī)也很高。再加上Web3的不變性,安全性變得更加重要。安全性因此成為了智能合約開(kāi)發(fā)人員的首要任務(wù)。

本文將介紹智能合約開(kāi)發(fā)的每個(gè)階段可用的一些安全工具,并對(duì)采用這些工具提供一些建議。

1、為開(kāi)發(fā)做好準(zhǔn)備

當(dāng)開(kāi)始開(kāi)發(fā)智能合約時(shí),安全性應(yīng)該是開(kāi)發(fā)人員首要考慮的問(wèn)題,而一些工具可以在準(zhǔn)備編寫(xiě)代碼時(shí)提供幫助,這其中包括文檔、檢測(cè)和編寫(xiě)可重用代碼。

首先,文檔是任何開(kāi)發(fā)項(xiàng)目的關(guān)鍵,智能合約開(kāi)發(fā)也不例外。以太坊自然規(guī)范格式(NatSpec)是一種記錄智能合約的好方法。

NatSpec是一種特殊形式的注釋,用于為合約、接口、庫(kù)、函數(shù)和事件提供豐富的文檔。例如以下Tree Contract的穩(wěn)定性代碼片段:

// 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 對(duì)Solidity Contract的注釋

通過(guò)使用NatSpec注釋,可以很容易地向其他開(kāi)發(fā)人員、審核人員或只想與合約交互的人解釋代碼。簡(jiǎn)單地說(shuō),它是干凈的、可讀的、容易理解的。

其次,重用經(jīng)過(guò)實(shí)戰(zhàn)測(cè)試的代碼是降低智能合約中漏洞風(fēng)險(xiǎn)的另一種經(jīng)過(guò)驗(yàn)證的方法。目前有許多廣泛使用的開(kāi)源智能合約庫(kù),例如OpenZeppelin,其中包含用于實(shí)現(xiàn)訪問(wèn)控制、暫停功能、升級(jí)等的預(yù)先編寫(xiě)的邏輯,以及用于優(yōu)化使用的Solmate合約。

最后,檢測(cè)是在智能合約代碼中發(fā)現(xiàn)潛在問(wèn)題的具有價(jià)值的工具。它可以在代碼中發(fā)現(xiàn)風(fēng)格錯(cuò)誤、違反編程約定和不安全的結(jié)構(gòu)。有很多很好的檢測(cè)工具可用,例如ETHLint(以前的Solium)。檢測(cè)可以幫助發(fā)現(xiàn)潛在的問(wèn)題(例如重入漏洞這樣的安全問(wèn)題),甚至在它們成為代價(jià)高昂的錯(cuò)誤之前。

通過(guò)在智能合約開(kāi)發(fā)過(guò)程中考慮文檔、檢測(cè)和可重用代碼,可以提高合約的安全性。從長(zhǎng)遠(yuǎn)來(lái)看,花時(shí)間正確地設(shè)置這些將會(huì)在安全性和效率方面得到回報(bào)。

2、開(kāi)發(fā)

現(xiàn)在了解可以在編碼時(shí)提供幫助的兩類工具——單元測(cè)試和基于屬性的測(cè)試。

單元測(cè)試顯然是創(chuàng)建安全可靠代碼的重要組成部分。通過(guò)測(cè)試代碼的單個(gè)單元,可以確保合約按照預(yù)期的方式運(yùn)行,并希望在生產(chǎn)中出現(xiàn)問(wèn)題之前發(fā)現(xiàn)任何潛在問(wèn)題。

有幾種不同的工具可用于為智能合約編寫(xiě)單元測(cè)試。Foundry、Truffle和Brownie都是支持各種編程語(yǔ)言的流行框架。

Foundry(用Rust編寫(xiě))是一個(gè)用于編寫(xiě)智能合約的框架,其中包括測(cè)試框架Forge。偽造單元測(cè)試可以直接在Solidity中編寫(xiě),包括許多欺騙代碼,這些代碼可以提供斷言、改變EVM狀態(tài)的能力、模擬數(shù)據(jù)等等。Foundry還帶有內(nèi)置的Fuzzing(將在后面的文章中詳細(xì)討論)。

// 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單元測(cè)試示例

Truffle也是構(gòu)建智能合約的框架。Truffle中的單元測(cè)試可以用Solidity或JavaScript編寫(xiě)。開(kāi)發(fā)人員通常使用基于JavaScript的測(cè)試與合同進(jìn)行外部交互,并使用Solidity測(cè)試評(píng)估合同在實(shí)際區(qū)塊鏈上的行為。Truffle使用Mocha進(jìn)行異步測(cè)試,使用Chai進(jìn)行斷言。

Brownie是一個(gè)基于python的框架,用于開(kāi)發(fā)和測(cè)試智能合約。Brownie與pytest集成用于單元測(cè)試,并提供了一個(gè)堆棧跟蹤分析工具來(lái)測(cè)量代碼覆蓋率。

在編寫(xiě)單元測(cè)試時(shí),通過(guò)測(cè)試盡可能多的代碼不同部分來(lái)實(shí)現(xiàn)高測(cè)試覆蓋率,以確保所有功能都能按預(yù)期工作。Foundry不需要額外的插件來(lái)測(cè)量測(cè)試覆蓋率。對(duì)于其他框架,可能至少可以添加一個(gè)插件來(lái)衡量這一點(diǎn)。

雖然單元測(cè)試是確保智能合約正確性的可靠方法,但基于屬性的測(cè)試允許對(duì)智能合約進(jìn)行更深入的驗(yàn)證。這是一個(gè)相對(duì)較新的概念,與傳統(tǒng)的單元測(cè)試相比,它提供了一系列優(yōu)勢(shì)?;趯傩缘臏y(cè)試側(cè)重于測(cè)試智能合約的屬性,而不是單個(gè)組件。

在指南中,“屬性描述了智能合約的預(yù)期行為,并聲明了關(guān)于其執(zhí)行的邏輯斷言。屬性必須始終為真?;趯傩缘臏y(cè)試工具將智能合約的代碼和用戶定義的屬性集合作為輸入,并檢查執(zhí)行是否在任何時(shí)間點(diǎn)違反了它們?!?/p>

基于屬性的測(cè)試基于模糊概念,這是一種通過(guò)引入隨機(jī)輸入來(lái)測(cè)試系統(tǒng)的技術(shù)。這意味著基于屬性的測(cè)試可以在更廣泛的層面上檢查智能合約,因?yàn)樗灰蕾囉陂_(kāi)發(fā)人員提供的特定輸入。正因?yàn)槿绱?,它正成為一種越來(lái)越流行的測(cè)試智能合約的方法。

以之前的合約為例,使用基于屬性的方法來(lái)測(cè)試一個(gè)簡(jiǎn)單的staking函數(shù)。為此,將使用Scribble,這是一種規(guī)范語(yǔ)言和運(yùn)行時(shí)工具,它使這一切變得更加容易。

// 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.sender] += amount;
bool success = IERC20(token).transferFrom(msg.sender, address(this), amount);
if (!success) revert TransferFailed();
return success;
}
}

使用Scribble Notation進(jìn)行的樣品可靠性測(cè)試

圖片

不同的工具可以使用Scribble規(guī)范進(jìn)行屬性測(cè)試

為了評(píng)估staking函數(shù),必須檢查它是否在成功執(zhí)行的情況下返回true。這可以通過(guò)向stake函數(shù)代碼添加注釋來(lái)完成,正如上面所表明的那樣,不需要單獨(dú)的測(cè)試文件。然后可以運(yùn)行Scribble CLI工具將Scribble注釋轉(zhuǎn)換為斷言。接下來(lái),這些斷言必須通過(guò)模糊器(如Diligence Fuzzing或Mythril)運(yùn)行,以確定是否存在任何違反屬性的情況。

圖片

 來(lái)自Diligence Fuzzing活動(dòng)示例的報(bào)告

還有一些其他工具可用于基于屬性的測(cè)試,例如Foundry。Scribble(以上使用的)、Diligence Fuzzing和Mythril是最值得推薦的幾種工具。Scribble和Diligence Fuzzing是由ConsenSys Diligence構(gòu)建的免費(fèi)開(kāi)源工具。Mythril是一個(gè)旨在檢測(cè)以太坊智能合約中潛在漏洞的工具。

Scribble這種工具令人喜歡,因?yàn)榘芽蛇@些測(cè)試放在一起就像添加函數(shù)注釋一樣簡(jiǎn)單。

3、后期開(kāi)發(fā)

最后一組工具是后期開(kāi)發(fā)。具體來(lái)說(shuō),就是監(jiān)控。

因?yàn)榇蠖鄶?shù)區(qū)塊鏈上的智能合約代碼是不可變的,一旦代碼被推送到主網(wǎng),就幾乎無(wú)法控制它。監(jiān)控可以幫助開(kāi)發(fā)人員了解代碼中的任何問(wèn)題或更改,以便可以快速解決它們。這不僅可以幫助開(kāi)發(fā)人員提高合約的安全性,還可以幫助優(yōu)化和改進(jìn)其功能。

OpenZepplin的Defender Sentinels和Tenderly的實(shí)時(shí)警報(bào)工具非常適合監(jiān)控區(qū)塊鏈上合約和錢(qián)包。

Tenderly Alerts提供了一組自定義觸發(fā)器以供選擇,允許快速設(shè)置各種活動(dòng)的警報(bào),例如部署新合同時(shí)、發(fā)送或接收事務(wù)時(shí)以及特定地址時(shí)。

Defender Sentinel通過(guò)定義的一系列自定義參數(shù)提供實(shí)時(shí)安全監(jiān)控和警報(bào),例如,如果取款超過(guò)特定閾值,如果有人執(zhí)行關(guān)鍵操作(例如調(diào)用轉(zhuǎn)賬所有權(quán)),或者如果黑名單地址試圖與合約交互的時(shí)候。

4、結(jié)論

智能合約安全工具非常重要。希望本文能夠幫助人們了解適合工具,以便編寫(xiě)更安全的智能合約。

原文鏈接:https://dzone.com/articles/secure-smart-contract-tools-an-end-to-end-develope

責(zé)任編輯:武曉燕 來(lái)源: 51CTO技術(shù)棧
相關(guān)推薦

2009-08-27 12:00:40

ibmdwJava

2022-05-16 13:58:52

開(kāi)發(fā)區(qū)塊鏈Web3

2025-02-08 11:02:57

2009-04-03 10:00:56

2022-04-20 10:56:06

JavaJVM參數(shù)

2021-10-27 10:43:24

開(kāi)發(fā)技能代碼

2022-01-04 19:26:42

開(kāi)發(fā)人員安全性網(wǎng)絡(luò)安全

2020-05-22 22:48:01

GUI Git開(kāi)發(fā)命令行

2020-06-09 07:57:47

前端開(kāi)發(fā)代碼

2019-06-03 14:20:30

Java數(shù)據(jù)庫(kù)大數(shù)據(jù)工具

2012-07-20 10:46:44

Web

2020-05-11 09:54:33

JavaScript開(kāi)發(fā)技術(shù)

2018-11-26 09:55:07

MySQL誤刪數(shù)據(jù)數(shù)據(jù)庫(kù)

2012-05-30 15:15:42

ibmdw

2023-03-15 07:12:53

企業(yè)開(kāi)發(fā)人員提供商

2024-10-30 08:19:07

2021-04-05 14:31:33

Java開(kāi)發(fā)Kotlin

2022-06-06 10:30:23

容器鏡像

2009-12-11 14:50:14

Visual Basi

2009-11-23 20:07:51

ibmdw開(kāi)發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)