ethers.js を使用して Solidity スマート コントラクトをデプロイする方法

ethers.js を使用して Solidity スマート コントラクトをデプロイする方法

Ethereum 上で DApps を開発したことがある場合は、フロントエンド JavaScript で web3.js を使用したことがあるかもしれません。 Ethers.js は web3.js の軽量な代替品です。

Ethers.js には Web3.js に比べて多くの利点がありますが、私が気に入っている機能の 1 つは、Ethers.js が提供する状態とキーの管理です。 Web3 の設計シナリオでは、DApp はローカル ノードに接続し、キーの保存、トランザクションの署名、Ethereum ブロックチェーンとのやり取りを行う必要があります。現実にはそうではなく、大多数のユーザーはローカルで geth ノードを実行することはありません。 Metamask はブラウザ アプリケーションでこのノード環境を効果的にシミュレートするため、ほとんどの Web3 アプリケーションでは、キーを保存し、トランザクションに署名し、Ethereum とのやり取りを完了するために Metamask を使用する必要があります。

Ethers.js は異なる設計アプローチを採用しており、開発者にさらなる柔軟性を提供します。 Ethers.js は「ノード」を 2 つの異なる役割に分割します。

ウォレット: キーの保存とトランザクション署名を担当します。プロバイダー: Ethereum ネットワークの匿名接続、ステータス チェック、トランザクションの送信を担当します。

ethers.js は非常に合理化された Ethereum 操作ライブラリで、次の 4 つのモジュールが含まれています。
Ethers.プロバイダー
Ethers.コントラクト
イーサ.utils
イーサ.ウォレット
このうち、Ethers.provider は、Ethereum ノードとの接続、トランザクションの照会、トランザクションのブロードキャスト、アカウント残高の取得などを担当します。
Ethers.contract は、コントラクトのデプロイ、コントラクト内のイベントの監視、コントラクト内の情報の取得、コントラクト内の関数の呼び出しなど、スマート コントラクトとのやり取りを担当します。
Ethers.utils は、主に入力データと出力データを処理し、データ型と形式を変換するために使用されるツール ライブラリです。
Ethers.wallets は主に、新しいウォレットの作成、既存のウォレットの接続または切り替え、トランザクションの署名に使用されます。
次に、Ethers.js を使用してスマート コントラクトをデプロイする方法を紹介します。

1. 新しいプロジェクトsendtokenoneを作成する

mkdir sendtokenone
cd 送信トークン
npm 初期化 -y
トリュフ初期化

2. package.jsonを変更し、依存パッケージをインストールする

a) 変更された package.json ファイルは次のとおりです。
//パッケージ.json

{
  "名前": "sendtokenone",
  "バージョン": "1.0.0",
  "説明": "ethers.js デプロイメント コントラクト",
  "主要": ""、
  「スクリプト」: {
    "test": "echo \"エラー: テストが指定されていません\" && exit 1"
  },
  「キーワード」: [],
  "著者": ""、
  「ライセンス」: 「ISC」、
  「依存関係」: {
    "@openzeppelin/契約": "^3.4",
    "@truffle/hdwallet-provider": "^1.5.0",
    "ビッグナンバー": "^1.1.0",
    "bignumber.js": "^8.1.1",
    "チャイ": "^4.2.0",
    "約束通りのチャイ": "^7.1.1",
    "eslint": "^5.15.0",
    "イーサリアムjs-tx": "^1.3.7",
    "エーテル": "^5.4.7",
    "リクエスト": "^2.88.2",
    "web3": "^1.3.0"
  },
  「devDependencies」: {
    "@babel/core": "^7.12.3",
    "@babel/プリセット環境": "^7.12.1"
  }
}

b) 依存パッケージをインストールする

npmインストール

3. 新しいスマートコントラクトを作成する

3.1 EventValue.solコントラクトを作成する

sendtokenone/contacts ディレクトリで、次の内容の EventValue.sol 契約を作成します。
// イベント値.sol

// SPDX ライセンス識別子: MIT
プラグマ solidity ^0.6.0;

契約イベント値 {
    イベント ValueChanged(アドレス インデックス付き作成者、uint oldValue、uint newValue);
    uint _値;

    コンストラクタ(uint 値) public {
        uint tmp = _値;
        _value = 値;
        ValueChanged(msg.sender, tmp, value) を送信します。
    }
    関数 getValue() ビュー public 戻り値 (uint) {
        _value を返します。
    }
    関数setValue(uint value) パブリック {
        uint tmp = _値;
        _value = 値;
        ValueChanged(msg.sender, tmp, value) を送信します。
    }
}

3.2 デプロイメントスクリプトの作成

migDeployという名前の新しいフォルダを作成し、このフォルダにデプロイメントスクリプト1_deploy_event.jsを作成します。

mkdir migDeploy
cd migDeploy
1_deploy_event.js をタッチします

1_deploy_event.jsの内容は次のとおりです。
// 送信トークンワン/migDeploy/1_deploy_event.js

const {ethers} = require("ethers")
定数 fs = require('fs')

プロバイダー = new ethers.providers.JsonRpcProvider('http://localhost:8545') とします。

関数 getHexString(prikeyPath) {
    const privKeyFile = fs.readFileSync(prikeyPath).toString().trim();
    const privKey = new Buffer.from(privKeyFile, 'hex');    
    privKeyを返す
}

// var privKey = getHexString(".secret")
var privKey = '0x403d...23d5'
ウォレット = new ethers.Wallet(privKey,provider) とします。

