比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > 區塊鏈 > Info

Solidity極簡入門第十講:控制流、用solidity實現插入排序_SOL

Author:

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

這一講,我們將介紹 solidity 中的控制流,然后講如何用 solidity 實現插入排序(InsertionSort),一個看起來簡單,但實際上很容易寫出 bug 的程序。

我最近在重新學 solidity,鞏固一下細節,也寫一個「Solidity 極簡入門」,供小白們使用(編程大佬可以另找教程),每周更新 1-3 講。

所有代碼和教程開源在 github: github.com/AmazingAng/WTFSolidity

Solidity 的控制流與其他語言類似,主要包含以下幾種:

if-else

a16z過去24小時向SolidLizard和Solidly V2兩個協議注入資金:金色財經報道,據鏈上分析師@0xsurferboy在社交媒體上發布的數據顯示,a16z在過去24小時內一直在向SolidLizard和Solidly V2兩個協議注入資金。1天前,a16z的投資組合中SolidLizard的鎖定資金為200萬美元,Solidly為0美元,就在約14小時前,a16z買入并在WETH-USDC池中又增加了150萬美元,APR為58%-145%,695枚SLIZ被鎖定,APR約為130%。而在大約4小時前,a16z又向USDC-USDT Solidly V2池中增加了520萬美元,這一系列操作迅速將SolidLizard鎖倉量推升到6030萬美元并躋身Arbitrum鏈上鎖倉量排名前十,而一周前SolidLizard鎖倉量僅為1200萬美元,目前增幅達到400%。[2023/2/20 12:18:00]

for 循環

Solana生態DEX Serum或將被分叉:金色財經報道,Solana開發人員分叉Serum,因為它可能在FTX的黑客攻擊中受到損害。Solana創始人Anatoly Yakovenko指出,開發人員今天急于分叉Serum的代碼,并在沒有FTX參與的情況下恢復協議。開發人員需要另一個版本的Serum,因為原始版本只能通過由FTX而非Serum DAO控制的私鑰來更新。(The Block)[2022/11/13 12:59:17]

while 循環

Solana生態NFT市場Magic Eden交易總額達15億美元:7月3日消息,據 Dappradar 數據顯示,Solana 生態 NFT 市場 Magic Eden 交易總額已達 15 億美元,交易者數量達到 807,036 個。數據顯示,Magic Eden 交易總額于今年 5 月 17 日突破 10 億美元,這意味著在不到兩個月時間內交易額增加了 50%。[2022/7/3 1:47:25]

do-while 循環

三元運算符

三元運算符是 solidity 中唯一一個接受三個操作數的運算符,規則條件? 條件為真的表達式:條件為假的表達式。此運算符經常用作 if 語句的快捷方式。

多鏈DeFi平臺Rubic集成Raydium,允許用戶在Solana網絡完成鏈上交換:官方消息,多鏈DeFi平臺Rubic集成Raydium,允許用戶在Solana網絡完成鏈上交換。此外,Rubic還完成了Phantom和Solflare錢包與Rubic生態系統的集成。[2021/12/18 7:47:02]

另外還有 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

Tags:SOLSOLIDLIDDITsolo幣能提現嗎SolidblockValidityLBRY Credits

區塊鏈
OPResearch:一文縱覽DeSci生態現狀與未來發展_SCI

本文來自來自OP Research 撰文:Sihan, CloudY 審核:Crystal  摘要:在我們上一篇介紹 DeSci 的文章中.

1900/1/1 0:00:00
英偉達Omniverse:產業元宇宙殺手锏的應用場景_OMNI

作者:Chenglin Pua(馬來西亞)元宇宙在近兩年得到極大關注,許多公司也都想成為第一個吃螃蟹的人,Meta是其中最激進的一個.

1900/1/1 0:00:00
5 年的“十大加密貨幣”實驗和經驗教訓_GRE

當 Redditor Joe Greene 在 2018 年開始 Top 10 Cryptos 實驗時,他購買了 1,000 美元的 Dash、NEM 和 Iota 等.

1900/1/1 0:00:00
NFT的核心價值到底是什么?好戲還在后頭_NFT

Ari Juels是紐約康奈爾大學的教授,也是IC3的聯合董事。另外,他還是Chainlink Labs的首席科學家.

1900/1/1 0:00:00
Web3第一大黑客事件 攻擊涉及總金額超8.5億美元 BNB Chain遭受攻擊分析_WEB

北京時間2022年10月7日,據成都鏈安鷹眼-區塊鏈安全態勢感知平臺輿情監測顯示,BNB Chain跨鏈橋“代幣中心”(Token Hub)遭遇黑客攻擊,由于涉及的金額較為龐大.

1900/1/1 0:00:00
金色Web3.0日報 | 在zkSync上部署Uniswap V3的提案獲得通過_區塊鏈

DeFi數據 1、DeFi代幣總市值:441.39億美元 DeFi總市值及前十代幣 數據來源:coingecko2、過去24小時去中心化交易所的交易量30.

1900/1/1 0:00:00
ads