在学习区块链时,我们按照某些文章的教程,使用 Browser-solidity 在 Go-Ethereum上进行智能合约部署时,可能会出现Error: exceeds block gas limit undefined的报错信息,表示当前合约所需的gas超过了区块的最大gas。这可能是由于创世区块的配置文件genesis.json中的参数gasLimit设置过小有关,以下是可能的解决办法。

查询原因

这些文章中提供的创世区块配置文件genesis.json中的参数gasLimit的值为0x2fefd8,这是一个16进制的数字,转换为十进制为3141592。进制在线转换工具。

我们使用此配置初始化,然后输入miner.start()挖矿,等待一段时间后输入miner.stop()停止挖矿。

先查看区块数:

> eth.blockNumber
132

随便查看一个区块的信息:

> eth.getBlock(132)
{difficulty: 138787,extraData: "0xd783010801846765746886676f312e31308664617277696e",gasLimit: 3573388,gasUsed: 0,hash: "0x6f7d84c21967eafe67f13f6d7abc2143ddee006e93999c890990aad63e9a4fc5",logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",miner: "0xf2e4cf8222e79b579543a5708ff0dfd1e6e37cfe",mixHash: "0x76d1f5e34735baa2491664025fadaa8376780df3e67125eff281736a27d57e8f",nonce: "0x090925fd3caf31cd",number: 132,parentHash: "0x92462eaf6fbbd80445724d5fde82794e3c0af56d348b2edfb7ce1e46ecefae39",receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",size: 536,stateRoot: "0xfa9ea92f0ad0545079e4f0bed40a08632a24c2693ac57b6b2242ae122b6356b0",timestamp: 1519481595,totalDifficulty: 17930276,transactions: [],transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",uncles: []
}

可以看到此区块的gasLimit为3573388

然后再通过Browser-solidity编写智能合约,然后编译生成web3代码:

var testcontractContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"add","outputs":[{"name":"b","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]);
var testcontract = testcontractContract.new({from: web3.eth.accounts[0], data: '0x6060604052341561000f57600080fd5b60b68061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631003e2d2146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b600080606483019050809150509190505600a165627a7a723058208f5727572e0f6113593417a5211692c99ed69158e62764f4e3f76c0c5846afc30029', gas: '4700000'}, function (e, contract){console.log(e, contract);if (typeof contract.address !== 'undefined') {console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);}})

可以看到此合约所需的gas为4700000,已经比区块的gasLimit还高,部署时当然会失败。这可能由于之前通过Browser-solidity编译出来的gas普遍只有几十万,而现在已经需要几百万的gas。

解决办法

将创世区块的配置文件genesis.json中的参数gasLimit设置为0xffffffff(十进制值为4294967295)。重新初始化,生成区块,查看区块信息。

> eth.blockNumber
20
> eth.getBlock(20)
{difficulty: 132288,extraData: "0xd783010801846765746886676f312e31308664617277696e",gasLimit: 4211854946,gasUsed: 0,hash: "0x98a230aa2d7aaee1b92732488aff3571d9569b44ee2c52bd2a47cc115649ba1d",logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",miner: "0xb6cd75af6594f46374378cf3a7d9cbfc06485994",mixHash: "0xef93a1be29bbabcf7e6a9d2031b2b76b224547c77aa4f5a6d5edaa1ed538e428",nonce: "0x756c86cc86699021",number: 20,parentHash: "0x62dacb00b038677688e70da047f5074038caa8ac16d161118a06b8a053789bda",receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",size: 536,stateRoot: "0xc74d4094304b408ac107955a721c1a45393687672cf1ab40761c1bf37cc5efff",timestamp: 1519531846,totalDifficulty: 2764672,transactions: [],transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",uncles: []
}

可以看到此区块的gasLimit为4211854946。这时再部署就不会报错了。

遗留问题

我在网上搜索解决方法时,有看到类似的问题A problem about gas limit #3760,解答者表示可以使用–targetgaslimit这个指令来修改区块的gas limit,不过我试了很久一直提示指令错误,也没有搜索到这个指令应该怎么用,我是这样用的:

> eth.blockNumber
132
> --target 132 gaslimit 8888888
(anonymous): Line 1:10 Unexpected number (and 1 more errors)

提示错误。应该使用–targetgaslimit value就可以设置最低gas限制。value传gas最低值,默认4712388。

原文转载自:https://www.jianshu.com/p/f030338a0c31

另外推荐几个很受欢迎全网稀缺的互动教程:

  • python以太坊,主要是针对python围绕web3.py进行区块链以太坊应用开发的讲解。
  • web3j,主要是针对java和android程序员围绕web3j库进行区块链以太坊开发的讲解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。
  • 以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • 以太坊教程,主要介绍智能合约与dapp应用开发,适合入门。

智能合约部署Error: exceeds block gas limit undefined相关推荐

  1. 三:将智能合约部署到ganache测试网

    三:将智能合约部署到ganache测试网 文章目录 三:将智能合约部署到ganache测试网 实验目的 实验原理 开始条件 实验过程 实验步骤 相关官方知识库 下一章内容: 实验目的 掌握将智能合约部 ...

  2. HyperLedger超级账本智能合约部署问题

    HyperLedger超级账本智能合约部署问题 报错:Error: could not assemble transaction: ProposalResponsePayloads do not ma ...

  3. 将智能合约部署到Rinkeby测试链上

    引言 在上一篇文章中<快速上手第一个智能合约中>,我们介绍了如何编写与运行我们的第一个智能合约.但那只是将合约运行在了浏览器的区块链虚拟环境中,与区块链还是有一定的区别,另外也无法被其它人 ...

  4. 超级账本Fabric2.x 如何将智能合约部署到通道

    如何将智能合约部署到通道--部署Fabric测试网络的实例 使用系统版本:Ubuntu 18.04 提示:任何命令错误都可以试试加sudo提升权限!!! 参考文章:官方文档 一.启动网络 1.1 进入 ...

  5. EOS智能合约开发(四)EOS智能合约部署及调试(附编程示例)

    EOS的智能合约里面有一个action(动作)和transaction(交易)的概念. 对于我们开发以太坊开发者来说,基本上只有transaction的概念.如果我只要执行一种操作,而且是只读操作,就 ...

  6. 以太坊笔记 使用 Browser-solidity 在 Go-Ethereum1.7.2 上进行简单的智能合约部署

    转载自:https://mshk.top/2017/11/browser-solidity-go-ethereum-1-7-2/ 目录 Contents [hide] 目录 1.基本概念 1.1.什么 ...

  7. CTF中智能合约部署交互基础

    0x01 前言 Solidity在以太坊中是编写智能合约最受欢迎的语言,一般的CTF竞赛中的智能合约方向的题目都是以solidity语言编写的智能合约. 为什么写这一篇文章,主要是因为在接触智能合约类 ...

  8. 【区块链技术开发】剖析区块链Ganache模拟器工具及其智能合约部署区块链的查询方式

    专栏:[区块链技术开发] 前期文章: [区块链技术开发]基于Web3.js以太坊网络上的智能合约的交互及其应用 [区块链技术开发]OpenZeppelin智能合约库:提高智能合约的安全性和可靠性,加速 ...

  9. 区块链100讲:EOS环境安装和智能合约部署实战

    2019独角兽企业重金招聘Python工程师标准>>> 1 硬件配置 操作系统要求 1.Amazon 2017.09 and higher 2.Centos 7 3.Fedora 2 ...

最新文章

  1. Java通过JDBC连接MySQL数据库
  2. DeepDive-信息抽取工具安装教程
  3. 在Ubuntu下编译安装atom编辑器
  4. python字符串操作符结果没显示_Python字符串格式化 (%操作符)
  5. Linux学习之系统编程篇:fifo
  6. 「Anaconda」取消终端命令行自动加载的conda(base)虚拟环境
  7. 用zookeeper来实现分布式锁
  8. .NET CORE 2.1 导出excel文件的两种方法
  9. 部门质量管理工作模板
  10. 【新书推荐】Silverlight 4教程书籍推荐
  11. itertools编程训练
  12. 我为什么要弃医从(码)农
  13. R安装并行计算工具包snowfall实现并行运算资源
  14. 数加加众包实习生招募进行中
  15. 操作系统——磁盘操作
  16. PX4模块设计之四十四: bmp280模块
  17. 实例:用C#.NET手把手教你做微信公众号开发(21)--使用微信支付线上收款:H5方式
  18. fis2 入门--fis3使用
  19. JS调整视频倍速和视频跳转
  20. 对勾函数与双曲线的关系

热门文章

  1. Linux 的体系结构结构
  2. telnet远程管理及AAA认证方式
  3. Python语言零基础入门教程(一)
  4. 【渝粤题库】陕西师范大学201421 公司法作业
  5. 关于MyBatis的分页
  6. 微软开源的浏览器自动化工具-Playwright
  7. 用Python写中文数字对照表
  8. 本地Git下载安装以及创建版本库、远程Github
  9. TLE8242-2L的开关/比例电磁阀驱动电路
  10. k3s开启traefik的dashboard网页