這一講,我們將介紹 solidity 中的控制流,然后講如何用 solidity 實現插入排序(InsertionSort),一個看起來簡單,但實際上很容易寫出 bug 的程序。
我最近在重新學 solidity,鞏固一下細節,也寫一個「Solidity 極簡入門」,供小白們使用(編程大佬可以另找教程),每周更新 1-3 講。
所有代碼和教程開源在 github: github.com/AmazingAng/WTFSolidity
Solidity 的控制流與其他語言類似,主要包含以下幾種:
if-else
Solana基金會發布3月驗證者健康報告:擬招募質押生態系統負責人:金色財經報道,Solana基金會官方發布2023年3月驗證者健康報告,其中指出Solana是目前世界上節點數最多的權益證明網絡之一,也是中本聰系數分布最多的網絡之一,全球分布3000多個共識和RPC節點。此外,Solana基金會表示作為一個多驗證者客戶端網絡,目前已有兩個客戶端投產運行,第三個客戶端正在開發中。在過去的120天里,來自多個組織的104位核心貢獻者向Solana網絡的Github提供支持,Solana基金會還透露將會招募一位質押生態系統負責人。[2023/3/24 13:22:56]
for 循環
12月Solana鏈上NFT交易額超7500萬美元創Q4最高記錄:金色財經報道,據cryptoslam數據顯示,12月Solana鏈上NFT交易額達到75,391,207.42美元,創Q4最高記錄。此外,上個月Solana鏈上NFT銷售量達到850,624筆,平均單筆交易額約為88.63美元,獨立買家52,992個,獨立賣家77,987個。[2023/1/2 22:21:06]
while 循環
do-while 循環
Solana收益耕作平臺Cropper Finance已連接GenesysGo RPC節點:Solana鏈上收益耕作平臺Cropper Finance已經連接至GenesysGo RPC節點,可以明顯縮短在平臺上進行交互的響應時間。[2021/8/30 22:46:40]
三元運算符
三元運算符是 solidity 中唯一一個接受三個操作數的運算符,規則條件? 條件為真的表達式:條件為假的表達式。此運算符經常用作 if 語句的快捷方式。
另外還有 continue(立即進入下一個循環)和 break(跳出當前循環)關鍵字可以使用。
Solana從OKEx和MXC籌集了4000萬美元的戰略投資:OKEx和MXC正在向Solana戰略投資基金注資4000萬美元,以引導其網絡上的開發。Solana團隊將與新的資助者一起工作,以“支持下一波殺手級的dApps”。(CoinTelegraph)[2021/3/25 19:18:20]
寫在前面:
90% 以上的人用 solidity 寫插入算法都會出錯。插入排序
排序算法解決的問題是將無序的一組數字,例如 [2, 5, 3, 1],從小到大一次排列好。插入排序(InsertionSort)是最簡單的一種排序算法,也是很多人學習的第一個算法。它的思路很簡答,從前往后,依次將每一個數和排在他前面的數字比大小,如果比前面的數字小,就互換位置。示意圖:
插入排序
python 代碼
我們可以先看一下插入排序的 python 代碼:
改寫成 solidity 后有 BUG!
一共 8 行 python 代碼就可以完成插入排序,非常簡單。那么我們將它改寫成 solidity 代碼,將函數,變量,循環等等都做了相應的轉換,只需要 9 行代碼:
那我們把改好的放到 remix 上去跑,輸入 [2, 5, 3, 1]。BOOM!有 bug!改了半天,沒找到 bug 在哪。我又去 google 搜」solidity insertion sort」,然后發現網上用 solidity 寫的插入算法教程都是錯的,比如:Sorting in Solidity without Comparison
正確的 solidity 插入排序
花了幾個小時,在 Dapp-Learning 社群一個朋友的幫助下,終于找到了 bug 所在。solidity 中最常用的變量類型是 uint,也就是正整數,取到負值的話,會報 underflow 錯誤。而在插入算法中,變量 j 有可能會取到-1,引起報錯。
這里,我們需要把 j 加 1,讓它無法取到負值。正確代碼:
運行后的結果:
這一講,我們介紹了 solidity 中控制流,并且用 solidity 寫了插入排序。看起來很簡單,但實際很難。這就是 solidity,坑很多,每個月都有項目因為這些小 bug 損失幾千萬甚至上億美元。掌握好基礎,不斷練習,才能寫出更好的 solidity 代碼。
原文:《Solidity 極簡入門: 10. 控制流,用 solidity 實現插入排序》
來源:panews
PANews
媒體專欄
閱讀更多
金色早8點
Odaily星球日報
Bress
潘達看Web3
DeFi之道
區塊律動BlockBeats
比推 Bitpush News
▌ 報告:中國數字藏品市場規模五年內預計達到280億元金色財經報道,艾瑞咨詢發布《中國數字藏品行業研究報告》(后簡稱“報告”).
1900/1/1 0:00:00與高度波動的股票、信貸和外匯市場形成鮮明對比的是,最近?幾周加密貨幣市場一直保持非常穩定。隨著比特幣在許多傳統指標上得到支撐,我們在評估這里是否會形成真正的底部.
1900/1/1 0:00:00我只想說:區塊鏈投入了大量資金,但相比之下,結果卻是可悲的。 Polynya在上圖的推文里完美地框定了這篇帖子:到目前為止,我們到目前為止所做的可能就是我們使用區塊鏈所取得的全部成果.
1900/1/1 0:00:00原文出版于 2018 年 11 月。三年過去,如果作者此時再撰寫一篇這樣的文章,無疑會增補不少內容,也會減少對某些話題的描述。但回顧這篇文章仍然是有意義的.
1900/1/1 0:00:00Luna 于2018年推出,最初被開發為 Terra 的第一個本土代幣。他們把它稱為 LUNA.
1900/1/1 0:00:00近年來,區塊鏈技術應用和產業已經具備良好的發展基礎,在防偽溯源、供應鏈管理、司法存證、政務數據共享、民生服務等領域涌現了一批有代表性的區塊鏈應用.
1900/1/1 0:00:00