迁移合约时耗尽 Gas

2024-01-02

我看过其他“没油了”的帖子,但他们没有解决我的问题。 我正在使用 ganache-cli 开始

ganache-cli  --account="0xce2ddf7d4509856c2b7256d002c004db6e34eeb19b37cee04f7b493d2b89306d, 2000000000000000000000000000000"

然后我执行

truffle migrate --reset

返回错误

Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: VM Exception while processing transaction: out of gas

(完整错误在最后) 这些是涉及的文件;

松露.js

module.exports = {
   networks: {
   development: {
   host: "localhost",
   port: 8545,
   network_id: "*",
   gas: 470000
  }
 }
};

1_initial_migration.js

var Migrations = artifacts.require("./Migrations.sol");

module.exports = function(deployer) {
  deployer.deploy(Migrations,  {gas: 4500000});
};

2_deploy_contracts.js

var Voting = artifacts.require("./Voting.sol");

module.exports = function(deployer){
    deployer.deploy(Voting, ['Rama', 'Nick', 'Jose'], {gas: 290000});

}

投票.sol

pragma solidity ^0.4.18;

contract Voting {

  mapping (bytes32 => uint8) public votesReceived;
  bytes32[] public candidateList;

  function Voting(bytes32[] candidateNames) public {
    candidateList = candidateNames;
  }

  function totalVotesFor(bytes32 candidate) view public returns (uint8) {
    require(validCandidate(candidate));
    return votesReceived[candidate];
  }

  function voteForCandidate(bytes32 candidate) public {
    require(validCandidate(candidate));
    votesReceived[candidate]  += 1;
  }

  function validCandidate(bytes32 candidate) view public returns (bool) {
    for(uint i = 0; i < candidateList.length; i++) {
      if (candidateList[i] == candidate) {
        return true;
      }
    }
    return false;
   }
}

完全错误

Replacing Migrations...
... 0xaf3b7d40ac17f297a4970b75e1cc55659e86dea3ba7bcf13dd9f82e2b6cf0086
Migrations: 0x1ea6ea9d7528a8ac4b378ae799d2c38fe006b9b6
Saving successful migration to network...
... 0xa8400e873da3cb15719c2c31804ec558e73aa9bfa91c4dc48e922c0ed0db736f
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying Voting...
... 0x72947eda435cf854abeeeb5483c9625efad45b664f3bcc7c2085f8aabdbb1076
Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: VM Exception while processing transaction: out of gas
at Object.InvalidResponse (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3\lib\web3\errors.js:38:1)
at C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3\lib\web3\requestmanager.js:86:1
at C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\truffle-migrate\index.js:225:1
at C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\truffle-provider\wrapper.js:134:1
at XMLHttpRequest.request.onreadystatechange (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3\lib\web3\httpprovider.js:128:1)
at XMLHttpRequestEventTarget.dispatchEvent (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:64:1)
at XMLHttpRequest._setReadyState (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:354:1)
at XMLHttpRequest._onHttpResponseEnd (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:509:1)
at IncomingMessage.<anonymous> (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:469:1)
at emitNone (events.js:91:20)

错误信息是正确的。您没有发送足够的天然气来创建合约。

当您部署合约时,部署的 3 个不同阶段会消耗 Gas:

  • 内在气体:这是任何交易中使用的基准量。对于所有交易,初始成本为 21,000 Gas。对于合同创建,还有额外的 32,000 个。因此,在实际进行部署之前,您已经需要 53,000 个 Gas。
  • 构造函数执行:这是用于构造函数执行的操作码的气体。我在 Rinkeby 上部署了这个合约,您可以看到构造函数执行的所有操作码及其成本,here https://rinkeby.etherscan.io/vmtrace?txhash=0xdd599189cf55e5be4d32c808230c49edd53c43e9c263cc1dde1b8860d817aefe。这部分消耗了 81,040 天然气。
  • 合约代码存储:最后,您需要支付存储合约代码的成本。如果您查看气体估算工具,这被称为“代码存款”。每字节花费 200 Gasruntime存储合约代码。要获取合约代码的大小,请运行solc --optimize Voting.sol --bin-runtime -o .并查看生成的文件的大小。您的合约为 1116 字节(我使用的是 solc 版本 0.4.19,因此您在 0.18 上的大小可能略有不同),这会消耗 223,200 个 Gas。

总共,这需要 357,240 个 Gas,所以你的 290,000 个限制太低了(在 Rinkeby 上运行的实际合约消耗了 351,640 个 Gas。同样,我相信这个小差异是由于编译器版本输出的细微差异造成的。我不是 100 % 确信这一点,但差异足够小——实际上是 28 字节的合约代码——我没有更深入地挖掘根本原因)。

有一篇很棒的文章黑客午间 https://hackernoon.com/costs-of-a-real-world-ethereum-contract-2033511b3214并通过示例详细介绍了每个计算。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迁移合约时耗尽 Gas 的相关文章

随机推荐

  • 局部变量的 MAXRECURSION 值

    我正在 SQL Server 2005 中编写一个存储过程 它声明一个名为 CTE 公用表表达式 foo foo递归地调用自身 但当 SP 的参数之一 bar 一片空白 为了停止这个无限循环 我一直在尝试使用该选项MAXRECURSION
  • 使用 JavaScript 从 Dropbox 下载文件

    I have 我有一个网站正在尝试向客户提供一项服务 以便能够从 Dropbox 下载文件 为了简化开发 我使用Dropbox 选择器 https www dropbox com developers chooser 为此 我启用了我希望从
  • 如何添加元组

    我有这样的伪代码 if b lt a return 1 0 foo a b b 我想用Python写它 但是Python可以添加元组吗 编写类似代码的最佳方法是什么 我会去 gt gt gt map sum zip 1 2 3 4 4 6
  • Clojure / Incanter 中的快速矢量数学

    我目前正在研究 Clojure 和 Incanter 作为 R 的替代品 并不是说我不喜欢 R 而是尝试新语言很有趣 我喜欢 Incanter 并且发现语法很有吸引力 但相比之下 矢量化操作相当慢例如到 R 或 Python 作为一个例子
  • 适合7岁孩子的环境[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • OpenCV 尝试使用 RELEASE 构建读取视频时崩溃

    Using VideoCapture vcc someDir someFile avi 作为我的代码 OpenCV 2 x Win7 VS2010 中的第一行 RELEASE 的执行崩溃了 但 DEBUG 工作正常 尽管慢如预期 仅当尝试读
  • 如何在 C# 中使用多个变量来锁定作用域

    我遇到的情况是 只有两个储物柜对象空闲时才应执行代码块 我希望会有类似的东西 lock a b this scope is in critical region 然而 似乎并没有这样的事情 那么这是否意味着做到这一点的唯一方法是 lock
  • MySQL 排列现有表列

    如何更改某个现有列的位置MySQL table 例如 我想移动该列username从其当前位置改为位于所有列之后 或者我希望它位于表中任何特定列之前 如果您愿意 可以更改列的顺序 如果您的用户名列是 varchar 255 那么 alter
  • Jenkins 作业终止后清理孤立的 docker 容器

    我在一个大型组织工作 该组织在共享 Jenkins 集群中运行数百个作业 我的 Jenkins 工作需要针对 Docker 容器内运行的不受信任的代码运行集成测试 我担心当我的 Jenkins 工作突然终止 例如工作中止或超时 时 我将留下
  • 为什么会话变量为空以导航下一页?

    我一直在工作一个网站 我已经处理了一段时间的问题 现在我知道为什么会发生这种情况 但不知道如何解决它 请帮忙 第 1 页 在第一页登录页面设置 SESSION user id 存储在数据库用户 ID 中获取的值 在同一页面中可以打印会话并且
  • 使用“location.href”取消页面卸载时出现“未知异常”

    我使用以下代码捕获 window onbeforeunload 事件 window onbeforeunload function evt if checkIsDirty var message If you continue your c
  • 通过单击按钮增加条形图值

    我正在尝试创建一个图表来显示锻炼的进度 每点击五个按钮就应在图表中添加一个勾号 这是其外观的示例 出于演示目的 我使用按钮单击 在生产中 轮子每转二十圈就会单击一次 private int counter 0 private void bu
  • Java中ArrayList的问题

    我在正确添加 ArrayList 时遇到问题 当我在 for 循环完成后打印 ArrayList 时 ArrayList 的长度是正确的 但每个元素都是相同的 创建的最后一个坐标 有人可以修复 并解释 下面的代码吗 public class
  • Python 中连续数据的箱线图

    我有一个包含 2 列的 csv 文件 col1 Timestamp数据 yyyy mm dd hh mm ss ms 8 个月数据 col2 热量数据 连续变量 由于有近 50k 记录 我想将 col1 timestamp col 划分为数
  • 如何从使用 writeToFile 创建的文件加载 NSDictionary?

    我有一个 NSMutableDictionary 我使用它编写的 stuff writeToFile TEST atomically YES 日后如何找回 另外 如果我决定用 4S 替换 iPhone 4 会发生什么情况 我的书面数据可以转
  • 用于监控/调整 memcached 运行状况的有用提示/工具有哪些?

    昨天 我发现了这个很酷的脚本 内存缓存顶部 https code google com p memcache top 它很好地打印出 memcached 的实时统计信息 看起来像 memcache top v0 6 default port
  • 将派生类强制转换为基类

    这里发生什么类型的演员表 在B get class A public A a 0 int a class B public A public A get return this is this C style cast int main B
  • 使用不透明类型(Char 和 Long)

    我正在尝试导出算法的 Scala 实现以在 JavaScript 中使用 我在用着 JSExport 该算法适用于 ScalaChar and Long值被标记为opaque in the 互操作性指南 http www scala js
  • 我如何在 xcode 中获取数组?

    如何获取字典的值而不是循环 我知道如何使用以下方法获取单个值 NSString valueStr dict objectForKey Key2 我需要通过循环所有键来获取 我需要在字典中搜索一个值 因为看起来您正在尝试使用NS词典 http
  • 迁移合约时耗尽 Gas

    我看过其他 没油了 的帖子 但他们没有解决我的问题 我正在使用 ganache cli 开始 ganache cli account 0xce2ddf7d4509856c2b7256d002c004db6e34eeb19b37cee04f7