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 

文章发布只为分享区块链技术内容,版权归原作者所有,观点仅代表作者本人,绝不代表区块链兄弟赞同其观点或证实其描述。


分享到:


相關文章: