はじめに
イーサリアムを勉強し始めたら、「スマートコントラクト」という壁にぶち当たります。
スマートコントラクトとは?
スマートコントラクトは、ある条件が満たされたときに自動的に実行されるコンピュータコードに契約をデジタル化したものです。ブロックチェーンに記録されるため、契約内容の改ざんが困難で、取引記録の透明性が高く、仲介者が不要なためコストの削減が可能です。これらの特性により、信頼性とセキュリティが高く、効率的な契約や取引が実現されます。スマートコントラクトは、イーサリアムのようなブロックチェーンネットワークで広く使用されています。イーサリアムはスマートコントラクト機能を持つ代表的なブロックチェーンプラットフォームで、金銭取引だけでなく、契約の自動実行など多様な用途に利用されています。例えば、イーサリアム上で動作する分散型金融アプリケーションや自律分散型組織(DAO)などが、スマートコントラクトの実用的な応用例として挙げられます。
実行環境
- Macbook (Mac OS)
- homebrewがすでにインストールされていること
- cpp-ethereum を使用
solidityとは?
Solidityとはプログラミング言語の名前で、Ethereumのブロックチェーン上で動作するプログラム(コントラクト)を記述することができるプログラミング言語です。
SolidityはC++、Python、JavaScriptを参考に、Ethereum Virtual Machine(EVM)の操作を目的に作られています。Solidityは静的言語で継承やライブラリ、ユーザーが定義した複雑な型をサポートします。
Solidityで投票やクラウドファンディング、匿名のオークションやマルチシグウォレットなどを作成することができます。
コントラクトをデプロイする際には最新バージョンのSolidityを使うことが推奨されています。
開発環境の構築
macbookの場合、brewコマンドで基本的にはインストールなどが行えます。
$ brew update
$ brew upgrade
$ brew tap ethereum/ethereum
$ brew install solidity
brew tapとは公式以外のリポジトリをフォーミュラとしてHomebrewに追加するもので、brewのもとでinstall,uninstall,updateなどが行えます。もちろん自分が公開しているものも簡単に追加できます。
solcがインストールされたのかを確認する
$ solc --version
// 出力結果↓
solc, the solidity compiler commandline interface
Version: 0.8.23+commit.f704f362.Darwin.appleclang
環境変数PATHに設定されているディレクトリを順番に調べて、最初に見つかった実行ファイルを表示するコマンドwhichをでpathを調べます。
$ which solc
/usr/local/bin/solc
コントラクト・コードのコンパイル
"Hello Wolrd"を出力するためのコードを書いてみましょう。
そもそもですが、solidityの拡張子は "xx.sol" になります。
$ touch hello.sol
基本的なコントラクトを定義する構文は以下のようになります。
contract Contract名 {
//スマート・コントラクトで行う処理をここに記述
}
これを基にして、hello.sol
でhello worldを表示するコントラクト・コードを書いてみました。
contract HelloWorld {
string public greet = "Hello World!";
}
これをhello.sol
を実行してみます。
$ solc --abi --bin hello.sol
出力結果 ↓
======= hello.sol:HelloWorld =======
Binary:
60806040526040518060400160405280600c81526020017f48656c6c6f20576f726c642100000000000000000000000000000000000000008152505f90816100479190610293565b50348015610053575f80fd5b50610362565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806100d457607f821691505b6020821081036100e7576100e6610090565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026101497fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261010e565b610153868361010e565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61019761019261018d8461016b565b610174565b61016b565b9050919050565b5f819050919050565b6101b08361017d565b6101c46101bc8261019e565b84845461011a565b825550505050565b5f90565b6101d86101cc565b6101e38184846101a7565b505050565b5b81811015610206576101fb5f826101d0565b6001810190506101e9565b5050565b601f82111561024b5761021c816100ed565b610225846100ff565b81016020851015610234578190505b610248610240856100ff565b8301826101e8565b50505b505050565b5f82821c905092915050565b5f61026b5f1984600802610250565b1980831691505092915050565b5f610283838361025c565b9150826002028217905092915050565b61029c82610059565b67ffffffffffffffff8111156102b5576102b4610063565b5b6102bf82546100bd565b6102ca82828561020a565b5f60209050601f8311600181146102fb575f84156102e9578287015190505b6102f38582610278565b86555061035a565b601f198416610309866100ed565b5f5b828110156103305784890151825560018201915060208501945060208101905061030b565b8683101561034d5784890151610349601f89168261025c565b8355505b6001600288020188555050505b505050505050565b6102138061036f5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063cfae32171461002d575b5f80fd5b61003561004b565b6040516100429190610160565b60405180910390f35b5f8054610057906101ad565b80601f0160208091040260200160405190810160405280929190818152602001828054610083906101ad565b80156100ce5780601f106100a5576101008083540402835291602001916100ce565b820191905f5260205f20905b8154815290600101906020018083116100b157829003601f168201915b505050505081565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561010d5780820151818401526020810190506100f2565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610132826100d6565b61013c81856100e0565b935061014c8185602086016100f0565b61015581610118565b840191505092915050565b5f6020820190508181035f8301526101788184610128565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806101c457607f821691505b6020821081036101d7576101d6610180565b5b5091905056fea264697066735822122013a9f52bf096edea0c506bad2c5d62064bd9490a874378c56b46cd68cac6a18264736f6c63430008170033
Contract JSON ABI
[{"inputs":[],"name":"greet","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
こんなふうなよくわからん文字列が出てきます。
とりあえず、バイナリが吐けたので、今回はここまで。