譯文出自:登鏈翻譯計劃
譯者:六天
校對: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}
處理此問題的一種方法是在否定之前檢查變量的值,如果值等于最小整數則拋出異常。另一種方法是使用長度更大的數據類型,使得變量的值不會達到邊界值。
以太坊鏈上NFT銷售總額突破250億美元 創歷史新高:金色財經報道,據最新數據顯示,以太坊鏈上NFT銷售總額突破250億美元,創下歷史新高,本文撰寫時為25,206,915,503美元,鏈上交易數量為9,438,778筆。 據歷史數據顯示,以太坊鏈上NFT銷售總額在2022年1月7日突破130億美元,這意味著在不到四個月時間里,以太坊鏈上NFT總銷售額增長超過120億美元,漲幅超過90%。[2022/5/2 2:44:58]
對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
functionvote()isEligible(msg
//goodfunctiondeposit()payableexternal{balances=msg
以太坊L2網絡總鎖倉量達到63.7億美元:金色財經報道,L2BEAT數據顯示,截至3月24日,以太坊Layer2上總鎖倉量已達到63.7億美元。其中鎖倉量最高的為擴容方案Arbitrum,約32.8億美元,占比51.38%。其次是dYdX,鎖倉量超9.7億美元,占比15.38%。[2022/3/24 14:14:26]
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();}}
彭博首席策略師稱以太坊或已成為“The ? Word”贏家:彭博首席策略師Mike McGlone在推特上指出:“以太坊是不是已成為‘The ? Word’比特幣活動的贏家?”他還稱,以太坊正在加入黃金和比特幣的“混戰”,并分享了一張圖表,顯示ETH緊跟比特幣的上漲。今年早些時候,McGlone曾在推特上表示,以太坊對金融科技行業的革命性,就像比特幣對于黃金一樣。但他并非偏愛其中一方,除了看好ETH以外,他還認為比特幣的價格有望達到10萬美元。(U.Today)[2021/7/26 1:16:41]
合約被部署時,按照從右到左的順序線性繼承(在關鍵字_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.}}
避免使用extcodesize檢查是否為外部帳戶
通常使用以下修飾符來驗證是從外部帳戶還是合約帳戶進行請求:
動態 | 以太坊去中心化資助平臺 Panvala 公布第五期資助名單:以太坊去中心化資助平臺 Panvala 公布第五期資助項目名單。獲得資助最多的為加拿大科技公司 ChainSafe ,該公司因開發以太坊 2.0 輕量級客戶端獲得 350,000 PAN 代幣的資助。其他受到資助的項目包括:參與開發以太坊 2.0 智能合約執行環境的 Quilt、去中心化節點基礎設施提供商 DappNode、改善 Layer 2 解決方案 Optimistic Rollup 兼容性的 Nutberry、Ewasm 編譯器 SOLL、DApp 數據庫節點開發商 Menlo.one、簡化錢包登陸流程的 Universal Login,將應用嵌入加密貨幣錢包的項目 Alice,基于以太坊的錢包 AlphaWallet、隱私軟件 FairDrive。Panvala 表示目前已經為以太坊生態系統的 36 個項目發放了資金,其支持捐贈的贊助商包括 Unstoppable Domains、Helium 以及 MythX。Panvala 是為以太坊生態項目服務的去中心化資助平臺,該平臺使用 DAO 的機制邀請成員投票并使用其設計的代幣 PAN 資助項目,旨在為項目在不影響白皮書可交付成果的影響下實現重點工作。[2020/2/7]
//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)
動態 | 以太坊團隊推遲開發Casper12個月:據btcmanager消息,以太坊團隊8月31日宣布將Casper的開發推遲12個月,以減少區塊獎勵并保持穩定。此外,以太坊團隊接受了EIP-1234提案,這個EIP不是向前兼容的,同時還在難度計算中引入向后不兼容性,區塊獎勵將會調整到2個ETH,uncle和nephew獎勵也會相應做出調整。另外該EIP還將延遲難度炸彈4200萬秒,大約1.4年的時間,從而使鏈在2020年夏天回到30秒的區塊時間。[2018/9/5]
在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
六天: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意味著什么?
文章系金色財經專欄作者牛七的區塊鏈分析記供稿,發表言論僅代表其個人觀點,僅供學習交流!金色盤面不會主動提供任何交易指導,亦不會收取任何費用指導交易,請讀者仔細甄別,謹防上當.
1900/1/1 0:00:00合約亂斗第6季-跟隨第六感,本賽季沖榜可瓜分10000元現金獎池,現金可直接提取。參與活動,請務必點此報名.
1900/1/1 0:00:00這里是IPFS資訊快車,想進filecoin技術交流群的以及與圈內大佬深入溝通,或者了解更多FIL資訊,深入了解FIL的(+V:FIL101).
1900/1/1 0:00:00目前100000人已關注加入我們掃一掃下載全網最新數據報告 查看完整報告請閱讀全文 查看完整報告請閱讀全文 以上資料均從網絡公開資料收集整理而成.
1900/1/1 0:00:002020年已到尾聲,梳理這一年的區塊鏈行業,DeFi可以稱得上是2020年最熱點、當紅炸子雞。就連今年第四次減半,將帶動牛市再次回歸的比特幣在DeFi大火的幾個月里,也顯得暗淡無光,被投資者暫時.
1900/1/1 0:00:001Confirmation的創始人NickTomaino認為,對于早期創始人而言,最佳決策通常是在資金方面保持紀律,在產品方向方面保持專注.
1900/1/1 0:00:00