導入
スマートコントラクトは、ブロックチェーン上にデプロイされた「プログラム」です。C#(Nethereum)から、その関数を呼び出す(読み取り)・**実行する(書き込み)**ことができます。ブロックチェーン活用の中心となる操作です。
図解
flowchart LR
APP["C♯アプリ"] -->|Call(読み取り・無料)| SC["スマートコントラクト<br/>(チェーン上のプログラム)"]
APP -->|Transaction(書き込み・ガス必要)| SC
style SC fill:#fff3e0
サンプル(読み物)
using Nethereum.Web3;
using Nethereum.Contracts;
using Nethereum.ABI.FunctionEncoding.Attributes;
// コントラクトの関数を表すC#クラス(ABIから対応づける)
[Function("balanceOf", "uint256")]
public class BalanceOfFunction : FunctionMessage
{
[Parameter("address", "_owner", 1)]
public string Owner { get; set; } = "";
}
var web3 = new Web3("https://sepolia.infura.io/v3/YOUR_PROJECT_ID");
string contractAddress = "0xコントラクトアドレス";
// 読み取り(Call): ガス不要・無料。状態を変えない
var handler = web3.Eth.GetContractQueryHandler<BalanceOfFunction>();
var balance = await handler.QueryAsync<System.Numerics.BigInteger>(
contractAddress,
new BalanceOfFunction { Owner = "0xあなたのアドレス" });
Console.WriteLine($"トークン残高: {balance}");
- スマートコントラクトの各関数は、C#クラス(
FunctionMessage)+属性で表す(ABIに対応) - 読み取り(Call / Query):状態を変えないのでガス不要・無料・即時(残高照会など)
- 書き込み(Transaction):状態を変えるのでガスが必要・承認待ちが発生(送金・記録など)
GetContractQueryHandlerで読み取り、GetContractTransactionHandlerで書き込みを行う- Nethereumはコントラクトのコードを生成するツールもあり、型安全に呼び出せる
詳細手順
- スターター
150-smart-contract/starter.zipを開く(既知のテストネットERC-20トークンのアドレス・ABI設定済み) - F5で
balanceOfを読み取り実行し、残高が取得できることを確認する(無料) transfer(書き込み)を実行し、ガスが消費されトランザクションが発生することを確認する
まとめ
- スマートコントラクトはチェーン上のプログラム。C#から関数を呼べる
- 読み取り(Call)は無料、書き込み(Transaction)はガスが必要
- 関数はC#クラス+属性でABIに対応づける
次回: 実務での活用例とこの章のまとめです。
テンプレート構成(教材制作用メモ)
150-smart-contract/
└── starter.zip # ERC-20読み取り/書き込みTODO / ABI / README