# Smart Contract: EthereumからAvalanche への移行

By [UNCHAIN](https://paragraph.com/@unchain) · 2022-12-01

---

※ 本記事は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` の部分に `fuji` や `mainnet` を用意し,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](https://faucet.avax.network/)からAVAXを取得します。
    
3.  MetaMaskで使用しているアカウントの秘密鍵を `hardhat.config.ts` 内で使えるようにします（ファイル内に直接記述, またはdotenvパッケージを使用し.envファイル内に記述）。
    

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

実行例

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

個人でRPCを用意することも可能です。 [DataHub](https://datahub.figment.io/) や [QuickNode](https://www.quicknode.com/) などがあるでしょう。

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://ethereum.org/en/developers/docs/accounts/)

[https://support.avax.network/en/articles/4596397-what-is-an-address](https://support.avax.network/en/articles/4596397-what-is-an-address)

ETHとAVAX
========

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

---

*Originally published on [UNCHAIN](https://paragraph.com/@unchain/smart-contract-ethereum-avalanche)*
