這一講,我們將介紹 solidity 中的控制流,然后講如何用 solidity 實現插入排序(InsertionSort),一個看起來簡單,但實際上很容易寫出 bug 的程序。
我最近在重新學 solidity,鞏固一下細節,也寫一個「Solidity 極簡入門」,供小白們使用(編程大佬可以另找教程),每周更新 1-3 講。
所有代碼和教程開源在 github: github.com/AmazingAng/WTFSolidity
Solidity 的控制流與其他語言類似,主要包含以下幾種:
if-else
社區提議分叉Solana以擺脫被SEC列為證券:6月12日消息,NFT項目Degen Picks聯合創始人capsjpeg近日在推特上發起關于“是否同意分叉Solana(SOL),以擺脫SEC將其列入證券等問題”的投票,共有2050人參與投票,其中39.9%支持分叉。ABC(abracadabra) NFT創始人HGE.ABC對此表示支持,他表示,“這個想法雖然大膽但實際上并不是一個壞主意,社區分叉Solana將可擺脫SEC問題。”
Solana開發者論壇尚未有關于任何分叉的討論,且未有支持者提供具體的實施方案。[2023/6/12 21:30:46]
for 循環
Solana上NFT協議Metaplex將推出代幣MPLX,同時將進行空投:9月18日消息,Solana上NFT協議Metaplex宣布將于9月20日推出治理和實用代幣MPLX,使用Metaplex協議啟動的NFT項目有機會獲得空投,快照已拍攝,此外將于周一開啟關于空投給收藏者的提案投票。MPLX的持有者可以在Metaplex DAO中投票,直接參與協議的未來發展方向。
此前報道,1月18日,Metaplex完成4600萬美元融資。Multicoin Capital和Jump Crypto領投。[2022/9/18 7:04:00]
while 循環
Decaf開發者:SOL漏洞非受信應用問題,所有Phantom錢包都遭受影響:8月3日消息,Decaf開發者@JuanRdBO在社交媒體上回應此前Magic Eden發布的SOL漏洞稱,這不是受信應用的問題。如果用戶曾與DeJBGdMFa1uynnnKiwrVioatTuHmNLpyFKnmB5kaFdzQ進行過交互(Phantom在創建錢包時與之交互),錢包就會遭受入侵。
此前報道,Solana生態NFT市場MagicEden在社交媒體上發布警告稱,似乎有一個波及面極廣的SOL漏洞,正在耗盡整個生態系統的錢包。MagicEden提醒用戶進行以下設置保護個人資產:1.進入Phantom錢包設置頁面;2.點擊受信應用;3.撤銷任何可疑鏈接的權限。[2022/8/3 2:54:54]
do-while 循環
Zebec協議宣布融資1500萬美元, Solana Ventures和Distributed Global領投:金色財經報道,Zebec協議宣布宣布獲得1500萬美元融資,由Solana Ventures 和 Distributed Global 領投,投資方包括 Lightspeed Venture Partners、Circle、Coinbase、Alameda Research、OKX Blockdream Ventures、DST Global Partners、Road Ventures、Global Founders Capital、BECO Capital、Greenoaks、GoldenTree Asset Management 和 500初創公司將用于繼續擴展 Zebec DeFi 支付解決方案。
據悉,Zebec是Solana上的一個連續且可編程的現金流協議。[2022/2/23 10:09:28]
三元運算符
三元運算符是 solidity 中唯一一個接受三個操作數的運算符,規則條件? 條件為真的表達式:條件為假的表達式。此運算符經常用作 if 語句的快捷方式。
另外還有 continue(立即進入下一個循環)和 break(跳出當前循環)關鍵字可以使用。
寫在前面:
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
文/Chi Pan,The Tie Research今天,世界上有180種國家貨幣。每個國家都有不同的法定貨幣,每個經濟體都以本國貨幣進行經濟活動結算.
1900/1/1 0:00:00南京博物館聯合鯨探發布數字藏品:4月11日消息,南京博物館聯合鯨探,將于明天14:00發售“阿育王塔”“蕭何月下”數字藏品.
1900/1/1 0:00:00金色財經編輯部每晚為讀者精挑了當天最值得精讀的5篇文章,希望您每一天都能獲得新的知識財富。在這篇火幣研究院的文章中,從合并的意義、實施的技術原理、對行業的影響和可能的風險等方面給出系統全面的看法.
1900/1/1 0:00:00當我們部署和調用合約的時候,EVM 都在做些什么?如果你開發過以太坊智能合約,想必你應該熟悉這樣的操作 (此處以remix為例) :編寫solidity代碼 -> 編譯 -> 部署-> 交互.
1900/1/1 0:00:00去中心化金融(DeFi)是一種基于區塊鏈的金融形式,在沒有任何中心化的中介的情況下提供金融服務.
1900/1/1 0:00:00▌萬事達卡將幫助金融機構提供加密貨幣交易金色財經報道,萬事達卡啟動了一項幫助金融機構提供加密貨幣交易服務的計劃,通過充當 Paxos 與金融機構間的橋梁.
1900/1/1 0:00:00