ethereum - 为什么我的合约中的address.transfer()函数只能发送1ether?
问题描述
为什么address.transfer()
我的合约中只能发送 1ether 的功能?当值大于 1 ether 或小于 1 ether 时会报错。
我的代码:
pragma solidity ^0.4.24;
contract Lottery{
uint public winn;
//抽奖者
struct lottery{
uint money; //奖金
address name; //名字(地址)
}
//庄家地址
address private bankerAddress = 0x8b3234612c7D3b805F4c9CF1Aa55Cc47B82A0769;
//得奖者数量
uint32 public count;
//得奖者集合
lottery public l;
//初始化
constructor()public {
count=0;
}
event getRandom (
uint indexed _win);
//开始抽奖的函数,返回奖金
function start() public payable{
//随机数生成
uint win= uint(keccak256(now, msg.sender, now)) % 100;
win = win % 12 +1;
winn = win;
l.money = winn;
l.name = msg.sender;
//发奖金操作
msg.sender.transfer(winn*10000000000000000);
//监听事件
getRandom(winn);
}
function () public payable{}
}
下面是javascript代码:
lotteryInstance.start.sendTransaction({
from: '0x8b3234612c7D3b805F4c9CF1Aa55Cc47B82A0769',
value: 10000000000000000,
gas: 210000,
gasPrice: web3.toWei('1000', 'gwei')
});
和错误信息:
MetaMask - RPC Error: Error: Error: [ethjs-rpc] rpc error with payload {"id":7309825988666,"jsonrpc":"2.0","params":["0xf8721f85e8d4a510008303345094bcd5d351e5850774d1f720328dac1c8732d68eb7872386f26fc1000084be9a6555822d45a0a07b903c493ba6dee96a54bc74344d1c668cd3d9e8a7c757fdc5daa664ff4271a01bb6799a02054ecf1c8c5be51d6748b2c086eb330091b2e0500d43e756666f69"],"method":"eth_sendRawTransaction"错误:处理事务时出现 VM 异常:还原
Uncaught (in promise) Error: Error: Error: [ethjs-rpc] rpc error with payload {"id":7309825988666,"jsonrpc":"2.0","params":["0xf8721f85e8d4a510008303345094bcd5d351e5850774d1f720328dac1c8732d68eb7872386f26fc1000084be9a6555822d45a0a07b903c493ba6dee96a54bc74344d1c668cd3d9e8a7c757fdc5daa664ff4271a01bb6799a02054ecf1c8c5be51d6748b2c086eb330091b2e0500d43e756666f69"],"method":" eth_sendRawTransaction"} 错误:处理事务时出现 VM 异常:还原
解决方案
在下面的 JS 代码中:
lotteryInstance.start.sendTransaction({
from: '0x8b3234612c7D3b805F4c9CF1Aa55Cc47B82A0769',
value: 10000000000000000, // Here is the amount of ETH you give to start fuction
gas: 210000,
gasPrice: web3.toWei('1000', 'gwei')
});
tx 失败可能是因为你给了(ETH)一个你可能没有的金额!你有value: 10000000000000000
很多以太币吗?
如果不是,则传递您拥有的一些金额,因为您没有对合同中的金额给出任何条件,您可以给出尽可能小的金额。
PS:你的合约收到的 ETH 没有存储在任何地方,这可能会导致 ETH 的丢失。
推荐阅读
- python - drawEllipse 在 GUI 上不显示任何内容
- r - 使用 grep 查找部分匹配项
- flutter - FractionallySizedCircle?飘飘然
- javascript - push 方法将数组转换为组件状态下的数字
- javascript - firestore transaction.set(ref, data, {merge: true}) 和 transaction.update(ref, data) 有什么区别?
- python - 实时颜色检测及其功能
- algorithm - 计算给定数字序列最多可以拆分为 K 的方式的数量
- python - 是否有一种非阻塞方式来检查 asyncio 子进程是否处于活动状态?
- excel - Excel 宏为不同的值创建图表
- matlab - 在 Webots R2020a 修订版 1 中使用 MATLAB(R2019b) 控制器的问题