Ethereumアプリ開発フレームワークTruffleでテストネットに接続する仕方
接続可能なテストネット
Testnet | Description | ID |
---|---|---|
Ropsten | proof-of-workの唯一のテストネット。予測できないブロック時間と頻繁なチェーンの再編成があります。同時に、メインネットに最もよく似ているのはチェーンです。 | 3 |
Rinkeby | A proof-of-authority ネットワーク。 これは、新しいブロックが、プルーフオブワークを提供するマイナーではなく、事前定義された信頼できるノードのセットによって追加されることを意味します。 Gethクライアントでのみ機能し、ブロック時間は15秒です。 | 4 |
Kovan | Another proof-of-authorityネットワーク 、ただし、これはパリティクライアントでのみ実行され、ブロック時間は4秒です。 | 42 |
Goerli | これも a proof-of-authority ネットワーク, ただし、GethクライアントとParityクライアントの両方と互換性があり、ブロック時間は15秒です。 | 5 |
MainnetはID=1をリザーブ
Ethereumアプリ開発フレームワークTruffleでテストネットに接続する仕方
テストネットに接続するには
- テストネットノードを入手する
- 新しいアカウントを作成する
- Truffle構成ファイルでネットワーク構成を更新します
- テストアカウントに資金を提供する
が必要である。
テストノードにアクセスする、用意する。
テストネットに接続された独自のGethがノードを起動できますが、テストネットにアクセスする最も簡単な方法は、Infuraなどのパブリックノードサービスを使用することです。Infuraは、無料プランと有料プランの両方を介して、すべてのテストネットとメインネットワークのパブリックノードへのアクセスを提供します。
新規アカウントの作成
下記のコマンドでアカウントが作成されフェーズ( mnemonics )の獲得ができます。メタマスクのものを使用もできます。
$ npx mnemonics
planet auto sign choice ...
自分のプロジェクトの作成
Truffleのプロジェクトを持っていること、もし持っていなかった場合下記で作成できます。
$ mkdir myproject && cd myproject
$ npm init -y
$ npm i truffle
$ npx truffle init
自分のプロジェクトの作成
こちらcontract from the OpenZeppelin Learn guides を利用
contractフォルダ内にBox.solを新規作成、内容は下記。
// contracts/Box.sol
// SPDX-License-Identifier: MIT
// from: https://docs.openzeppelin.com/learn/developing-smart-contracts#setting-up-a-solidity-project
pragma solidity ^0.6.0;
contract Box {
uint256 private value;
// Emitted when the stored value changes
event ValueChanged(uint256 newValue);
// Stores a new value in the contract
function store(uint256 newValue) public {
value = newValue;
emit ValueChanged(newValue);
}
// Reads the last stored value
function retrieve() public view returns (uint256) {
return value;
}
}
migrations
フォルダ内に2_deploy.jsを作成して
// migrations/2_deploy.js
// SPDX-License-Identifier: MIT
const Box = artifacts.require("Box");
module.exports = function(deployer) {
deployer.deploy(Box);
};
ネットワークの調整
パブリックノードを使用しているため、すべてのトランザクションにローカルで署名する必要があります。これを行うには@truffle / hdwallet-providerを使用し、mnemonicで設定します。また、Infuraエンドポイントを使用してテストネットワークに接続する方法をプロバイダーに説明します。
まずはプロバイダーをインストール
$ npm install --save-dev @truffle/hdwallet-provider
truffle-config.jsのコンフィグ
const { projectId, mnemonic } = require('./secrets.json');
const HDWalletProvider = require('@truffle/hdwallet-provider');
module.exports = {
networks: {
development: {
host: "127.0.0.1", // Localhost (default: none)
port: 8545, // Standard Ethereum port (default: none)
network_id: "*", // Any network (default: none)
},
// Useful for deploying to a public network.
// NB: It's important to wrap the provider as a function.
ropsten: {
provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/${projectId}`),
network_id: 3, // Ropsten's id
gas: 5500000, // Ropsten has a lower block limit than mainnet
confirmations: 2, // # of confs to wait between deployments. (default: 0)
timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50)
skipDryRun: true // Skip dry run before migrations? (default: false for public nets )
},
},
};
最初の行で、secrets.jsonファイルからプロジェクトIDと mnemonic をロードしていることに注意してください。これは次のようになりますが、独自の値を使用します。必ず.gitignoreを確認してください。
{
"mnemonic": "planet auto sign choice ...",
"projectId": "305c137050..."
}
ヒント:secrets.jsonファイルの代わりに、プロジェクトに必要なシークレット管理ソリューションを使用できます。一般的で単純なオプションは、環境変数としてシークレットを挿入するためにdotenvを使用することです。 これで、Ropstenネットワークで使用可能なアカウントを一覧表示することにより、この構成が機能していることをテストできます。使用したmnemonicによって異なるため、異なることを覚えておいてください。
$ npx truffle console --network ropsten
truffle(ropsten)> await web3.eth.getAccounts()
[
'0xb022FFdC8F9156BcaA9818cb7B9658364758B5De',
'0xa9372cde6f32f7EC77FB4962d6C292611dF30117',
'0xB568d2240E1d3D08c52488d2ceb4e2525aD0F38c',
...
]
infuraでもできます。
$ npx truffle console --network ropsten
truffle(ropsten)> await web3.eth.getBalance('0xb022FFdC8F9156BcaA9818cb7B9658364758B5De')
'0'
テストアカウントにテスト用のFund
ほとんどの公開テストネットにはfaucetがあります。少量のテストEtherを無料で提供するサイトです。 Ropstenを使用している場合は、Ropsten Faucetにアクセスして資金を入手してください。または、MetaMaskFaucetを使用して、MetaMaskアカウントに直接資金を要求することもできます。
$ npx truffle migrate --network ropsten
Compiling your contracts...
===========================
> Compiling ./contracts/Box.sol
> Compiling ./contracts/Migrations.sol
> Artifacts written to /home/abcoathup/projects/forum/myproject/build/contracts
> Compiled successfully using:
- solc: 0.6.7+commit.b8d736ae.Emscripten.clang
Starting migrations...
======================
> Network name: 'ropsten'
> Network id: 3
> Block gas limit: 8000029 (0x7a121d)
1_initial_migration.js
======================
Deploying 'Migrations'
----------------------
> transaction hash: 0xb3ae2fe5eb982b747ec3bca0530692245cdc02d0e4bbab0fd5d30c3ec9213097
> Blocks: 2 Seconds: 17
> contract address: 0x27fbe63444eC4B5F97217DAC66f1b0CdcF9c4859
> block number: 7983802
> block timestamp: 1590647318
> account: 0xb022FFdC8F9156BcaA9818cb7B9658364758B5De
> balance: 0.99342436
> gas used: 164391 (0x28227)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00328782 ETH
Pausing for 2 confirmations...
------------------------------
> confirmation number: 1 (block: 7983803)
> confirmation number: 3 (block: 7983805)
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00328782 ETH
2_deploy.js
===========
Deploying 'Box'
---------------
> transaction hash: 0xed23f94b7fec11934d504e3caf04279e6223a43aba0133ce2bbc32d2d50fb702
> Blocks: 2 Seconds: 9
> contract address: 0x98C6f9aeAB681568988cd8CCD5B86AdaE380672F
> block number: 7983812
> block timestamp: 1590647396
> account: 0xb022FFdC8F9156BcaA9818cb7B9658364758B5De
> balance: 0.99041172
> gas used: 108291 (0x1a703)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00216582 ETH
Pausing for 2 confirmations...
------------------------------
> confirmation number: 1 (block: 7983813)
> confirmation number: 2 (block: 7983814)
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00216582 ETH
Summary
=======
> Total deployments: 2
> Final cost: 0.00545364 ETH
$ npx truffle console --network ropsten
truffle(ropsten)> box = await Box.deployed()
truffle(ropsten)> await box.store('42')
{
tx: '0x3d125322e7d0738d554424085197e9d94b8280849cdac6c3010ea426427928ec',
receipt: {
blockHash: '0xf35a7f53e502f524adda3bca18878982e20e775072038e74e3502f078c684714',
blockNumber: 7983886,
contractAddress: null,
cumulativeGasUsed: 42513,
from: '0xb022ffdc8f9156bcaa9818cb7b9658364758b5de',
gasUsed: 42513,
logs: [ [Object] ],
logsBloom: '0x40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000400000000000000000000000000000',
status: true,
to: '0x98c6f9aeab681568988cd8ccd5b86adae380672f',
transactionHash: '0x3d125322e7d0738d554424085197e9d94b8280849cdac6c3010ea426427928ec',
transactionIndex: 0,
rawLogs: [ [Object] ]
},
logs: [
{
address: '0x98C6f9aeAB681568988cd8CCD5B86AdaE380672F',
blockHash: '0xf35a7f53e502f524adda3bca18878982e20e775072038e74e3502f078c684714',
blockNumber: 7983886,
logIndex: 0,
removed: false,
transactionHash: '0x3d125322e7d0738d554424085197e9d94b8280849cdac6c3010ea426427928ec',
transactionIndex: 0,
id: 'log_e38e9ac8',
event: 'ValueChanged',
args: [Result]
}
]
}
テストネットを利用したデプロイ
Truffleを使用してテストネットワークRinkebyにNFTをデプロイ!