Smart Contract: EthereumからAvalanche への移行

※ 本記事は2022/12/1時点での筆者の知る範囲での情報の公開であり、再現性や結果を保証するものではありません。当記事の内容を応用する場合は、ご自身でもDYORの精神で情報収集することを推奨します。

はじめに

この記事では既にEthereum上で動作している, または動作するよう作成したスマートコントラクトをAvalanche上へデプロイし,あなたのスマートコントラクトをAvalancheへ移行する際の要点をまとめます。

AvalancheのC-ChainはEVM互換であるため, Solidityで記述したスマートコントラクトをAvalanche上にそのままデプロイすることができます。

前提条件

  • スマートコントラクトをEthereumのネットワーク(testnet or mainnet)にデプロイしたことがある

  • MetaMaskを使用したことがある

デプロイ方法

開発環境によって多少違いはあると思いますが, デプロイ先を変更することでAvalancheへデプロイすることができます。

ここではhardhatを例にします。 以下のhardhat.config.tsの参考例です。

import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import * as dotenv from "dotenv";

// .envファイルから環境変数をロードします。
dotenv.config();

if (process.env.TEST_ACCOUNT_PRIVATE_KEY === undefined) {
  console.log("private key is missing");
}

const config: HardhatUserConfig = {
  solidity: "0.8.9",
  networks: {
    fuji: {
      url: "https://api.avax-test.network/ext/bc/C/rpc",
      chainId: 43113,
      accounts:
        process.env.TEST_ACCOUNT_PRIVATE_KEY !== undefined
          ? [process.env.TEST_ACCOUNT_PRIVATE_KEY]
          : [],
    },
    mainnet: {
      url: "https://api.avax.network/ext/bc/C/rpc",
      chainId: 43114,
      accounts: [`0x${process.env.MAIN_ACCOUNT_PRIVATE_KEY}`],
    },
  },
};

export default config;
  1. ここでわかるように, networks の部分に fujimainnet を用意し,AvalancheのRPCを記述します。

  2. また, デプロイをする前にMetaMaskにAvalancheのネットワークを追加し, 接続しておきます。

    fuji (C-Chainのtestnet) を使用する場合, 以下の情報でネットワークを追加できます

    Network Name: Avalanche FUJI C-Chain
    New RPC URL: https://api.avax-test.network/ext/bc/C/rpc ChainID: 43113
    Symbol: AVAX
    Explorer: https://testnet.snowtrace.io/
    

    faucetからAVAXを取得します。

  3. MetaMaskで使用しているアカウントの秘密鍵を hardhat.config.ts 内で使えるようにします(ファイル内に直接記述, またはdotenvパッケージを使用し.envファイル内に記述)。

以上でデプロイスクリプトを走らせるとAvalancheへデプロイすることができます。

実行例

npx hardhat run scripts/deploy.ts --network fuji

個人でRPCを用意することも可能です。 DataHubQuickNode などがあるでしょう。

Dappのクライアントサイドのコードにおいて,スマートコントラクトの情報(コントラクトのアドレスやABI情報)と使用方法はEthereumの時と基本的に変わりません。

しかし, ネイティブトークンの扱いは違いがあるので最後のセクションでお話しします。

MetaMaskが使える理由

Ethereum において, アカウントはトランザクションを送信でき, ETH を持つ存在です。 ユーザが管理することも, スマートコントラクトとして展開することもできます。

ユーザによって管理されるアカウントは, 秘密鍵と公開鍵により構成されます。 この2つの鍵のペアは取引が実際に送信者によって署名されたことを証明し、偽造を防止するのに役立ちます。

そして Ethereum 上でアカウントを判別する仕組みとしてアドレスがあります。 Ethereum では, アドレスはアカウントの公開鍵の最後の20バイトが使われます。

そしてユーザがアカウントとやり取りするためのインターフェースとしてウォレットがあります。 MetaMask は Ethereum アカウントとやり取りができるウォレットです。

Avalanche も同じように秘密鍵と公開鍵の仕組みを取り入れており,C-Chain は EVM のアドレスシステムを採用しています。

そのためC-Chain上での取引には,(例えばMetaMaskで作成した)既存のアカウントを使用することができます。

参考リンク

https://ethereum.org/en/developers/docs/accounts/

https://support.avax.network/en/articles/4596397-what-is-an-address

ETHとAVAX

C-Chainのネイティブトークンのシンボルは AVAX なので, コントラクト内でネイティブトークンを使用している部分はAVAXが使用されることになります。