尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
WTF Solidity 超シンプル入門: Solidity の制御フローと挿入ソート(InsertionSort)実装の落とし穴
WTF Solidity 超シンプル入門: Solidity の制御フローと挿入ソートInsertionSort実装の落とし穴【免费下载链接】WTF-SolidityWTF Solidity 极简入门教程供小白们使用。Now supports English! 官网: https://wtf.academy项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-SoliditySolidity の制御フローif-else・for・while・do-while・三項演算子を体系的に学び、その知識を活かして「挿入ソート」を Solidity で実装します。本記事は WTF-Solidity の第 10 講日本語版をベースに、リポジトリ内の実源码10_InsertionSort/InsertionSort.solと突き合わせながら、uintの underflow が引き起こすバグの原因と正しい回避策を解説します。読了後は、Solidity 特有の型制約符号なし整数を意識した安全なループ実装ができるようになります。Solidity の制御フローSolidity の制御フローは他のプログラミング言語JavaScript・Python などとほぼ同様で、以下の構成要素を持ちます。1.if-else条件分岐の基本形です。_number 0のときtrueを、それ以外のときfalseを返します。function ifElseTest(uint256 _number) public pure returns(bool){ if(_number 0){ return(true); }else{ return(false); } }2.forループ初期化式・条件式・更新式を 1 行にまとめた繰り返し処理です。下記は0 1 ... 9を計算して45を返します。function forLoopTest() public pure returns(uint256){ uint sum 0; for(uint i 0; i 10; i){ sum i; } return(sum); }3.whileループ条件がtrueの間、処理を繰り返します。forと同じ計算結果45を返します。function whileTest() public pure returns(uint256){ uint sum 0; uint i 0; while(i 10){ sum i; i; } return(sum); }4.do-whileループwhileと異なり、条件を後置するため、条件の真偽にかかわらず少なくとも 1 回は処理を実行します。function doWhileTest() public pure returns(uint256){ uint sum 0; uint i 0; do{ sum i; i; }while(i 10); return(sum); }5. 三項演算子条件演算子三項演算子は Solidity で唯一 3 つのオペランドを受け取る演算子です。構文は条件 ? 条件が true のときの式 : 条件が false のときの式で、if-else文のショートカットとして頻繁に使われます。// 三項演算子 ternary/conditional operator function ternaryTest(uint256 x, uint256 y) public pure returns(uint256){ // x と y の最大値を返す return x y ? x : y; }この 5 つの関数はすべてリポジトリ内の 10_InsertionSort/InsertionSort.solおよび Languages/ja/10_InsertionSort_ja/InsertionSort.solにそのまま実装されています。pure指定のため、状態変数を読まず計算のみを行う関数である点も確認できます。補足:continueとbreak上記に加えて、continue現在の反復をスキップして直ちに次のループへ進むとbreak現在のループから抜け出すキーワードが利用可能です。Solidity で挿入ソートInsertionSortを実装する先に注意: 90% 以上の人が Solidity で挿入ソートを初回実装すると間違える、と言われています。本章ではその「間違い」と「正解」の両方を追体験します。挿入ソートとはソートアルゴリズムは、順不同の数値列例:[2, 5, 3, 1]を小さい順[1, 2, 3, 5]に並べ替える問題を解きます。挿入ソートInsertionSortは最もシンプルで、コンピュータサイエンスの授業で多くの開発者が最初に学ぶアルゴリズムです。そのロジックは次の 1 点に集約されます。配列xの先頭から末尾に向かって、要素x[i]をその直前の要素x[i-1]と比較する。x[i]が小さければ位置を入れ替え、さらにx[i-2]と比較し、この過程を続ける。つまり「カードを手札に挿入していく」感覚で、左側に常にソート済みの部分配列を構築していきます。Python での実装基準となるアルゴリズムまず教科書的な Python 実装を見てみましょう。keyを基準値として、前方の要素を順にずらしながら挿入位置を探します。# Insertion Sort を実装する Python プログラム def insertionSort(arr): for i in range(1, len(arr)): key arr[i] j i-1 while j 0 and key arr[j] : arr[j1] arr[j] j - 1 arr[j1] key return arrこの実装の要点は、jが-1になる可能性があることですループ内でj - 1が実行されるため。Python の整数は符号付きなので問題ありませんが、これが Solidity に移植した際に致命傷となります。Solidity への移植バグ入りバージョンPython 版約 9 行の関数・変数・ループを Solidity 構文に置き換えると、こちらも約 9 行で書けます。// 挿入ソート間違いバージョン function insertionSortWrong(uint[] memory a) public pure returns(uint[] memory) { for (uint i 1;i a.length;i){ uint temp a[i]; uint ji-1; while( (j 0) (temp a[j])){ a[j1] a[j]; j--; } a[j1] temp; } return(a); }一見正しそうに見えます。しかし、このコードをコンパイルして[2, 5, 3, 1]をソートしようとすると、実行時にエラーrevertが発生します。Remix の decoded output にはエラー内容が表示されます。バグの正体:uintの underflow問題を特定するのに数時間を要し、最終的に判明した原因は次のとおりです。Solidity で最もよく使われる整数型uint正確にはuint256は符号なし整数であり、負の値を表現できません。上記コードでは変数jがj--によって-1になろうとします。Solidity 0.8.x 以降はデフォルトで算術オーバーフロー/アンダーフロー検査が有効化されており、uintが負方向に桁あふれunderflowするとトランザクション全体が revert します。実際にリポジトリの源码 10_InsertionSort/InsertionSort.sol には誤バージョンがそのまま残されており、ソースコード中でもuint ji-1;とj--の組み合わせが問題を生むことが確認できます。プロジェクト全体のコンパイラは foundry.toml のsolc 0.8.34で固定されており、このバージョンではデフォルトの算術検査により underflow が確実に revert として顕在化します。正しい Solidity 実装バグ修正版修正方針はシンプルです:jが決して負の値を取らないように、jに 1 を加えて基準をずらす。つまりjを「挿入位置の右隣のインデックス」として扱います。// 挿入ソート正確なバージョン function insertionSort(uint[] memory a) public pure returns(uint[] memory) { // 注意: uint 型は負の値を取れない for (uint i 1;i a.length;i){ uint temp a[i]; uint ji; while( (j 1) (temp a[j-1])){ a[j] a[j-1]; j--; } a[j] temp; } return(a); }修正点の比較:項目誤バージョン正バージョン初期値uint j i - 1;i1のときj0、その後-1に陥るuint j i;常に非負ループ条件j 0常に真になり得るj 1jが 0 になった時点で終了比較対象temp a[j]temp a[j-1]ずらし処理a[j1] a[j]a[j] a[j-1]挿入位置a[j1] tempa[j] tempjの取りうる範囲が1..a.length-1に限定されるため、a[j-1]の添え字も常に0以上となり、underflow も範囲外アクセスも発生しません。[2, 5, 3, 1]を入力すると[1, 2, 3, 5]が正しく返ります。リポジトリ内での活用例この第 10 講のソート関数は、以降の講義でも再利用されています。例えばインターフェースの講義14_Interface/Interface.solでは、挿入ソートを外部関数として抽象化した宣言function insertionSort(uint[] memory a) public pure virtual returns(uint[] memory);が定義されており、インターフェースを介してソートロジックを呼び出す実例として登場します。第 10 講の実装をマスターすることで、このような抽象化・再利用パターンも自然に理解できるようになります。なお、10_InsertionSort/readme.md中文版や Languages/en/10_InsertionSort_en/readme.md英語版にも同じ内容のチュートリアルがあり、多言語で比較学習が可能です。源码は 10_InsertionSort/InsertionSort.sol にInsertionSortコントラクトとして一式制御フロー 5 関数 誤・正 2 バージョンのソートがまとまっているため、Remix に貼り付けるか Foundry 環境forge buildでそのままコンパイル・実行して確認できます。まとめ本講では、Solidity の制御フローif-else/for/while/do-while/ 三項演算子、およびcontinue・breakを紹介し、それを用いて「一見簡単だが実はバグが発生しやすい」挿入ソートを実装しました。最大の学びは、Python など符号付き整数を扱う言語のアルゴリズムを Solidity に移植する際、uintの underflow という Solidity 特有の罠に注意しなければならないという点です。Solidity はシンプルに見えますが、型システムや算術検査の仕様に起因する罠が多く存在します。毎月、スマートコントラクトの小さなバグが原因でプロジェクトがハッキングされ、数百万ドル規模の損失が発生しています。安全なコントラクトを書くためには、基礎を確実にマスターし、継続的に練習を重ねることが不可欠です。【免费下载链接】WTF-SolidityWTF Solidity 极简入门教程供小白们使用。Now supports English! 官网: https://wtf.academy项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-Solidity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

