这一讲,我们将介绍 solidity 中的控制流,然后讲如何用 solidity 实现插入排序(InsertionSort),一个看起来简单,但实际上很容易写出 bug 的程序。
我最近在重新学 solidity,巩固一下细节,也写一个「Solidity 极简入门」,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
所有代码和教程开源在 github: github.com/AmazingAng/WTFSolidity
Solidity 的控制流与其他语言类似,主要包含以下几种:
if-else
Hetzner阻止服务器访问导致上千个Solana验证器处于离线状态:11月3日消息,Rockaway X数据显示,由于云服务提供商Hetzner已阻止其服务器上的所有Solana网络活动,目前有超过1000个Solana验证器处于离线状态,Solana网络的拖欠质押比率为22%,为5月以来的最高水平。尽管如此,Solana网络似乎没有受到影响。截至报告时,Solana状态页面未显示任何中断。
受Hetzner此举影响的委托人和验证者将被迫寻找合适的替代方案来恢复获得质押奖励,Solana Labs联合创始人Anatoly Yakovenko呼吁网络参与者将他们的质押转移到其他地方。
此前8月份消息,Hetzner表示禁止将其产品用于挖矿相关应用,运行任何加密节点都将违反服务条款。(The Block)[2022/11/3 12:11:38]
for 循环
Solidly在Immunefi平台发布漏洞赏金计划:Andre Cronje新项目Solidly(原ve(3,3))在Web3漏洞赏金平台Immunefi上发布漏洞赏金计划,本次计划将专注于Solidly的智能合约,旨在预防冻结或盗窃导致用户资金损失、治理资金损失、治理投票操纵、无人认领的收益盗窃、冻结无人认领的收益、临时冻结资金、智能合约gas费流失、没有资金转移的区块填充受阻、智能合约未能提供承诺的回报,但没有失去价值。该计划将根据漏洞等级支付赏金,最低奖励50,000美元,最高奖励200,000美元。[2022/2/5 9:32:49]
while 循环
Solana生态杠杆收益聚合协议Francium推出跨链资产池:11月14日消息,Solana生态杠杆收益聚合协议Francium推出跨链资产池,将整合跨链资产使得用户可通过杠杆挖矿获益。此外,Francium的借贷板块也会整合相应的跨链资产。
据Francium网站显示,目前其支持的跨链资产包括whETH、weSUSHI、weUNI、mSOL。Francium表示,此次推出跨链资产池是响应了此前Raydium和Serum联合推出的3000万美元跨链资产挖矿激励计划。[2021/11/14 6:51:06]
do-while 循环
The Graph托管服务正在集成Solana:11月10日消息,The Graph表示,其托管服务正在集成Solana,集成将使用Firehose,从而实现更快的索引。The Graph将使开发人员更容易:查询Solana区块链、访问历史数据、可视化数据分析等。此外,The Graph将开始同步Solana子图并开始支持Solana区块链上的数据需求。[2021/11/10 6:43:39]
三元运算符
三元运算符是 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
7月11日消息,据国外媒体报道,巴拉圭国会议员卡里托斯 · 雷贾拉和参议员费尔南多 · 席尔瓦 · 法塞蒂计划于7月14日向国会提交一项比特币法案,包括使比特币成为法定货币.
1900/1/1 0:00:00文章来源:火币科技 ChatGPT承认在马斯克的推文与狗狗币之间的联系在2021年9月是可靠的:金色财经报道,ChatGPT回复如何看待狗狗币与备受争议的埃隆马斯克的关系.
1900/1/1 0:00:00原文出版于 2018 年 11 月。三年过去,如果作者此时再撰写一篇这样的文章,无疑会增补不少内容,也会减少对某些话题的描述。但回顾这篇文章仍然是有意义的.
1900/1/1 0:00:00音乐正在渗透生活娱乐、社交和消费的方方面面。我们也看到一些行业层面的新趋势:“听觉工业”正逐渐向 “区块链工业”转变,音乐的各种想象力正在发挥着,也让音乐到消费的链路更加通顺.
1900/1/1 0:00:00作为从信息互联网转向价值互联网的关键性技术,区块链与数字资产的结合,是区块链迄今为止最为令人瞩目的社会实验。要言之,区块链给数字资产的创设、发行、保管、交易、使用等提供了新的范式.
1900/1/1 0:00:00众所周知,美国财政部近日制裁了Tornado Cash及其相关地址,Aave等一些DeFi项目也阻止相关地址访问.
1900/1/1 0:00:00