var jsonStr = fs.readFileSync('./build/contracts/EventValue.json')
var jsonInfo = JSON.parse(jsonStr)
var jsonAbi = jsonInfo.abi
var バイトコード = jsonInfo.bytecode

非同期関数deployContract(abi,バイトコード,ウォレット) {
    factory = new ethers.ContractFactory(abi, バイトコード, ウォレット) を作成します。
    ContractObj = factory.deploy(100) を待機します。
    コンソールログ('契約アドレス=',契約オブジェクト.アドレス)
    console.log('deploy txHash=',contractObj.deployTransaction.hash)

    contractObj.deployed() を待つ   
}

デプロイコントラクト(jsonAbi、バイトコード、ウォレット)



3.3 契約書を作成する

a) ガナッシュのIPを127.0.0.1、ポートを8545に設定します。
b) truffle-config.js で、開発ネットワーク セグメントを有効にし、solc バージョンを 0.6.6 に指定します。
// トリュフconfig.js

モジュール.エクスポート = {
  ネットワーク:

    発達:
     ホスト: "127.0.0.1", // ローカルホスト (デフォルト: なし)
     port: 8545, // 標準 Ethereum ポート (デフォルト: なし)
     network_id: "*", // 任意のネットワーク (デフォルト: なし)
    },

  },

  // ここでデフォルトの mocha オプションを設定し、特別なレポーターなどを使用します。
  モカ:
    // タイムアウト: 100000
  },

  // コンパイラを設定する
  コンパイラ:
    ソルク: {
      version: "0.6.6", // solc-bin から正確なバージョンを取得します (デフォルト: truffle のバージョン)
      // docker: true, // docker でローカルにインストールした "0.5.1" を使用します (デフォルト: false)
      // 設定: { // 最適化とevmVersionに関するアドバイスについては、Solidityのドキュメントを参照してください
      // オプティマイザー: {
      // 有効: false、
      // 実行回数: 200
      // },
      // evmバージョン: "ビザンチウム"
      // }
    }
  },

};

ブラックフレームコンソールを開き、トリュフを使用して契約をコンパイルします

cd 送信トークン
トリュフコンソール
コンパイル

3.4 契約の展開

黒枠のターミナルで次のコマンドを入力してコントラクトをデプロイします。

cd 送信トークン
ノード migDeploy\1_deploy_event.js

効果は以下のとおりです。

図(1) ether.jsを使用したコントラクトのデプロイメント

コントラクト アドレスと txHash を印刷すると、コントラクトのデプロイメントが成功したことが示されます。

これで、ethers.js を使用して Solidity スマート コントラクトをデプロイする方法についての説明は終わりです。ethers.js を使用して Solidity スマート コントラクトをデプロイする方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

<<:  Docker のインストールと構成イメージの高速化の実装

>>:  mysql データ型変換の実装

ブログ    

推薦する

Linux での Firewalld の高度な設定の使用に関する詳細な説明

IPマスカレードとポート転送Firewalldは2種類のネットワークアドレス変換をサポートしています...

MySQLのあいまいクエリインデックスの失敗の問題を解決するいくつかの方法

% ワイルドカードを使用すると、インデックス失敗の問題が発生することがよくあります。ここでは、lik...

MySQL に外部キー制約を追加する具体的な方法

このチュートリアルの動作環境: Windows 7 システム、MySQL 8 バージョン、Dell ...

Vueはシンプルなスライダー検証を実装する

この記事の例では、Vueスライダー検証の実装を共有しています。コードは次のとおりです。 <テン...

Ubuntu 20.04にvncserverをインストールする方法

Ubuntu 20.04は2020年4月に正式にリリースされました。本日、ミラーシステムを正式にイン...

CentOS 7.2 に SuPHP をインストールするための詳細な手順

デフォルトでは、CentOS 7 上の PHP は apache または nobody として実行さ...

Navicat による MySQL パーティショニングの実践

MySQLのパーティショニングは、非常に大きなテーブルを管理するのに役立ちます。MySQLのパーティ...

要素の幅(高さ)の適応を実現するCSSおよびCSS3の柔軟なボックスモデル

1. CSSは左の固定幅と右の適応幅を実現します1. ポジショニング <!DOCTYPE ht...

Linux で docker-compose を使用したソフトウェア構成の詳細な説明

序文この記事では、docker-compose の構成をいくつか紹介します。これらを参考にして、独自...

tomcat+nginx を使用してマルチアプリケーション デプロイメントを実装するためのサンプル コード

目次マルチアプリケーションの展開1-Tomcat 構成1.1- プロジェクト構成1.2-サービス構成...

CentOS8 で MySQL 8.0 をインストールしてデプロイする方法

MySQL 8 の公式バージョン 8.0.11 がリリースされました。公式発表によると、MySQL ...

1つの記事でTypeScriptのデータ型について学ぶ

目次基本タイプあらゆるタイプ配列タプルインタフェース関数自己推論を入力する結合タイプ(1つ以上選択)...

波効果を作成するための CSS のトリック

純粋な CSS を使用して波の効果を実現することは、常に非常に困難でした。 波形曲線を実現するにはベ...

Linux でファイルプレフィックスを一括で追加する方法

フォルダー内のすべての txt ファイルのファイル名の前に「gt_」を追加する必要があります。つまり...

JavaScriptでページスクロールアニメーションを実装する

目次レイアウトを作成するCSSスタイルを追加するJavaScript で要素を操作する対象要素を取得...