TREK WebSocket协议设计:消息类型、心跳保活与断线重连策略全解析

TREK WebSocket协议设计:消息类型、心跳保活与断线重连策略全解析

TREK WebSocket协议设计:消息类型、心跳保活与断线重连策略全解析 【免费下载链接】TREK A self-hosted travel/trip planner with real-time collaboration, interactive maps, PWA support, SSO, budgets, packing lists, and more. 项目地址: https://gitcode.…

📅 2026/9/15 18:55:37
Kerberos攻防全集:Kerberoasting、Golden Ticket、DCSync——Anthropic-Cybersecurity-Skills详解

Kerberos攻防全集:Kerberoasting、Golden Ticket、DCSync——Anthropic-Cybersecurity-Skills详解

Kerberos攻防全集:Kerberoasting、Golden Ticket、DCSync——Anthropic-Cybersecurity-Skills详解 【免费下载链接】Anthropic-Cybersecurity-Skills 817 structured cybersecurity skills for AI agents Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0,…

📅 2026/9/15 18:55:37
Dozzle 匿名统计机制全解:Beacon 字段、数据流向与隐私关闭方案

Dozzle 匿名统计机制全解:Beacon 字段、数据流向与隐私关闭方案

Dozzle 匿名统计机制全解:Beacon 字段、数据流向与隐私关闭方案 【免费下载链接】dozzle Realtime log viewer for containers. Supports Docker, Swarm and K8s. 项目地址: https://gitcode.com/GitHub_Trending/do/dozzle Dozzle 作为一款面向容器的实时日…

