deployコマンド
初期展開: truffle migrate
再デプロイ:truffle migrate --reset
デプロイメントファイル
最初に変更する./migrations/2_initial_migration.js
ファイル名には数字の接頭辞と説明の接尾辞が付いていることに注意してください。移行が正常に実行されたかどうかを記録するには、番号付きのプレフィックスが必要です。接尾辞は、純粋に人間の読みやすさと理解のためのものです。
1.基本構成
移行の開始時に、artifacts.require()メソッドを介して対話するコントラクトをTruffleに通知します。このメソッドはNodeが必要とするものと似ていますが、この場合、デプロイメントスクリプトの残りの部分で使用できる抽象的なコントラクトを具体的に返します。指定する名前は、このソースファイルのコントラクトで定義されている名前と一致する必要があります。ファイルには複数のコントラクトを含めることができるため、ソースファイルの名前は渡されません。例:
// fileName: ./contracts/Contracts.sol
contract ContractOne { // ... }
contract ContractTwo { // ... }
ContractTwo
あなたがあなたの契約でこのようにそれを書くならばartifacts.require()
:
var ContractTwo = artifacts.require("ContractTwo");
両方を使用する場合:
var ContractOne = artifacts.require("ContractOne");
var ContractTwo = artifacts.require("ContractTwo");
すべての移行では、module.exports構文を介して関数をエクスポートする必要があります。各移行によってエクスポートされる関数は、最初の引数としてデプロイヤーオブジェクトを受け入れる必要があります。このオブジェクトは、スマートコントラクトをデプロイするための明確な構文を提供するだけでなく、後で使用するためにデプロイされたアーティファクトを保存するなど、デプロイメントのより日常的な責任の一部を実行することにより、デプロイメントを支援します。Deployerオブジェクトは、デプロイメントタスクをステージングするためのメインインターフェイスであり、そのAPIについてはこのページの下部で説明しています。
これらの2つのファイルは、 Truffle フレームワーク に保存contracts/Migrations.sol
する 必要があります。migrations/1_initial_migration.js
デプロイするときは、コントラクトが最初にデプロイされます。
2.デプロイヤ
デプロイメントファイルは、デプロイヤーを使用してデプロイメントタスクを完了します。したがって、デプロイメントタスクを同期的に記述でき、それらは正しい順序で実行されます。
// 先部署A再部署B,两者直接无直接联系
deployer.deploy(A);
deployer.deploy(B);
// 部署A后把A的地址作为参数再部署B
deployer.deploy(A).then(function() {
return deployer.deploy(B, A.address);
});
詳細なAPIドキュメントの説明は後であります。
3.ネットワーク構成
展開手順は、展開先のネットワークに基づいて条件付きで実行できます。これは高度な機能であるため、
展開手順を条件付きでステージングするには、ネットワークと呼ばれる2番目のパラメーターを受け入れるように移行を記述します。例:
module.exports = function(deployer, network) {
if (network == "live") {
// Do something specific to the network named "live".
} else {
// Perform a different step otherwise.
}
}
4.アカウントを選択します
移行では、展開中に使用できるように、Ethereumクライアントとweb3プロバイダーから提供されたアカウントのリストも渡されます。これはweb3.eth.getAccounts()
、から返されたアカウントリストと同じです。
module.exports = function(deployer, network, accounts) {
// Use the accounts within your migrations.
}
5.Deployer.API
デプロイヤには、移行を簡素化するために使用できる多くの機能が含まれています。
deployer.deploy(contract, args..., options)
オプションのコンストラクター引数を使用して、コントラクトオブジェクトで指定された特定のコントラクトをデプロイします。これはシングルトンコントラクトに役立ちます。したがって、このコントラクトのインスタンスはdappに1つ これにより、展開後にコントラクトのアドレスが設定され(つまり、Contract.addressは新しく展開されたアドレスと等しくなります)、以前に保存されていたアドレスが上書きされます。
コントラクトの配列またはアレイを渡すことを選択して、複数のコントラクトの展開を高速化できます。また、最後のパラメーターはオプションのオブジェクトであり、overwriteという名前のキーと、gasやfromなどの他のトランザクションパラメーターを含めることができます。上書きがfalseに設定されている場合、デプロイヤーはこのコントラクトをデプロイしません(既にデプロイされている場合)。これは、契約アドレスが外部の依存関係によって提供される場合に役立ちます。
deployを呼び出す前に、コントラクトが依存するライブラリを最初にデプロイしてリンクする必要があることに注意してください。詳細については、以下のリンク機能を参照してください。
詳細については、トリュフ契約のドキュメントを参照してください。
// 在没有构造函数参数的情况下部署单个合约
deployer.deploy(A);
// 使用构造函数参数部署单个合同
deployer.deploy(A, arg1, arg2, ...);
// 如果已经部署了此合同,请不要部署它
deployer.deploy(A, {overwrite: false});
//为部署设置最大Gas 和 “from” 地址
deployer.deploy(A, {gas: 4612388, from: "0x...."});
// Deploy multiple contracts, some with arguments and some without.
// This is quicker than writing three `deployer.deploy()` statements as the deployer
// can perform the deployment as a single batched request.
deployer.deploy([
[A, arg1, arg2, ...],
B,
[C, arg1]
]);
// External dependency example:
//
// For this example, our dependency provides an address when we're deploying to the
// live network, but not for any other networks like testing and development.
// When we're deploying to the live network we want it to use that address, but in
// testing and development we need to deploy a version of our own. Instead of writing
// a bunch of conditionals, we can simply use the `overwrite` key.
deployer.deploy(SomeDependency, {overwrite: false});
deployer.link
deployer.link(library, destinations)
デプロイされたライブラリを1つまたは複数のコントラクトにリンクします。宛先は、単一のコントラクトまたは複数のコントラクトの配列にすることができます。宛先内の契約がリンクされたライブラリに依存していない場合、その契約は無視されます。
// Deploy library LibA, then link LibA to contract B, then deploy B.
deployer.deploy(LibA);
deployer.link(LibA, B);
deployer.deploy(B);
// Link LibA to many contracts
deployer.link(LibA, [B, C, D]);
deployer.then(function() {...})
と同様promise
に、任意の展開手順を実行します。このオプションを使用して、移行中に特定の契約関数を呼び出し、契約データを追加、編集、および再編成します。
var a, b;
deployer.then(function() {
// Create a new version of A
return A.new();
}).then(function(instance) {
a = instance;
// Get the deployed instance of B
return B.deployed();
}).then(function(instance) {
b = instance;
// Set the new instance of A's address on B via B's setA() function.
return b.setA(a.address);
});
他の構成を展開する
コンパイラー構成:
compilers: {
solc: {
version: "0.5.1",
settings: {
optimizer: {
enabled: true,
runs: 200,
}}}}
プロジェクトルートディレクトリのプロジェクト構成ファイルtruffle.jsで、シードを使用してメインネットまたはテストネットにコントラクトをデプロイできます。以下は、テストネットにデプロイするためrinkeby
の構成を提供します
const HDWalletProvider = require('truffle-hdwallet-provider');
const fs = require('fs');
// 读取种子,12个单词组成的种子
const mnemonic = fs.readFileSync("./path/to/mnemonic.secret").toString().trim();
module.exports ={
networks:{
rinkebyTest:{
provider: () => new HDWalletProvider(
mnemonic,
`https://rinkeby.infura.io/v3/aa86f***60803c`,// your infura API key
0, // 地址的起始索引
10 // 生成的地址数量
),
network_id: 4,
// gas: 6500000,
confirmations: 2,
gasPrice: 5000000000, // 5 Gwei
skipDryRun: true // 跳过预执行,直接部署
}
}
}