这一讲,我们将介绍 solidity 中的控制流,然后讲如何用 solidity 实现插入排序(InsertionSort),一个看起来简单,但实际上很容易写出 bug 的程序。
我最近在重新学 solidity,巩固一下细节,也写一个「Solidity 极简入门」,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
所有代码和教程开源在 github: github.com/AmazingAng/WTFSolidity
Solidity 的控制流与其他语言类似,主要包含以下几种:
if-else
Solana Labs联合创始人:预计Saga手机将带来大量用户增长:7月18日消息,Solana Labs联合创始人Anatoly Yakovenko表示,新手机的推出可能会导致潜在用户数量激增。据此前报道,Anatoly Yakovenko宣布其团队正在开发一款新Android手机Saga,该设备专注于Web3,将包含一个Web3 DApp商店、集成的“Solana Pay”以促进基于二维码的链上支付、一个移动钱包适配器和一个“seed vault”(用于存储私钥)。其成本约1000美元,计划于2023年初开始交付。(Cryptoglobe)[2022/7/18 2:20:17]
for 循环
Solend提案通过,Solend Labs可临时接管巨鲸账户:6月19日消息,Solana生态借贷协议Solend发起的治理提案已获得通过,赞成票1,155,431(97.5%)。该提案支持对占借款总额20%以上的巨鲸制定特殊的保证金要求,如果用户的借款超过主池所有借款的20%,则需要35%的特殊清算门槛;授予Solend Labs紧急权力以暂时接管鲸鱼的账户,以便清算可以在场外交易中执行,避免将Solana推到极限,这将通过智能合约升级来完成。一旦鲸鱼的账户达到安全水平,紧急权力将被撤销。
此前消息,Solend创始人Rooter敦促某个巨鲸(3oSE开头地址)尽快偿还贷款,以避免清算风险。Solend已临时禁用其Main Pool的USDC、USDT和SOL借款。[2022/6/20 4:38:59]
while 循环
过去一小时推特讨论量:BTC仍排名第一 SOL升至第二:CoinTrendz数据显示,过去一小时推特讨论量排行中,BTC凭借162的讨论量排名第一,SOL以147的讨论量排名第二,ETH以86的讨论量排名第三。讨论量排名第四至十位的分别为:DOGE(71)、XTZ(66)、ADA(58)、LINK(38)、SHIB(30)、LUNA(24)、BNB(24)。[2021/7/17 0:58:58]
do-while 循环
Solana CEO:分片有助于网络去中心化 但不一定能扩展网络:公链Solana首席执行官Anatoly Yakovenko在社区AMA活动中表示,分片确实有助于网络去中心化,但不一定能扩展网络。通常人们认为网络随着其容量的增加而扩展,但是一笔转账的费用将受到单个分片中单笔交易费用的限制,因为该费用反映了分片对作恶行为的抵抗性。如果将费用降低到某个点并失去该抵抗性,则该分片可能会被作恶并达到其最大性能。因此,所有在这个分片上的应用将都需要经历迁移到另一个分片的冗长繁琐过程。同时存在着另一个挑战,即跨分片通信引入网络的复杂性。[2020/4/9]
三元运算符
三元运算符是 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
金色晚报 | 4月27日晚间重要动态一览:12:00-21:00关键词:央行、湖南省工信厅、比特大陆、灰度、ETH 1. 央行在上海等6市(区) 扩大金融科技创新监管试点。 2. 湖南省工信厅印发区块链产业发展三年行动计划.
1900/1/1 0:00:0010月8日消息,MY EG Services Berhad (MYEG) 和 Mimos Technology Solutions Sdn Bhd (MTSSB) 签署了一份谅解备忘录 (MOU).
1900/1/1 0:00:001.DeFi代币总市值:460.54亿美元 DeFi总市值 数据来源:coingecko2.过去24小时去中心化交易所的交易量49.13亿美元 过去24小时去中心化交易所的交易量 数据来源:coingecko3.
1900/1/1 0:00:00金色财经报道,8月18日,EthereumPoW官方推特发文表示, EthereumPoW未来会冻结超过 140 万个 ETH,因此敦促用户将 ETHW 从流动性池中移除.
1900/1/1 0:00:00作者:Mint Ventures除了逐渐临近的以太坊合并,美国财政部外国资产控制办公室 ( 简称 OFAC) 对搭建在以太坊上的隐私混币器 Tornado Cash 开展制裁是近期最大的行业热点.
1900/1/1 0:00:00Fabric Ventures近日宣布领投Web3电子邮件解决方案EtherMail300万美元种子轮融资.
1900/1/1 0:00:00