📅 2026/9/15 18:50:37
MORE NEWS

更多资讯

📰

SpringBoot高校班级管理系统开发实践与优化

1. 项目背景与核心需求河北水利电力学院班级事务管理系统是一个基于SpringBoot框架开发的高校班级综合管理平台。这类系统在高校信息化建设中具有典型意义——随着高校管理精细化程度提升,传统纸质或Excel表格管理方式已无法满足班级事务、学生服务、教学协同等需求…

📰

遥感图像融合原理与MATLAB实现:从IHS到精度评定指标

简介:面向遥感图像处理与精度评估需求,这份MATLAB实现方案集成了多源遥感图像融合与质量评价的完整流程,适合从事遥感技术、图像处理的研究人员与技术开发人员,也适合对该方向有研究兴趣的初学者进阶参考。资源包共4个文件&#x…

📰

SSL证书从部署到续期:HTTPS安全运维全流程避坑指南

周一早上,技术群的震哥发来一张截图:公司官网在浏览器里挂上了一把红色的锁,点开提示“此网站的安全证书已过期”。客服那边已经炸了,用户不敢下单,销售在群里连环催。那天上午所有人都在和SSL证书搏斗——导出旧的CSR…

📰

WTF-Solidity 第38讲:用智能合约搭建零手续费的去中心化 NFT 交易所 NFTSwap

WTF-Solidity 第38讲:用智能合约搭建零手续费的去中心化 NFT 交易所 NFTSwap 【免费下载链接】WTF-Solidity WTF Solidity 极简入门教程,供小白们使用。Now supports English! 官网: https://wtf.academy 项目地址: https://gitcode.com/GitHub_Trendi…

📰

WTF Solidity 工具篇:使用 Halmos Cheatcodes 在 Foundry 中编写符号执行测试

WTF Solidity 工具篇:使用 Halmos Cheatcodes 在 Foundry 中编写符号执行测试 【免费下载链接】WTF-Solidity WTF Solidity 极简入门教程,供小白们使用。Now supports English! 官网: https://wtf.academy 项目地址: https://gitcode.com/GitHub_Trend…

📰

大模型定制化技术:RAG、Agent与微调实战解析

1. 大模型定制化技术全景图在大模型技术爆发的当下,如何让通用大模型适配特定业务场景已成为行业焦点。经过半年多的实战验证,我总结出六种最具实用价值的大模型定制策略:RAG(检索增强生成)、Agent(智能体&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