編譯
truffle compile
僅默認(rèn)編譯自上次編譯后被修改過的文件锹锰,來減少不必要的編譯酸役。如果你想編譯全部文件,可以使用--compile-all
選項
truffle compile --compile-all
Truffle需要定義的合約名稱和文件名準(zhǔn)確匹配。舉例來說,如果文件名為MyContract.sol楔脯,那么合約文件須為如下兩者之一(區(qū)分大小寫
):
contract MyContract {
...
}
// or
library MyContract {
...
}
依賴
你可以通過使用import來聲明依賴。Truffle將會按正確順序依次編譯合約胯甩,并在需要的時候自動關(guān)聯(lián)庫昧廷。
部署合約
如果你之前的移植是成功執(zhí)行的堪嫂。truffle migrate
僅會執(zhí)行新創(chuàng)建的移植。如果沒有新的移植腳本木柬,這個命令不同執(zhí)行任何操作皆串。可以使用選項--reset
來從頭執(zhí)行移植腳本眉枕。
例如migrations
目錄下的移植腳本是4_example_migration.js
愚战,文件名以數(shù)字開頭
,一個描述性的后綴結(jié)尾齐遵。數(shù)字前綴是必須的,用于記錄移植是否成功
塔插。后綴僅是為了提高可讀性梗摇,以方便理解。
部署器(deployer)
你的移植文件會使用部署器來緩存部署任務(wù)想许。所以伶授,你可以按一定順序排列發(fā)布任務(wù),他們會按正確順序執(zhí)行
流纹。
// Stage deploying A before B 先部署A再部署B(yǎng)
deployer.deploy(A);
deployer.deploy(B);
另一選中可選的部署方式是使用Promise糜烹。將部署任務(wù)做成一個隊列,是否部署依賴于前一個合約的執(zhí)行情況
// Deploy A, then deploy B, passing in A's newly deployed address
deployer.deploy(A).then(function() {
return deployer.deploy(B, A.address);
});
要實現(xiàn)不同條件的不同部署步驟漱凝,移植代碼中需要第二個參數(shù)network疮蹦。示例如下:
module.exports = function(deployer, network) {
// Add demo data if we're not deploying to the live network.
if (network != "live") {
deployer.exec("add_demo_data.js");
}
}
// Deploy a single contract without constructor arguments
deployer.deploy(A);
// Deploy a single contract with constructor arguments
deployer.deploy(A, arg1, arg2, ...); //部署合約A構(gòu)造函數(shù)傳入的參數(shù)
// 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 batched request.
//依次部署多個合約
deployer.deploy([
[A, arg1, arg2, ...],
B,
[C, arg1]
]);
DEPLOYER.LINK(LIBRARY, DESTINATIONS)
聯(lián)接一個已經(jīng)發(fā)布
的庫到一個或多個合約。destinations
可以是一個合約或多個合約組成的一個數(shù)組茸炒。如果目標(biāo)合約并不依賴這個庫愕乎,部署器會忽略掉這個合約。
DEPLOYER.AUTOLINK(CONTRACT)
關(guān)聯(lián)合約依賴的所有庫壁公。這需要所依賴的庫已經(jīng)部署感论,或在其前一步部署。
例子:
// Assume A depends on a LibB and LibC
deployer.deploy([LibB, LibC]);
deployer.autolink(A);
另外你可以省略參數(shù)來調(diào)用函數(shù)autolink()
紊册。這會自動關(guān)聯(lián)合約依賴的所有庫比肄。需要保證在調(diào)用這個函數(shù)前,所有被需要的庫已經(jīng)部署了囊陡。
例子:
// Link *all* libraries to all available contracts
deployer.autolink();
DEPLOYER.THEN(FUNCTION() {...})
Promise語法糖芳绩,執(zhí)行做生意的部署流程。
例子:
deployer.then(function() {
// Create a new version of A
return A.new();
}).then(function(instance) { //這里的instance就是上邊A.new()返回的合約A的實例
// Set the new instance of A's address on B.
var b = B.deployed();
return b.setA(instance.address);
});
DEPLOYER.EXEC(PATHTOFILE)
執(zhí)行truffle exec
做為部署的一部分关斜。查看10. 外部腳本章節(jié)了解更多示括。
例子:
// Run the script, relative to the migrations file.
deployer.exec("../path/to/file/demo_data.js");
捕捉事件(Catching Events)
你的合約可以觸發(fā)事件,你可以進行捕捉以進行更多的控制痢畜。事件API與Web3一樣垛膝△⒙拢可以參考Web3 documentation來了解更多。
var meta = MetaCoin.deployed();
var transfers = meta.Transfer({fromBlock: "latest"});
transfers.watch(function(error, result) {
// This will catch all Transfer events, regardless of how they originated.
if (error == null) {
console.log(result.args);
}
}
METHOD:DEPLOYED()
每一個抽象出來的合約接口都有一個deployed()
方法吼拥,上述例子中倚聚,你已經(jīng)見到過。調(diào)用這個函數(shù)返回一個實例凿可,這個實例代表的是之前部署到網(wǎng)絡(luò)的合約所對應(yīng)的抽象接口的實例惑折。
var meta = MetaCoin.deployed();
警告:這僅對使用truffle deploy
部署的合約,且一定是在project configuration
中配置發(fā)布的才有效枯跑。如果不是這樣惨驶,這個函數(shù)執(zhí)行時會拋出異常。
METHOD:AT()
類似于deployed()
敛助,你可以通過一個地址來得到一個代表合約的抽象接口實例粗卜。當(dāng)然這個地址一定是這個合約的部署地址。
var meta = MetaCoin.at("0x1234...")
警告:當(dāng)你的地址不正確纳击,或地址對應(yīng)的合約不正確時续扔,這個函數(shù)并不會拋出異常。但調(diào)用接口時會報錯焕数。請保證在使用at()
時輸入正確的地址纱昧。
METHOD:NEW()
你可以通過這個方法來部署一個完全全新的合約到網(wǎng)絡(luò)中。
MetaCoin.new().then(function(instance) {
// `instance` is a new instance of the abstraction.
// If this callback is called, the deployment was successful.
console.log(instance.address);
}).catch(function(e) {
// There was an error! Handle it.
});
需要注意的是這是一個交易堡赔,會改變網(wǎng)絡(luò)的狀態(tài)识脆。