代码之家  ›  专栏  ›  技术社区  ›  Alsofter

Web3.js以太坊-是否可以在一个事务中调用2个函数?

  •  1
  • Alsofter  · 技术社区  · 6 年前

    也许这是个愚蠢的问题。但我想知道是否有可能在以太坊的一个事务中放置2个(或更多)智能合约方法调用。

    单个事务中一个函数调用的代码部分:

    var data = self.MyContract.MyFunc1.getData(
            param1);
    const options = {
        gasPrice: gasPrice,
        gasLimit: gasLimit,
        nonce,
        data,
        to: addressContract,
    };
    const tx = new Tx(options);
    tx.sign(new Buffer(private_key, 'hex'));
    const rawTx = `0x${tx.serialize().toString('hex')}`;
    self.web3.eth.sendRawTransaction(rawTx, (err, result) => {
        if (err)
            reject(err);
        resolve(result);
    });
    

    它工作得很好。我尝试通过以下方式向数据变量添加另一个函数调用:

    var data = self.MyContract.MyFunc1.getData(
            param1);
    var data2 = self.MyContract.MyFunc2.getData(
            param2);
    data += data2;
    const options = {
        gasPrice: gasPrice,
        gasLimit: gasLimit,
        nonce,
        data,
        to: addressContract,
    };
    const tx = new Tx(options);
    tx.sign(new Buffer(private_key, 'hex'));
    const rawTx = `0x${tx.serialize().toString('hex')}`;
    self.web3.eth.sendRawTransaction(rawTx, (err, result) => {
        if (err)
            reject(err);
        resolve(result);
    });
    

    此时间事务失败,原因如下(根据etherscan.io info):已还原。

    那么我做错了什么?或者一个事务中可能只有一个合同函数调用?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Adam Kipnis    6 年前

    不可以,您不能在一个事务中从以太坊客户端调用多个非常量函数。但是,您可以启动合同a的事务,然后从同一事务中的第一个合同调用合同B中的函数。