0

如果我猜对了,智能合约没有私钥,所以他们无法签署交易。第一笔交易被签署购买用户,如果一个合约调用另一个合约等等,这些交易也被签署购买用户。那么,如果我们有两个 ERC20 合约 A 和 B 并且 B 持有一些 A 代币怎么办。

contract A{
....
//balance of contract B
balanceOf[0xE4e5a16C8fx207a07f7df98e3a85e2067feacB9w]=500;

function transfer(address _to, uint256 _value) public {
        _transfer(msg.sender, _to, _value);
    }
....
}

contract B{
    //address this=0xE4e5a16C8fx207a07f7df98e3a85e2067feacB9w
}

如果某个用户冒充合约 B 调用合约 A 怎么办?我的意思是他将签署一系列交易,其中最后一个不会来自合同 B,但合同 A 会这样认为。

它看起来像这样:

{
  data: "0xa9059cbb000000000000000000000000cf2ee9c0dccd39aac2fd44b744270f50f8af13b00000000000000000000000000000000000000000000000000000000000000064",
  from: "0xE4e5a16C8fx207a07f7df98e3a85e2067feacB9w ",//address B
  gas: 210000,
  gasPrice: 1,
  nonce: "24",
  to: "0xa6d90569018967c5esc7d056f74eg4hc3j8ae93" //address A
}

如果他这样做了,他就有可能使用合约 A 中的函数 transfer 并传入他自己的地址,从合约 A 中的合约 B 余额中窃取代币。

所以我是对的,这真的有可能还是我在某个地方犯了错误?如果可能的话,在这种情况下,一个合约如何拥有其他合约的代币?

4

2 回答 2

0

是的,合约可以拥有代币。

您指定的交易无效;你不能只选择一个from地址。交易是从外部拥有的帐户 (EOA) 发送的,这意味着具有私钥的帐户。只有拥有该私钥的人才能签署这样的交易。看看这篇博文是否有帮助:https ://programtheblockchain.com/posts/2017/12/29/how-ethereum-transactions-work/ 。

于 2018-03-13T23:21:11.967 回答
0

我想我找到了我的问题的答案。签署消息序列的第一人不能欺骗并替换第二条消息,因为当节点将验证他的行为时,它们都将在其 EVM 上运行该消息序列,并且如果第二条消息无效(即它不是来自合同)状态不会改变。

于 2018-03-15T15:23:42.223 回答