ゼロから初めてのイーサリアムスマートコントラクトへ:好奇心旺盛なビルダーのためのやさしい道のり
「スマートコントラクト」という言葉を聞いて、ロボット弁護士が契約条項を書いている場面を想像したことがあるなら、良い知らせがあります——実際はもっとシンプルで(そしてもっと楽しい)ものです。スマートコントラクトとは何かと頭を悩ませるところから、実際にイーサリアムにデプロイし、さらにはSolidityチュートリアル(初心者向け)のリソースや、時には命綱となるWeb3サポートサービスに立ち寄るまでの旅を、一緒に歩いていきましょう。宇宙レベルの数学の学位は必要ありません、約束します。
私自身、理解が腑に落ちた瞬間を今でも覚えています。友人が「スマートコントラクトとは、ブロックチェーン上に存在し、条件が満たされると自動的に実行されるちっちゃなプログラムだよ」と言ったんです。だから、自動販売機を使ったことがある人なら——お金を入れて、ボタンを押して、商品を受け取る——もうコアなアイデアは理解できています。大きな違いは、ワイヤーやモーターの代わりに、何千ものコンピューター上にコードが置かれていて、誰も不正できないようになっていることです。それがブロックチェーン開発の基本の本質です。透明で不変なコードに取引を任せることで、信頼を方程式から取り除くわけです。
さて、ブロックチェーンプログラミングを学びたいと思っているなら、一夜で暗号技術の専門家になる必要はありません。最良の出発点はSolidity、つまりイーサリアムスマートコントラクトに使われる言語です。良いSolidity初心者向けチュートリアルでは、SolidityがJavaScriptにとても似ていることを教えてくれます。そのおかげで驚くほど取っつきやすいのです。私が初めて飛び込んだとき、無料のインタラクティブコース(CryptoZombies、もし興味があれば)をやりましたが、勉強というよりゲームをしている感じでした。数時間以内に関数を書き、アドレスを残高にマッピングし、イベントを発行できるようになりました——その概念は数日前までは古代のルーンのように聞こえていたのにです。
では、実際に役立つスマートコントラクトコードの書き方は?具体的にしましょう。「1ヶ月後に自分だけが引き出せるシンプルな貯金箱」を作りたいとします。Solidityでは、アドレスのowner、uintのdeadline、そしてrequire(msg.sender == owner && block.timestamp >= deadline)をチェックする関数を定義します。これが、あなたが調整して拡張できるイーサリアムスマートコントラクトの例の一つです。ここに骨組みを貼っておくので、頭で噛みしめてみてください。
pragma solidity ^0.8.0;
contract TimeLockedWallet {
address public owner;
uint public unlockTime;
event Withdrawn(address to, uint amount);
constructor(uint _unlockTime) payable {
owner = msg.sender;
unlockTime = block.timestamp + _unlockTime;
}
function withdraw() public {
require(msg.sender == owner, "Not owner");
require(block.timestamp >= unlockTime, "Too early");
emit Withdrawn(msg.sender, address(this).balance);
payable(owner).transfer(address(this).balance);
}
}
ほらね?魔法じゃない。ただのロジックです。payableやtransferの部分はSolidity初心者向けチュートリアルの題材です——やっていくうちに覚えます。本当に感動するのは、スマートコントラクトをGoerliのようなテストネットにデプロイして、ウォレットで操作したときです。突然、自分が書いたスニペットが本物のテスト用ETHを保持し始め、すべてがずっと具体的に感じられます。
最近ではデプロイも驚くほど簡単です。私はブラウザベースのIDEであるRemixを使ってコントラクトをコンパイルし、そのままブロックチェーンにプッシュしています。数回のクリックとMetaMaskの確認で、あっという間に初めての止められないコードを出荷できます。その時点で、普通の人間が使えるようにフロントエンドも作りたくなるでしょう。そこがdapp開発ガイドの出番です。ethers.jsやweb3.jsを使ってウェブサイトをコントラクトに接続し、ボタンクリックから関数を呼び出す方法を学びます。自分のスマートコントラクトが実際のインターフェースで動き出すのを見るのは病みつきになります。
もちろん、楽しい部分には鋭い刃もあります。コントラクトがイーサリアム上にあると、それは永続的で公開されます——そして攻撃者は新人のミスを好みます。すべての開発者が早い段階で内面化すべきスマートコントラクトセキュリティのヒントを飛ばすわけにはいきません。残高を更新する前に誰かがあなたの引き出し関数を複数回呼び出すリエントランシー攻撃は、元祖DAOを破壊し、資金を送る前に常に状態を更新することを世界に教えました。整数オーバーフローはSolidity 0.8が組み込みチェックをもたらすまでは悪夢でした。また、コントラクトがブロックチェーンの乱数に依存しているなら、やめてください——ブロックタイムスタンプやハッシュは操作可能です。ちょっとした思考実験:transferを書くたびに、「もし誰かがこれをループで50回呼び出したら?」と自問してください。その警戒心があなたを救います。
さて、時々そのスタックに圧倒されることもあります。トランザクションがリバートして理由がわからないときや、dApp用のカスタムインフラ設定が必要なとき、そんなときにWeb3サポートサービスが命綱になります。これらは大企業向けだけではなく、多くの小規模チームがコードのデバッグ、ガス最適化、公開前の監査などを支援する単発の相談を提供しています。まるで何度もこのルートを飛んだことのある副操縦士がいるようなものです。私自身も、NFTミント機能をReactフロントエンドと統合する必要があり、ABIの不一致を自分でデバッグする余裕がなかったときに、そうしたサービスに頼りました。
真実は、ゼロからスマートコントラクトを出荷するまでの道のりはかつてないほど短くなっています。ブロックチェーンプログラミングを真剣に学びたいなら、今日からいじり始めてください。OpenZeppelinのWizardからイーサリアムスマートコントラクトの例をいくつかクローンして、壊して、直して、Discordコミュニティでバカな質問をしてください。すべてのプロはかつて、資金を永久にロックするコントラクトを誤って書いたことがあります——それが魅力の一部です。そして、行き詰まったと感じたら、あなたを前に進めるために待機しているWeb3サポートサービスやdapp開発ガイドのチュートリアルがたくさんあることを思い出してください。ブロックチェーンは新たなキャンバスであり、あなたのスマートコントラクトはシンプルなウォレットから分散型ゲームまで何にでもなれます。さあ、Remixを起動して、Solidity初心者向けチュートリアルを開き、私たち両方よりも長生きする一行のコードを書いてください。あなたならできます。











