javascript - web3 - 处理事务时出现 VM 异常 : out of gas

标签 javascript mocha.js solidity web3js ganache

我有这个契约(Contract):

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract CampaignFactory {
    address[] public deployedCampaigns;

    function createCampaign(uint minimum) public {
        address newCampaign = address(new Campaign(minimum, msg.sender));
        deployedCampaigns.push(newCampaign);
    }

    function getDeployedCampaigns() public view returns(address[] memory) {
        return deployedCampaigns;
    }
}

contract Campaign {
    struct Request {
        string description;
        uint value;
        address recipient;
        bool complete;
        uint approvalCount;
        mapping(address => bool) approvals;
    }

    Request[] public requests;
    address public manager;
    uint public minimumContribution;
    mapping(address => bool) public approvers;
    uint public approversCount;

    modifier restricted() {
        require(msg.sender == manager);
        _;
    }

    constructor(uint minimum, address creator) {
        manager = creator;
        minimumContribution = minimum;
    }

    function contribute() public payable {
        require(msg.value > minimumContribution);

        approvers[msg.sender] = true;
        approversCount++;
    }

    function createRequest(string calldata description, uint value, address recipient) public restricted {
        Request storage newRequest = requests.push();
        newRequest.description = description;
        newRequest.value = value;
        newRequest.recipient = recipient;
        newRequest.complete = false;
        newRequest.approvalCount = 0;
    }

    function approveRequest(uint index) public {
        Request storage request = requests[index];

        require(approvers[msg.sender]);
        require(!request.approvals[msg.sender]);

        request.approvals[msg.sender] = true;
        request.approvalCount++;
    }

    function finalizeRequest(uint index) public restricted {
        Request storage request = requests[index];

        require(request.approvalCount > (approversCount / 2));
        require(!request.complete);

        payable(request.recipient).transfer(request.value); 
        request.complete = true;
    }
}

并测试:

const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');
const web3 = new Web3(ganache.provider());

const compiledFactory = require('../ethereum/build/CampaignFactory.json');
const compiledCampaign = require('../ethereum/build/Campaign.json');

let accounts;
let factory;
let campaignAddress;
let campaign;

beforeEach(async() => {
    accounts = await web3.eth.getAccounts();

    web3.eth.getBalance(accounts[0]).then(result => console.log(result));

    factory = await new web3.eth.Contract(compiledFactory.abi)
        .deploy({ data: compiledFactory.evm.bytecode.object })
        .send({ from: accounts[0], gas: '1000000' });

    await factory.methods.createCampaign('100').send({
        from: accounts[0],
        gas: '1000000'
    });

    [campaignAddress] = await factory.methods.getDeployedCampaigns().call();
    campaign = await new web3.eth.Contract(
        JSON.parse(compiledCampaign.interface),
        campaignAddress
    );
});

describe('Campaigns', () => {
    it('deploys a factory and a campaign', () => {
        assert.ok(factory.options.address);
        assert.ok(campaign.options.address);
    });
});

当我运行测试时,在处理事务时出现 VM 异常:gas 耗尽,但它记录帐户 [0] 余额为 100000000000000000000。问题发生在工厂被分配了一个新的契约(Contract)实例说没有足够的气体,而显然有。

最佳答案

在你有 .send({ from: accounts[0], gas: '1000000' }) 的地方,你指定最多可以发送 1000000 gas用于处理该交易,无论 from 帐户的余额如何。

如果您要部署足够大的合约,这个数量就会太小。增加此数量应该可以解决问题。

请注意,如果您指定的 gas 数量大于实际使用的数量,将退还差额。

关于javascript - web3 - 处理事务时出现 VM 异常 : out of gas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70664908/

相关文章:

javascript - 使用 jQuery 在 div 中动态输入文本

javascript - 如何向 Mocha 输出报告添加文本

javascript - 终端错误: TypeError: Cannot destructure property 'interface' of 'require(...)' as it is undefined

python - 编译AggregatorV2V3Interface导致TypeError : Interfaces cannot inherit.接口(interface)

blockchain - web3.js 如何搜索曾经创建的所有合约和地址

javascript - 访问 jQuery Datepicker 中的选项

javascript - Vim Javascript 配置以括号结尾的换行符的缩进宽度

javascript - 如何指向 typescript 文件而不是 javascript 文件 karma runner webstorm

javascript - 如何使用 React 和 Redux 测试带有嵌套容器的组件?

javascript - 在每个套件之前而不是在每个测试之前运行 Mocha 设置