solidity-以太坊区块链Truffle-webpack开发入门 (八) 合约交互 Interact

Phaedra ·
更新时间:2024-11-10
· 792 次阅读

合约交互    原文地址 合约交互的操作可以定义为两类: read和write 在合约中 read 操作被称作 call  write 操作被称为 transaction call操作不会花费coin(钱,这里被称为‘gas’),写操作会花费gas 总结transaction的特点就是: 花费gas 改变网络状态 不会立刻处理完成 但是会返回一个transaction的ID call的特点: 免费(不会消耗gas) 不会改变网络状态 会立刻处理完成 会暴露一个返回值 call 操作实例: 决定使用call还是transaction依据你是要读还是写数据 truffle封装了call和transaction的操作,使得程序易于编写和执行 由于区块链的特殊性,使得call和transaction的操作并不像普通的app中的操作那么简单,由于设计到花钱的操作, 所以执行合约的函数之前需要特别慎重,所以合约的读操作有特殊的写法:
var account_one = "0x1234..."; // an address
var meta; MetaCoin.deployed().then(function(instance) { meta = instance; return meta.getBalance.call(account_one, {from: account_one}); }).then(function(balance) { // If this callback is called, the call was successfully executed. // Note that this returns immediately without any waiting. // Let's print the return value. console.log(balance.toNumber()); }).catch(function(e) { // There was an error! Handle it. })
上面查询一个账号的余额,调用函数getBanalce,里面传一个参数,address 但是由于这个操作是读的操作,我们使用call来作为一个修饰告诉truffle这是一个读操作,那么就不会产生gas 如果是个写操作,正常调用即可。 *上面的函数增加了一个参数 {from:add},可以看作truffle给合约实例一个特殊的权利,在调用任何函数的时候可以在原来函数参数的最后多传一个{from:xxx}参数,from的值是一个用户的address,表示这个函数的调用者 transaction 操作实例:
var account_one = "0x1234..."; // an address
var account_two = "0xabcd..."; // another address
var meta; MetaCoin.deployed().then(function(instance) { meta = instance; return meta.sendCoin(account_two, 10, {from: account_one}); }).then(function(result) { // result is an object with the following values: // // result.tx      => transaction hash, string // result.logs    => array of decoded events that were triggered within this transaction // result.receipt => transaction receipt object, which includes gas used
// We can loop through result.logs to see if we triggered the Transfer event. for (var i = 0; i < result.logs.length; i++) { var log = result.logs[i];
if (log.event == "Transfer") { // We found the event! break; } } }).catch(function(err) { // There was an error! Handle it. });
transaction的操作会返回一个对象 result,这个对象包含三个数据:
result.tx      => 操作的hash值
result.logs    => 一个event数组,transaction执行过程中操作涉及的事件
result.receipt => transaction操作的收据对象
在上方的代码中可以看到 通过遍历“result.logs”可以了解这个transaction涉及到哪些call(读取)和transfer(写入)操作 作者:大都废



Interact Truffle-webpack solidity 以太坊 webpack

需要 登录 后方可回复, 如果你还没有账号请 注册新账号