【问题标题】:Can't withdraw amount from contract on Ethereum local blockchain无法从以太坊本地区块链上的合约中提取金额
【发布时间】:2018-07-02 21:19:48
【问题描述】:

我遇到了一个困扰我好几天的问题。这一切都归结为:

我将 Ganache (TestRPC) 用于我的本地区块链及其默认测试帐户。 我使用第一个测试帐户连接了 Metamask(在 Chrome 上)。 (余额 100ETH)。

我正在从solidity 文档创建WithdrawalContract: http://solidity.readthedocs.io/en/develop/common-patterns.html 使用 10ETH。 直到现在一切都很好。合约创建成功,我的测试账户余额为 90ETH,合约在交易列表中显示为 10ETH。

现在我执行 withdraw() 应该退还我 10ETH 的金额。

Metamask 将交易显示为成功。

但是这笔款项永远不会进入我的测试帐户。账户余额仍为 90ETH。

我错过了什么?为什么提款对我不起作用?

PS:我使用remix.ethereum.org 完成所有这些操作,使用同一个帐户创建和提取合同。我也用truffle 尝试过,但我得到了相同的结果。

【问题讨论】:

  • 你能发布你在合同中采取的步骤吗?我刚试了一下,效果很好。
  • 我用我从头开始的所有步骤录制了视频。所有应用都使用默认设置:youtu.be/dD2fkPxpk_E

标签: blockchain ethereum solidity contract ether


【解决方案1】:

我看了你评论中的视频。这只是 Solidity 网站上的一个简单示例合约,写得不是很好。您必须更加关注代码。 withdraw() 使用 pendingWithdrawals 映射来确定允许调用者从合约中转出多少。只有becomeRichest() 方法正在设置该映射。构造函数不是。

在不发送任何以太币的情况下部署合约。然后拨打becomeRichest(),这次发送以太币。然后使用withdraw(或者,改进代码)。

【讨论】:

  • 是的,你是对的。我将代码更改为在constructor 中也将msg.sendermsg.value 添加到pendingWithdrawals,它似乎工作正常。再次删除和安装 Metamask 也修复了我得到的一些无效地址错误。最后,在 remix 中你可以使用不需要 Metamask 的 Javascript VM,更容易调试合约。
【解决方案2】:

你可以试试使用 transfer() 看看

代码看起来像这样

msg.sender.transfer(web3.utils.toWei('10', 'ether'));

msg.sender => 在那个时间点与合约交互的地址,以及在该地址上调用 transfer() 时需要接收资金的地址(在这种情况下是你)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 2017-06-24
    • 2017-08-07
    • 2016-02-28
    • 2018-09-10
    • 1970-01-01
    • 2019-12-09
    • 2022-07-19
    相关资源
    最近更新 更多