Truffle詳解

為了使用合約抽象和合約交互,我們需要通過npm安裝truffle-contract模塊

$ cd myproject$ npm init -y$ npm install --save [email protected]$ npm install --save [email protected]

10.7.4 與合約交互

1. Call 方式交互

介紹完上述概念後,現在我們可以和之前部署好的Storage.sol合約交互了,首先我們以call方式調用合約。

文件:call.js

varWeb3=require("web3");varcontract=require("truffle-contract");vardata=require("../build/contracts/Storage.json");// 返回合約抽象varStorage=contract(data);varprovider=newWeb3.providers.HttpProvider("http://localhost:8545");Storage.setProvider(provider);// 通過合約抽象與合約交互Storage.deployed().then(function(instance) { returninstance.get.call(); // call 方式調用合約}).then(result=>{ console.info(result.toString());// return 0}).catch(err=>{ // 報錯了!在這裡處理異常信息});

注意:

我們必須明確地調用.call()函數,告訴Ethereum網絡知道我們不會修改區塊鏈上的數據。當調用成功是,我們會收到一個返回值,而不是交易ID。

2.Transaction 方式交互

接下來我們以transaction方式給Storage.sol合約中storedData變量賦值為42,

文件:transaction.js

varWeb3=require("web3");varcontract=require("truffle-contract");vardata=require("../build/contracts/Storage.json");// 返回合約抽象varStorage=contract(data);varprovider=newWeb3.providers.HttpProvider("http://localhost:8545");Storage.setProvider(provider);varstorageInstance;Storage.deployed().then(function(instance) { storageInstance=instance; //以transaction方式與合約交互 returnstorageInstance.set(42,{from:Storage.web3.eth.accounts[0]});}).then(result=>{// result 是一個對象,它包含下面這些值: // // result.tx => 交易hash,字符型 // result.logs => 在交易調用中觸發的事件,數組類型 // result.receipt => 交易的接收對象,裡面包含已使用的gas 數量 console.info(result.tx);//返回交易ID}).then(()=>{ // 調用Storage get 方法 returnstorageInstance.get.call();}).then(result=>{ console.info(result.toString());// 返回 42 ,說明我們之前的調用成功了!}).catch(err=>{ // 報錯了!在這裡處理異常信息}); 

上面的代碼有一些需要說明的地方:

我們直接調用這合約抽象的 set 方法。 默認情況下,這個操作會向區塊鏈網絡中發送一筆交易。也可以顯式調用storageInstance.set.sendTransaction(42,{from:Storage.web3.eth.accounts[0]}),表明是以transaction方式交互

當這個交易成功發出後,回調函數只有在交易被成功打包處理後才會激活,這省去了你自己寫判斷語句檢查交易狀態的麻煩。

我們傳遞了一個對象給set函數的第二個參數。注意:在我們的Storage.sol合約代碼中set函數並沒有第三個參數,這第三個參數是合約抽象API裡的。在合約抽象的所有函數中,你都可以向它們傳入一個對象作為最後一個參數,在這個對象中你可以寫入一些有關交易細節,在這個例子中,我們在對象中寫入from字段,以確保這個交易是來自 web3.eth.accounts[0]。

10.7.5 添加一個新合約到網絡

在上面的所有例子中,我們使用的是一個已部署好的合約抽象,我們可以使用合約抽象的.new()函數來部署自己的合約。

文件:new.js

varWeb3=require("web3");varcontract=require("truffle-contract");vardata=require("../build/contracts/Storage.json");// 返回合約抽象varStorage=contract(data);varprovider=newWeb3.providers.HttpProvider("http://localhost:8545");Storage.setProvider(provider);varstorageInstance;// new 部署新的合約Storage.new({from:Storage.web3.eth.accounts[0],gas:1000000}).then(function(instance) { storageInstance=instance; // 輸出新合約的地址 console.log(instance.address); // 0xfc628dd79137395f3c9744e33b1c5de554d94882}).catch((err) =>{ console.info(err) // 報錯了!在這裡處理異常信息}); 

10.7.6 使用現有合約地址

如果你已經有一個合約地址,你可以通過這個地址創建一個新的合約抽象。

varWeb3=require("web3");varcontract=require("truffle-contract");vardata=require("../build/contracts/Storage.json");// 返回合約抽象varStorage=contract(data);varprovider=newWeb3.providers.HttpProvider("http://localhost:8545");Storage.se 

文章發佈只為分享區塊鏈技術內容,版權歸原作者所有,觀點僅代表作者本人,絕不代表區塊鏈兄弟贊同其觀點或證實其描述。


分享到:


相關文章: