本文へスキップ
BecomeCoder

C#実践コース · 第10章 ブロックチェーンとC# · レッスン58

スマートコントラクトの呼び出し

ローカル実施

導入

スマートコントラクトは、ブロックチェーン上にデプロイされた「プログラム」です。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はコントラクトのコードを生成するツールもあり、型安全に呼び出せる

詳細手順

  1. スターター150-smart-contract/starter.zipを開く(既知のテストネットERC-20トークンのアドレス・ABI設定済み)
  2. F5でbalanceOf読み取り実行し、残高が取得できることを確認する(無料)
  3. transfer(書き込み)を実行し、ガスが消費されトランザクションが発生することを確認する
スマートコントラクトのbalanceOfを呼び出し、コンソールにトークン残高が表示された画面
スマートコントラクトの関数呼び出し(読み取り)結果

まとめ

  • スマートコントラクトはチェーン上のプログラム。C#から関数を呼べる
  • 読み取り(Call)は無料、書き込み(Transaction)はガスが必要
  • 関数はC#クラス+属性でABIに対応づける

次回: 実務での活用例とこの章のまとめです。

テンプレート構成(教材制作用メモ)

150-smart-contract/
└── starter.zip   # ERC-20読み取り/書き込みTODO / ABI / README