账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    solidity开发sendTransaction报错
    • 2020-01-01 00:00
    • 11
    54
    0

    问题描述

    使用ganache 和 truffle开发,用到的了openzeppelin这个库,使用到了ERC20和Crowdsale这两个合约,测试的时候,调用下面语句报错,其中purchaser是ganache生成的账号数组。

    MyCrowdsaleInstance.sendTransaction({ from: purchaser[1], value: web3.utils.toWei("0.5", "ether"), gas: "220000"})

    报错信息如下

    Error: Returned error: VM Exception while processing transaction: revert
        at XMLHttpRequest._onHttpResponseEnd (C:\Users\zx\AppData\Roaming\nvm\v10.15.1\node_modules\truffle\build\webpack:\~\xhr2-cookies\dist\xml-http-request.js:318:1)
        at XMLHttpRequest._setReadyState (C:\Users\zx\AppData\Roaming\nvm\v10.15.1\node_modules\truffle\build\webpack:\~\xhr2-cookies\dist\xml-http-request.js:208:1)
        at XMLHttpRequestEventTarget.dispatchEvent (C:\Users\zx\AppData\Roaming\nvm\v10.15.1\node_modules\truffle\build\webpack:\~\xhr2-cookies\dist\xml-http-request-event-target.js:34:1)
        at XMLHttpRequest.request.onreadystatechange (C:\Users\zx\AppData\Roaming\nvm\v10.15.1\node_modules\truffle\build\webpack:\~\web3\~\web3-providers-http\src\index.js:96:1)
        at C:\Users\zx\AppData\Roaming\nvm\v10.15.1\node_modules\truffle\build\webpack:\packages\truffle-provider\wrapper.js:112:1
        at C:\Users\zx\AppData\Roaming\nvm\v10.15.1\node_modules\truffle\build\webpack:\~\web3-eth\~\web3-core-requestmanager\src\index.js:140:1
        at Object.ErrorResponse (C:\Users\zx\AppData\Roaming\nvm\v10.15.1\node_modules\truffle\build\webpack:\~\web3-eth\~\web3-core-helpers\src\errors.js:29:1)

    版本信息:
    openzeppelin-solidity: "^2.1.3"
    Truffle v5.0.17 (core: 5.0.16)
    Solidity v0.5.0 (solc-js)
    Node v10.15.1
    Web3.js v1.0.0-beta.37

    相关代码

    // MyToken.sol

    pragma solidity ^0.5.0;
    
    import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
    import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
    
    contract MyToken is ERC20, ERC20Detailed {
      uint public INITIAL_SUPPLY = 10000000000;
    
      constructor(string memory _name, string memory _symbol, uint8 _decimals)
        ERC20Detailed(_name, _symbol, _decimals)
        public
      {
          _mint(msg.sender, INITIAL_SUPPLY);
      }
    
    }

    // MyCrowdsale.sol

    pragma solidity ^0.5.0;
    
    import './MyToken.sol';
    import "openzeppelin-solidity/contracts/crowdsale/Crowdsale.sol";
    
    contract MyCrowdsale is Crowdsale {
      constructor(
          uint256 rate,    // rate in TKNbits
          address payable wallet,
          MyToken token
      )
          Crowdsale(rate, wallet, token)
          public
      {
    
      }
    
    }

    // 2_deploy_token.js

    const MyToken = artifacts.require("MyToken");
    const MyCrowdsale = artifacts.require("MyCrowdsale");
    
    module.exports = function(deployer, network, accounts) {
      const _name = "My Token";
      const _symbol = "MTK";
      const _decimals = 2;
    
      const rate = 1;
      const wallet = accounts[0];
      return deployer.then(() => {
        return deployer.deploy(MyToken, _name, _symbol, _decimals);
      }).then(() => {
        return deployer.deploy(
          MyCrowdsale,
          rate,
          wallet,
          MyToken.address
        );
      })
    };
    
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 無人相依偎 普通会员 1楼
      在Solidity开发中,`sendTransaction`方法报错通常与以下几种情况有关: 1. **余额不足**:当你尝试从一个账户向另一个账户(包括智能合约)转账时,如果发送方的以太坊余额不足以支付交易费用(gas fee)和转账金额,就会抛出类似"Out of Gas"或"Insufficient funds"的错误。 2. **Gas Limit设置不当**:在调用`sendTransaction`时需要设定gas limit。如果gas limit设置得太低,不足以执行交易中的所有操作,也会导致交易失败并回滚,抛出"Out of Gas"错误。 3. **智能合约函数问题**:如果你是在调用智能合约的某个函数,并且该函数内部存在错误(如无限循环、递归调用过深等),也可能导致交易执行过程中耗尽所有分配的gas,从而报错。 4. **编码错误**:例如在Solidity代码中,直接使用`address.transfer()`或者`address.send()`进行转账并且没有捕获异常,当转账失败时(如接收方地址不可用或余额不足), Solidity函数会停止执行,并且不会抛出异常,但交易状态会标记为失败。 5. **ABI不匹配**:如果你编译的合约ABI与实际部署的合约ABI不匹配,那么在通过web3.js等库调用智能合约函数时,可能会因为参数解析错误而无法成功发送交易。 遇到这类问题时,你需要根据具体的错误信息和上下文进行排查,确保账户有足够的余额,合理设置gas limit,检查并修复智能合约代码中的潜在问题,并确保使用的ABI是准确无误的。
    更多回答
    扫一扫访问手机版