cyhhao / eth-canvas

一个基于以太坊的共享画布游戏 http://t.cn/R3danoq
22 stars 4 forks source link

out of gas #1

Closed cuixiaohui1202 closed 6 years ago

cuixiaohui1202 commented 6 years ago

您好,在吗,有个问题很棘手,您不回答也没关系,因为实在是找不到解决方案,所以向您请教: pragma solidity ^0.4.18;

contract Orders {

// 声明一个复杂类型,用于 function 参数使用 // 代表一个用户的订单信息 struct User { uint uin;// 用户的 ID uint order_id;// 订单的 ID string name;// 用户名 string Address;// 地址 string pay_type;// 支付类型 string pay_status; // 支付状态 uint ctime;// 创建订单的时间,用于后续判断用户是否能修改的时间 string change_status;// 合约生效状态 // 后续可以添加要存储的数据项 }

User[] private userArr; / 写入区块链的函数 权限:普通用户:只可在两天之内写入自己的数据,而且只可以修改状态(合约生效状态) 管理员:随时可以写入数据 / function WriteOrders(uint uin,uint order_id, string name, string Address, string pay_type, string pay_status, uint ctime,string change_status) public { userArr.push(User({ uin: uin, order_id: order_id, name: name, Address: Address, pay_type: pay_type, pay_status: pay_status, ctime: ctime, change_status: change_status })); }

function getOrders(uint index) public view returns (uint, uint, string, string, string, string, uint, string){ if(userArr.length==0){ return (5, 0, "", "", "", "", 0, ""); }else{ User storage result = userArr[index]; return (result.uin, result.order_id, result.name, result.Address, result.pay_type, result.pay_status, result.ctime, result.change_status); } } }

上面是我的合约代码,我是在node中编译合约,并连接:

const express = require('express'); const Web3 = require('web3'); const fs = require('fs');

// 创建express实例 const app = express(); // 设置跨域访问 app.all('', function(req, res, next) { res.header('Access-Control-Allow-Origin', '') res.header('Access-Control-Allow-Headers', 'X-Requested-With, accept, origin, content-type') res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS') res.header('X-Powered-By', ' 3.2.1') res.header('Content-Type', 'application/json;charset=utf-8') next() })

const contractAddress = "0x79670063052b240a2b4bc67fd4cbc72c08b6ddbb";

// 开始写接口 // 例:接口为/client/任意参数, 就爱那个数据插入database的clients.json中 app.post('/writeToEthereum',function(req, res){ //引入web3模块 //初始化 web3 let web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")); //输出初始化结果 console.log('Initialization web3 complete,the first account is '+ web3.eth.accounts[1]); let fs = require('fs'); let code = fs.readFileSync('Orders.sol').toString(); let solc = require('solc'); //编译合约为ABI文件 let compiledCode = solc.compile(code);

console.log(compiledCode) console.log('Compile Orders.sol complete'); //部署合约至区块链节点 let abiDefinition = JSON.parse(compiledCode.contracts[':Orders'].interface); //写入ABI文件至本地文件目录 fs.writeFile('Orders.json',JSON.stringify(abiDefinition), {}, function(err) { console.log('write ABI file [Orders.json] complete . '); });

let VotingContract = web3.eth.contract(abiDefinition); let byteCode = compiledCode.contracts[':Orders'].bytecode; //调用VotingContract对象的new()方法来将投票合约部署到区块链。new()方法参数列表应当与合约的 构造函数要求相一致。对于投票合约而言,new()方法的第一个参数是候选人名单。 console.log(web3.eth.accounts[0]); let deployedContract = VotingContract.new(null,{data: byteCode, from: web3.eth.accounts[0], gas: 4700000}); //输出合约 地址,如果此处没有返回地址,可以在Ganache日志中查看到 console.log(deployedContract); setTimeout(function(){ console.log('deploy complete,deploy address is '+ deployedContract.address); let contractInstance = VotingContract.at(deployedContract.address); // let contractInstance = VotingContract.at('0xb3e2957f9aa802a6287ef067e91d76eada7d6322');

console.log(contractInstance);
//测试合约调用
contractInstance.WriteOrders(2105435120, 1541735128, '大师姐', '北京银河SOHO', 'AliPayWapType', 'ORDER_STATUS_PAYED_SUCCESS', '1524912006', '生效', {from: web3.eth.accounts[0]});
contractInstance.getOrders.call(0);
res.status(200);
res.send(contractInstance.getOrders.call(0));

},1000); });

// 开启服务器 const server = app.listen(3000, function() { var host = server.address().address var port = server.address().port console.log('server is listening at http://%s:%s', host, port) })

然后在控制台执行后,会报 out of gas的错误,这要怎么解决呢?

cyhhao commented 6 years ago

gas 超出限制了 先查一下这次 transaction 实际花费的 gas 是多少,gas limit 是多少。要么是 gas 给的不够,要么是 gas limit 设置的太低了。

gas limit 有可能是 web3的 option 里设置的太低,或者测试网络对单个区块的 gas limit 设置太低。

测试网络你是用的 Ganache 吗?可以在高级设置里把 gas limit 调高试试

cuixiaohui1202 commented 6 years ago

感谢指导!已经编写完智能合约了!