Nethereumで既存のコントラクトを扱う
Nethereumで既存のコントラクトを扱う方法。 ドキュメントでは自作のコントラクトを扱う説明しか見つけられなかったが、既存のコントラクトもソースコード(Solidity)があれば同じように扱える。
VS Code Solidity code generation demo - Nethereum Documentation
概要
VSCodeを使って、Solidityのソースコードから、C#用のライブラリを自動作成する。 そのライブラリを自分のプロジェクトから呼び出せば、コントラクトを簡単に扱うことができる。
手順
例として、Rarityのコントラクトを扱いたい場合の手順。
1. RarityContract/Contractsフォルダを作成
2. コントラクトのソースコードをコピーしてファイルに保存
Contract Address 0xce761d788df608bd21bdd59d6f4b54b2e27f25bb | FtmScan
[Contract Source Code (Solidity)]の内容をコピーして RarityContract/Contracts/Rarity.sol に保存
3. nethereum-gen.settingsを作成
VSCodeでフォルダを開いて、F1キー→Solidity: Create 'nethereum-gen.settings' with default values at root を選択
Contractsフォルダにnethereum-gen.settingsファイルが作成される
4. コンパイル
VSCodeでF1キー→Solidity: Compile Current Solidity Contract を選択
しばらくすると、多くのファイルやフォルダが作成される。 プロジェクトファイル RarityContract.Contracts.csproj も作成される。
この後は、VSCodeじゃなくてVisualStudio2019を使ってもよい。
5. ソリューションを作成
- ソリューション>追加>既存のプロジェクト で RarityContract.Contracts.csproj を追加
- ソリューション>追加>新規プロジェクト で コンソールアプリ(.NET5.0)を作成(別にWinFormsでもいいけど)
- 依存関係>プロジェクトの追加 で RarityContract.Contracts.csproj にチェック
- NuGetでNethereum.Web3をインストール
後は、
using RarityContract.Contracts.rarity; var web3 = new Web3("https://rpc.ftm.tools/"); var contractAddress = "0xce761D788DF608BD21bdd59d6f4B54b2e27F25Bb"; var service = new RarityService(web3, contractAddress); var summoner = 1234567; var value = await service.SummonerQueryAsync(summoner); Console.WriteLine($"Class={value.Class}, Level={value.Level}, XP={value.Xp}, Log={value.Log}");
というようにRarityServiceのメソッドを呼び出す形で、コントラクトの関数を扱える。
まあ、でも
きちんと型が定義されたクラス(RarityService)が作られるのは便利だけど、やっぱり面倒だなーと思ってしまう。そこまでしてC#にこだわらなくてもいいかなーと思いはじめている。。。