首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于transferFrom的循环

用于transferFrom的循环
EN

Ethereum用户
提问于 2020-04-07 11:21:58
回答 1查看 435关注 0票数 0

来自transferFrom合同接口的ERC20方法:

代码语言:javascript
复制
function transferFrom(address _from, address _to, uint _value) public;

我的合同中的transferFrom函数:

代码语言:javascript
复制
function transferFrom(address _from, address _to, uint _value) public returns (bool) {
  token.transferFrom(_from, _to, _value);
  return true;
}

transferFromOneToMany函数与for循环transferFrom函数

代码语言:javascript
复制
function transferFromOneToMany(address _from, address[] memory _receivers, uint[] memory _values) public onlyOwner returns (bool) {
  require(_receivers.length == _values.length && _receivers.length >= 1);
  for (uint j = 0; j < _receivers.length; j++) {
    token.transferFrom(_from, _receivers[j], _values[j]);
  }
  return true;
}

transferFrom函数工作良好,我收到了事务的确认(事件转移)

transferFromOneToMany不太好,我获得了成功,但是事务没有传输事件,例如0x501d19e013defcc6cc1808f75ea0cca575ab8bfb26d96a1869b4671da743e44b

EN

回答 1

Ethereum用户

发布于 2020-04-07 12:33:57

您的代码中至少有两个主要问题可以解释为什么它不能工作,但到现在为止,我确实需要token变量所引用的智能协议的源代码。以下是问题所在:

  1. 忽略token.transferFrom函数返回的值。可能返回的值如果在某些情况下是false,这意味着传输失败。
  2. 您的transferFrom函数没有任何访问控制,这意味着任何人都可以在盗取令牌时调用它。

虽然第二个问题本身不能导致传输失败,但我认为您误解了transferFrom函数是如何工作的。下面是一个场景:

  1. 爱丽丝在你的智能合同上打电话给transferFrom,要求它把一些代币从鲍勃转到卡罗尔。
  2. 您的智能契约调用令牌智能契约,要求它将令牌从Bob转移到Carol。
  3. 对于令牌智能契约,此呼叫与Alice没有任何关系,因为呼叫来自您的智能契约,而不是Alice的地址。
  4. 令牌智能契约确保Bob允许您的智能契约获取Bob的令牌。
  5. 令牌智能契约将令牌从Bob转移到Carol。
  6. 令牌智能契约减少了允许您的智能契约从Bob获取的令牌数量。

我假设在步骤4和6中,应该有Alice而不是您的智能契约,这样整个模式才能正常工作。在当前的实现中,任何人都可以调用智能契约的transferFrom函数,请求将Bob的令牌传输到任意地址,而且,由于Alice的地址从未被验证,这些令牌实际上将被窃取。

因此,在您的情况下,失败的传输可能是由于Bob允许Alice接收他的令牌,而token智能契约检查Bob是否允许您的智能契约接收它们。

好的。我查看了您的事务,您似乎已经向transferFromOneToMany传递了以下值:

代码语言:javascript
复制
_from: 0x18c7abf493c747f39ce006abeb9bd6d2592e833e
_receivers: [
  0xb7a5329bcb48308e3fba671dfe7e0f6477b1f759,
  0xb7a5329bcb48308e3fba671dfe7e0f6477b1f759
]
_values: [949999, 50000]

您的合同地址是0x14a108a349cde4cb9019672f2489b003dc393049。令牌智能协议的地址是0xdAC17F958D2ee523a2206206994597C13D831ec7,您已经从以下地址发送了事务:0x11b202de5b68ea66610b571b028dcca7743b64bc,该地址是智能契约的所有者。

因此,要使您的传输成功,_from地址的所有者应该允许您的智能契约至少接收999999个令牌。然而,_owner: 0x18c7abf493c747f39ce006abeb9bd6d2592e833e_spender: 0x14a108a349cde4cb9019672f2489b003dc393049的实际免税额为零。这就是你的传输失败的原因。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/82228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档