比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > USDT > Info

以太坊智能合約安全開發建議_ION

Author:

Time:1900/1/1 0:00:00

譯文出自:登鏈翻譯計劃

譯者:六天

校對:Tiny熊

協議相關的建議

以下建議適用于以太坊上任何智能合約的開發。

外部調用

在合約中請求外部合約時需謹慎

請求不可信的合約時可能會引入一些意外風險或錯誤。在調用外部合約時,外部合約或其依賴的其它合約中可能存在惡意代碼。因此,每個外部合約的請求都應該被認為是有風險的。如必須請求外部合約,請參考本節中的建議以最大程度的減小風險。

標記不可信合約

在自己開發的合約調用外部合約時,可以明確的將相關的變量、方法以及合約接口標記為非安全。

//badBank

//goodUntrustedBank

避免調用外部合約后更改自身合約狀態

無論使用底層調用(形式someAddress

}//goodcontractFixed{functionwithdraw(uint256amount)external{//使用所有可用的gas//使用該方式請確認檢查返回值(boolsuccess,)=msg

}

需要注意的是,

}//goodcontractauction{addresshighestBidder;uinthighestBid;mapping(address=>uint)refunds;functionbid()payableexternal{require(msg

functionwithdrawRefund()external{uintrefund=refunds;refunds=0;(boolsuccess,)=msg

}

詳見SWC-128

不要委托調用不可信的合約

使用delegatecall調用其它合約方法時,就像是調用本地合約一樣,這也造成被調合約可以更改調用合約的狀態,這是不安全的。下面示例展示了使用delegatecall導致合約被銷毀或造成了資金損失。

