[Solidity] スマートコントラクトを作成し実行する

# はじめに
イーサリアムを勉強し始めたら、「スマートコントラクト」という壁にぶち当たります。

### スマートコントラクトとは？


スマートコントラクトは、ある条件が満たされたときに自動的に実行されるコンピュータコードに契約をデジタル化したものです。ブロックチェーンに記録されるため、契約内容の改ざんが困難で、取引記録の透明性が高く、仲介者が不要なためコストの削減が可能です。これらの特性により、信頼性とセキュリティが高く、効率的な契約や取引が実現されます。スマートコントラクトは、イーサリアムのようなブロックチェーンネットワークで広く使用されています。イーサリアムはスマートコントラクト機能を持つ代表的なブロックチェーンプラットフォームで、金銭取引だけでなく、契約の自動実行など多様な用途に利用されています。例えば、イーサリアム上で動作する分散型金融アプリケーションや自律分散型組織（DAO）などが、スマートコントラクトの実用的な応用例として挙げられます。


# 実行環境
- Macbook (Mac OS)
    - homebrewがすでにインストールされていること
- [cpp-ethereum](https://ethereum-japan.net/wiki/cpp-ethereum/) を使用


# solidityとは？

https://qiita.com/nekoharuyuki/items/b00754ee638ec3418668

> Solidityとはプログラミング言語の名前で、Ethereumのブロックチェーン上で動作するプログラム（コントラクト）を記述することができるプログラミング言語です。<br>
SolidityはC++、Python、JavaScriptを参考に、Ethereum Virtual Machine（EVM）の操作を目的に作られています。Solidityは静的言語で継承やライブラリ、ユーザーが定義した複雑な型をサポートします。
Solidityで投票やクラウドファンディング、匿名のオークションやマルチシグウォレットなどを作成することができます。<br>
コントラクトをデプロイする際には最新バージョンのSolidityを使うことが推奨されています。


# 開発環境の構築

macbookの場合、brewコマンドで基本的にはインストールなどが行えます。

```terminal
$ brew update
$ brew upgrade
$ brew tap ethereum/ethereum
$ brew install solidity
```

> brew tapとは公式以外のリポジトリをフォーミュラとしてHomebrewに追加するもので、brewのもとでinstall,uninstall,updateなどが行えます。もちろん自分が公開しているものも簡単に追加できます。

[brew tapとは - Qiita](https://qiita.com/sammrai/items/85ed5e914d424fbf9fd6) より

solcがインストールされたのかを確認する

```terminal
$ solc --version

// 出力結果↓
solc, the solidity compiler commandline interface
Version: 0.8.23+commit.f704f362.Darwin.appleclang
``` 

環境変数PATHに設定されているディレクトリを順番に調べて、最初に見つかった実行ファイルを表示するコマンドwhichをでpathを調べます。

```terminal
$ which solc
/usr/local/bin/solc
```

## コントラクト・コードのコンパイル
"Hello Wolrd"を出力するためのコードを書いてみましょう。
そもそもですが、solidityの拡張子は **"xx.sol"** になります。

```termianl: terminal（hello.solを作成）
$ touch hello.sol
```

基本的なコントラクトを定義する構文は以下のようになります。

```contract.sol
contract Contract名 {
   //スマート・コントラクトで行う処理をここに記述
}
```
これを基にして、`hello.sol`でhello worldを表示するコントラクト・コードを書いてみました。

```hello.sol
contract HelloWorld {
    string public greet = "Hello World!";
}
```

これを`hello.sol`を実行してみます。

```terminal: terminal（コンパイル実行）
$ solc --abi --bin hello.sol
```


出力結果 ↓

```terminal
======= hello.sol:HelloWorld =======
Binary:
60806040526040518060400160405280600c81526020017f48656c6c6f20576f726c642100000000000000000000000000000000000000008152505f90816100479190610293565b50348015610053575f80fd5b50610362565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806100d457607f821691505b6020821081036100e7576100e6610090565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026101497fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261010e565b610153868361010e565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61019761019261018d8461016b565b610174565b61016b565b9050919050565b5f819050919050565b6101b08361017d565b6101c46101bc8261019e565b84845461011a565b825550505050565b5f90565b6101d86101cc565b6101e38184846101a7565b505050565b5b81811015610206576101fb5f826101d0565b6001810190506101e9565b5050565b601f82111561024b5761021c816100ed565b610225846100ff565b81016020851015610234578190505b610248610240856100ff565b8301826101e8565b50505b505050565b5f82821c905092915050565b5f61026b5f1984600802610250565b1980831691505092915050565b5f610283838361025c565b9150826002028217905092915050565b61029c82610059565b67ffffffffffffffff8111156102b5576102b4610063565b5b6102bf82546100bd565b6102ca82828561020a565b5f60209050601f8311600181146102fb575f84156102e9578287015190505b6102f38582610278565b86555061035a565b601f198416610309866100ed565b5f5b828110156103305784890151825560018201915060208501945060208101905061030b565b8683101561034d5784890151610349601f89168261025c565b8355505b6001600288020188555050505b505050505050565b6102138061036f5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063cfae32171461002d575b5f80fd5b61003561004b565b6040516100429190610160565b60405180910390f35b5f8054610057906101ad565b80601f0160208091040260200160405190810160405280929190818152602001828054610083906101ad565b80156100ce5780601f106100a5576101008083540402835291602001916100ce565b820191905f5260205f20905b8154815290600101906020018083116100b157829003601f168201915b505050505081565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561010d5780820151818401526020810190506100f2565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610132826100d6565b61013c81856100e0565b935061014c8185602086016100f0565b61015581610118565b840191505092915050565b5f6020820190508181035f8301526101788184610128565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806101c457607f821691505b6020821081036101d7576101d6610180565b5b5091905056fea264697066735822122013a9f52bf096edea0c506bad2c5d62064bd9490a874378c56b46cd68cac6a18264736f6c63430008170033
Contract JSON ABI
[{"inputs":[],"name":"greet","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
```


こんなふうなよくわからん文字列が出てきます。

とりあえず、バイナリが吐けたので、今回はここまで。