【问题标题】:solidity error with addr.transfer(1 ether)addr.transfer(1 ether) 的可靠性错误
【发布时间】:2019-11-29 09:17:50
【问题描述】:

错误信息:

对 Payment.deposit 的交易出错:VM 错误:还原。 revert 事务已恢复到初始状态。 注意:如果您发送值并且您发送的值应该小于您当前的余额,则调用的函数应该是应付的。调试事务以获取更多信息。

contract Payment{ 
address Account2;
address Owner;

constructor() public{
    Account2 = 0x583031D1113aD414F02576BD6afaBfb302140225;
    Owner = msg.sender;
}
function deposit() payable public{
    address(uint160(Account2)).transfer(1 ether);
}

【问题讨论】:

  • 我不想填写 msg.value 来完成交易

标签: ethereum solidity


【解决方案1】:

如果您不想使用 msg.value,那么您的合约必须有足够的余额。 因此,您可以创建一个备用函数,以便首先将足够的以太币存入您的合约,然后您可以调用 deposit() 函数。

添加回退功能后你的合约

pragma solidity ^0.5.1;
contract Payment{ 
    address Account2;
    address Owner;

    constructor() public{
        Account2 = 0x583031D1113aD414F02576BD6afaBfb302140225;
        Owner = msg.sender;
    }

    function () payable external{}
    function deposit() payable public{
        address(uint160(Account2)).transfer(1 ether);
    }

    function getContractBalance() public view returns(uint) {
        return address(this).balance;
    }
}

【讨论】:

  • remix 以每个账户 100ether 开始,足够交付
  • 这可能是因为您使用的是 Javasctript VM 环境。而且这是用户帐户的余额,而不是合同的余额。所以你必须通过放置价值和调用后备函数来发送一些 100ether 来合约。
  • 我已经更新了我的答案并添加了一个检查合约余额的函数,该函数以 wei(1ether = 10^18 Wei) 为单位返回值。因此,您的存款功能仅在余额大于或等于 1 个以太币时才有效
  • 我现在知道了,账户余额!=合约余额。还有一个问题,同样的情况下,为什么 msg.value 能成功?
  • msg.value 用于从用户账户向合约发送以太币,所以当你使用 msg.value 时,余额会从你的 100ethers(用户账户)中扣除并发送到合约地址,之后发送到合约地址转移到定义的 Account2 地址
【解决方案2】:

它在我的混音虚拟机上正常工作。

所以请确保:

  1. 合约余额大于1以太

  2. 如果Account2是一个合约的地址,那么它需要有一个回退函数来接收以太币

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2012-11-18
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多