contractDestructor{functiondoWork()external{selfdestruct(0);}}contractWorker{functiondoWork(address_internalWorker)public{//unsafe_internalWorker

}

如果使用Destructor的合約地址為參數,調用Worker

functionnegate16(int16_i)publicpurereturns(int16){return-_i;}int8publica=negate8(-128);//-128int16publicb=negate16(-128);//128int16publicc=negate16(-32768);//-32768}

處理此問題的一種方法是在否定之前檢查變量的值,如果值等于最小整數則拋出異常。另一種方法是使用長度更大的數據類型,使得變量的值不會達到邊界值。

以太坊基金會發布官方《主網合并公告》并推出100萬美元漏洞賞金激勵措施:8月25日消息,以太坊基金會官方網站發布協議支持團隊最新的《主網合并公告》,除了確定世界標準時間2022年9月6日上午11:34:47升級Bellatrix、TerminalTotal Difficulty觸發預計在2022年9月10日至20日之間之外,以太坊基金會還宣布將原漏洞賞金激勵計劃擴大四倍升至100萬美元,旨在鼓勵社區在9月8日之前發現The Merge中存在的潛在問題和Bug。

此外,以太坊基金會提醒節點運營商必須同時運行執行層和共識層客戶端,才能在TheMerge期間和之后在網絡上正常運行。[2022/8/25 12:46:42]

對int類型進行乘或除以-1時,也會有類似的問題。

Solidity特定建議

以下是針對Solidity語言的特定建議,但對于使用其他語言開發智能合約時也有指導意義。

使用assert()驗證不變量

斷言失敗時將會觸發斷言保護,如不變量被更改。例如,在以太坊發行的Token的總量是可以固定的,可以通過assert()進行驗證。斷言經常和其他邏輯結合使用,比如暫停合約和允許升級。(否則,可能會出現斷言一直失敗。)

例如:

contractToken{mapping(address=>uint)publicbalanceOf;uintpublictotalSupply;functiondeposit()publicpayable{balanceOf=msg

}

注意,斷言通過不代表以太幣余額一定相等,因為可以不通過deposit()方法,強制向合約地址發送以太幣。

正確使用assert(),require(),revert()

assert和require函數可以用于參數校驗,如果不通過則拋出異常。assert函數應僅用于檢查內部錯誤和檢查不變量。require函數更適合用于確保條件滿足,如輸入或合約狀態變量被滿足,也可以驗證調用外部合約的返回值。*

遵循此范例,形式分析工具可以驗證永遠不會到達的無效的操作碼:這意味著不會違反代碼中的不變式且代碼將被形式化驗證。

pragmasolidity^0

}

詳見SWC-110&SWC-123

函數修飾器僅用于檢查

modifier中的代碼通常是在主函數體之前執行的,因此任何狀態變量的改變或外部合約調用都會違反Checks-Effects-Interactions模式。而且,由于修飾器的代碼和主函數體的代碼不在一塊,開發者可能會忽略修飾器中的代碼。例如,在修飾器中的代碼調用外部合約時,可能導致重入攻擊。

contractRegistry{addressowner;functionisVoter(address_addr)externalreturns(bool){//Code}}contractElection{Registryregistry;modifierisEligible(address_addr){require(registry

以太坊鏈上逾1541萬枚USDC從火幣轉入FTX:Whale Alert數據顯示,北京時間10月21日20:19:28,以太坊鏈上15418260枚USDC(價值超過1541.8萬美元)從火幣(0x83a12795開頭地址)轉入FTX(0x2faf487a44開頭地址)。[2020/10/21]

functionvote()isEligible(msg

//goodfunctiondeposit()payableexternal{balances=msg

function()payable{require(msg

在fallback函數中檢查消息長度

由于fallback函數可以在無消息數據或未匹配到合約方法時被觸發,因此,如果僅僅是使用fallback函數接收以太幣,建議檢查消息是否為空。否則,調用者可能因使用不正確調用了不存在的函數而得不到通知。

//badfunction()payable{emitLogDepositReceived(msg

//goodfunction()payable{require(msg

在方法和狀態變量中明確標記payable

StartingfromSolidity0

}contractGame{functionbuyCoins()payablepublic{//5%goestocharitycharity

}

上述合約中,Game合約內部調用了Charity

}contractGame{functionbuyCoins()payablepublic{//5%goestocharitycharity

}

上述合約中,通過Charity合約進行交易都會記錄在該合約的事件列表中,以及捐贈的金額。

注意:優先使用新版本Solidity的構造函數優先使用selfdestruct(而不是suicide),keccak256(而不是sha3)類似的構造/別名。類似的模式require(msg

}

合約用戶應了解他們打算使用的所有合約源代碼。

避免使用tx

functionsendTo(addressreceiver,uintamount)public{require(tx

}contractAttackingContract{MyContractmyContract;addressattacker;functionAttackingContract(addressmyContractAddress)public{myContract=MyContract(myContractAddress);attacker=msg

function()public{myContract

}

應該使用msg

}contractBisFinal{intpublicfee;functionB(uintf)Final(f)public{}functionsetFee()public{fee=3;}}contractCisFinal{intpublicfee;functionC(uintf)Final(f)public{}functionsetFee()public{fee=5;}}contractAisB,C{functionA()publicB(3)C(5){setFee();}}

觀點:Defi項目遲早將脫離以太坊網絡并轉移到中心化平臺上:9月8日消息,比特幣開發者Udi Wertheimer日前表示,Defi項目脫離以太坊并轉移到中心化平臺上只是時間問題。他為平臺緩慢的交易速度,高昂的手續費和復雜的MetaMask感到遺憾,但他對聯合創始人Vitalik Buterin和Joe Lubin沒什么好說的。Wertheimer建議DeFi不需要以太坊,他說:“在我看來,整個DeFi代表去中心化金融。實際上,并沒有真正去中心化的內容,因為總有人控制這些項目。”Wertheimer預測,DeFi在以太網絡上的時間不會太長。他說:“在我看來,它的發展方向是,如果它生存下來,它將離開以太坊,進入集中式平臺,因為它們更便宜,速度更快。”Udi Wertheimer說,雖然使用比特幣有金融和經濟利益,但他也對區塊鏈持懷疑態度。按照Wertheimer的說法,區塊鏈的好處是創建不受他人控制的數字資產。(Beincrypto)[2020/9/8]

合約被部署時,按照從右到左的順序線性繼承(在關鍵字_is_之后,按從最基層父類到最派生的子類的順序列出)。合約A的繼承順序:

Final<-B<-C<-A

示例合約中最終fee的值是5。開發人員可以通過對布爾類型的排序,可以隱藏子合約中一些關鍵信息。對于這種多重繼承,需要仔細檢查。

有關安全性和繼承的更多信息,請查看本文。

詳見SWC-125

使用接口類型代替地址以確保安全

當函數將合同地址作為參數時,最好傳遞接口或合約類型,而不是地址類型。如果該函數在源代碼中的其他位置調用,則編譯器將提供其他類型安全保證。

下方代碼給出了兩種方式:

contractValidator{functionvalidate(uint)externalreturns(bool);}contractTypeSafeAuction{//goodfunctionvalidateBet(Validator_validator,uint_value)internalreturns(bool){boolvalid=_validator

}contractTypeUnsafeAuction{//badfunctionvalidateBet(address_addr,uint_value)internalreturns(bool){Validatorvalidator=Validator(_addr);boolvalid=validator

}

從下面的示例中可以看出上方合約TypeSafeAuction的好處。如果方法validateBet()不是使用合約Validator類型作為參數調用,則編譯器將拋出以下錯誤:

contractNonValidator{}contractAuctionisTypeSafeAuction{NonValidatornonValidator;functionbet(uint_value){boolvalid=validateBet(nonValidator,_value);//TypeError:Invalidtypeforargumentinfunctioncall.//InvalidimplicitconversionfromcontractNonValidator//tocontractValidatorrequested.}}

動態 | 以太坊2.0測試網已可在智能手機上運行:金色財經報道,三個主要的以太坊2.0客戶端一直在相互提升,他們宣布,以太坊2.0測試網現在可以在移動設備上運行。目前僅支持Android型號,據稱比普通錢包具有更高的安全性。[2020/2/6]

避免使用extcodesize檢查是否為外部帳戶

通常使用以下修飾符來驗證是從外部帳戶還是合約帳戶進行請求:

//badmodifierisNotContract(address_a){uintsize;assembly{size:=extcodesize(_a。require(size==0);_;}

這個想法很簡單:如果一個地址包含代碼,則它不是EOA,而是合約帳戶。但是合約在構造期間沒有源代碼。使用extcodesize來檢查合約地址會返回0.下面示例,展示了如何規避此檢查:

contractOnlyForEOA{uintpublicflag;//badmodifierisNotContract(address_a){uintlen;assembly{len:=extcodesize(_a。require(len==0);_;}functionsetFlag(uinti)publicisNotContract(msg

}contractFakeEOA{constructor(address_a)public{OnlyForEOAc=OnlyForEOA(_a);c

}

由于合約地址可以預先計算,所以在某個區塊中,對該地址的檢查可能會失敗。

警告:這是一個比較細小的問題。如果只是為了防止其他合約能夠調用您的合同,那么使用extcodesize來檢查足矣。還有一種替代方法是檢查的值,這種方式也有自己的缺點。在其他情況下,extcodesize檢查可以滿足需求。可以了解EVM的基本原理來判斷。

過時的/歷史的建議

以下這些建議由于協議的更改或solidity版本升級而不再相關。在此僅作記錄。

小心被0除(Solidity<0.4)

在Solidity0.4版本之前,除0返回零而不是引發異常。確保您至少運行版本0.4。

區分函數和事件(Solidity<0.4.21)

在events中建議使用大寫字母和添加前綴,以防止functions和events之間混淆的風險。對于functions,除構造函數外,始終以小寫字母開頭。

注意:Solidity在v0.4.21版本中,引入了emit關鍵字來提交事件emitEventName();。從0.5.0開始,必需使用這個方式。

來源:https://consensys.github.io/smart-contract-best-practices/recommendations/

本翻譯由CellNetwork贊助支持。

參考資料

登鏈翻譯計劃:https://github.com/lbc-team/Pioneer

動態 | 有人用價值1.6萬美元的以太坊購買F1數字收藏品:據Newslogical消息,在剛剛結束的F1 Delta Time拍賣會上,一個不知名的人用高達91.5的以太坊(約合16,000美元)獲得了F1許可的數字收藏品的``日本版2019'',這是一個以太坊上的區塊鏈游戲,專注于交易和收集獨特組件,駕駛員和汽車。[2019/10/20]

六天:https://learnblockchain.cn/people/436

Tiny熊:https://learnblockchain.cn/people/436

重入攻擊:https://consensys.github.io/smart-contract-best-practices/known_attacks#reentrancy

checks-effects-interactions模式:https://learnblockchain.cn/docs/solidity/security-considerations.html#checks-effects-interactions

SWC-107:https://swcregistry.io/docs/SWC-107

重入攻擊:https://consensys.github.io/smart-contract-best-practices/known_attacks#reentrancy

EIP1884:https://eips.ethereum.org/EIPS/eip-1884

checks-effects-interactionspattern:https://learnblockchain.cn/docs/solidity/security-considerations.html#checks-effects-interactions

SWC-104:https://swcregistry.io/docs/SWC-104

gaslimit的問題:https://consensys.github.io/smart-contract-best-practices/known_attacks#dos-with-block-gas-limit

SWC-128:https://swcregistry.io/docs/SWC-128

issue61:https://github.com/ConsenSys/smart-contract-best-practices/issues/61

SWC-112:https://swcregistry.io/docs/SWC-112

SWC-132:https://swcregistry.io/docs/SWC-132

Vickreyauctions:https://en.wikipedia.org/wiki/Vickrey_auction

承諾方案:https://en.wikipedia.org/wiki/Commitment_scheme

http://btcrelay.org:_http://btcrelay.org_

RANDAO:http://github.com/randao/randao

*:https://ethereum.stackexchange.com/questions/419/when-can-blockhash-be-safely-used-for-a-random-number-when-would-it-be-unsafe

將導致相同的數字:https://en.wikipedia.org/wiki/Two's_complement#Most_negative_number

強制向合約地址發送以太幣:#remember-that-ether-can-be-forcibly-sent-to-an-account

*:https://learnblockchain.cn/docs/solidity/control-structures.html#assert-require-revert

SWC-110:https://swcregistry.io/docs/SWC-110

SWC-123:https://swcregistry.io/docs/SWC-123

Checks-Effects-Interactions:https://learnblockchain.cn/docs/solidity/security-considerations.html#checks-effects-interactions

modifiers:https://solidity.readthedocs.io/en/develop/contracts.html#function-modifiers

浮點型:https://solidity.readthedocs.io/en/develop/types.html#fixed-point-numbers

Fallback函數:http://solidity.readthedocs.io/en/latest/contracts.html#fallback-function

fallback函數:http://solidity.readthedocs.io/en/latest/contracts.html#fallback-function

exceptwhenforced:https://consensys.github.io/smart-contract-best-practices/recommendations/#remember-that-ether-can-be-forcibly-sent-to-an-account

*:https://solidity.readthedocs.io/en/develop/contracts.html?#visibility-and-getters

SWC-100:https://swcregistry.io/docs/SWC-100

SWC-108:https://swcregistry.io/docs/SWC-108

SWC-103:https://swcregistry.io/docs/SWC-103

Solidity更新日志:https://github.com/ethereum/solidity/blob/develop/Changelog.md

覆蓋:https://en.wikipedia.org/wiki/Variable_shadowing

有意為之:https://github.com/ethereum/solidity/issues/1249

Solidity文檔:https://learnblockchain.cn/docs/solidity/security-considerations.html#tx-origin

Vitalik:'DoNOTassumethattx.originwillcontinuetobeusableormeaningful.':https://ethereum.stackexchange.com/questions/196/how-do-i-make-my-dapp-serenity-proof/200#200

SWC-115:https://swcregistry.io/docs/SWC-115

SWC-115:https://swcregistry.io/docs/SWC-115

合約:https://etherscan.io/address/0xcac337492149bdb66b088bf5914bedfbf78ccc18#code

以太坊黃皮書:https://ethereum.github.io/yellowpaper/paper.pdf

沒有規定區塊間隔時間區間:https://ethereum.stackexchange.com/a/5926/46821

Geth:https://github.com/ethereum/go-ethereum/blob/4e474c74dc2ac1d26b339c32064d0bac98775e77/consensus/ethash/consensus.go#L45

Parity:https://github.com/paritytech/parity-ethereum/blob/73db5dda8c0109bb6bc1392624875078f973be14/ethcore/hide/verification/verification.rs#L296-L307

平均區塊時間:https://etherscan.io/chart/blocktime

分叉重組:https://blog.ethereum.org/2015/08/08/chain-reorganisation-depth-expectations/

難度炸彈:https://github.com/ethereum/EIPs/issues/649

SWC-116:https://swcregistry.io/docs/SWC-116

SWC-125:https://swcregistry.io/docs/SWC-125

也有自己的缺點:https://consensys.github.io/smart-contract-best-practices/recommendations/#avoid-using-txorigin

v0.4.21:https://github.com/ethereum/solidity/blob/develop/Changelog.md#0421-2018-03-07

CellNetwork:https://www.cellnetwork.io/?utm_souce=learnblockchain

本文來源于非小號媒體平臺:

登鏈社區

現已在非小號資訊平臺發布105篇作品,

非小號開放平臺歡迎幣圈作者入駐

入駐指南:

/apply_guide/

本文網址:

/news/9558539.html

免責聲明:

1.資訊內容不構成投資建議,投資者應獨立決策并自行承擔風險

2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表非小號的觀點或立場

上一篇:

幣安為何推出第三條鏈?這對BNB意味著什么?

Tags:IONCONACTRACIONXOmni Consumer ProtocolDiffract FinanceTesseract

USDT
硬核:CKB 與 Cell 就是 Bitcoin 與 UTXO 的一般化版本_COI

很多人說Cell模型簡單得令人感到幸福,如果你覺得自己已經理解了Bitcoin和UTXO,那么恭喜你,你也已經理解了CKB和Cell!在本篇文章中.

1900/1/1 0:00:00
BTC17500-19400 空間的完整布局_比特幣

11月“ETH600刀頂部”的提醒讓很多圈友收益,同時幣姥爺項目分析也收獲了接近40位新的圈友,感謝大家的支持;12月我們也正在繼續為圈友帶來極具價值的信息分享、行情分析.

1900/1/1 0:00:00
Pantera 合伙人:解讀加密貨幣衍生品交易所新秀 Globe_GLO

Globe瞄準的是原生加密貨幣交易所與CME等傳統交易所的中間地帶。撰文:PaulVeradittakit,PanteraCapital合伙人翻譯:盧江飛在加密貨幣衍生品交易所領域里,Globe.

1900/1/1 0:00:00
老李解幣:行情走勢完美貼合上午分析策略BTC多空雙殺獲利約980點_ETH

近期可謂一路交易一路順,行情好,感覺也對了,每日交易的次數也在增加。以太坊一天幾十個點的利潤也不再那么艱難,前提是你要有專業技術能力做支撐輔助.

1900/1/1 0:00:00
ASICBOOST 再起風波:億邦獲獨家授權 神馬三星被起訴 回顧專利亂戰歷史_ASI

“神馬當年選擇與ASICBOOST站在一起,沒想到最終卻第一個被ASICBOOST訴上法庭”。11月30日吳說區塊鏈獨家披露,億邦宣布已自專利人CircleLineInternational處已.

1900/1/1 0:00:00
谷燕西:數字資產交易所獲得牌照只是第一步_區塊鏈

撰文:谷燕西,美國力研咨詢公司創始人、區塊鏈和加密數字資產行業的研究和從業者最近,在新加坡和香港都有機構率先獲得所在地頒發的數字資產交易牌照.

1900/1/1 0:00:00
ads