一份合约能否拥有另一份合约的代币

Posted

技术标签:

【中文标题】一份合约能否拥有另一份合约的代币【英文标题】:Can one contract own tokens of another one 【发布时间】:2018-08-22 07:30:53 【问题描述】:

如果我猜对了,智能合约没有私钥,所以它们无法签署交易。第一笔交易被签署购买用户,如果一个合约调用另一个合约等等,这些交易也被签署购买用户。那么,如果我们有两个 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 余额中窃取代币。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

是的,当然,第一个发送交易的人(比如 Bob)会签署它。例如他可以在合约B中执行一些功能,在这个合约B将在合约A中执行功能转移。但是合约B没有签署交易,所以合约A收到一个msg.sender=合约B的交易,由Bob签署.那么为什么 Bob 不能在不与合约 B 交互的情况下向合约 A 发送已签名的交易,并在“发件人”字段中填写合约 B 的地址呢? “为什么 Bob 不能...”因为它不能那样工作。 Bob 发送的任何交易都是“来自”Bob,这意味着 msg.sender 是 Bob。 好的,你能解释一下为什么它不能这样工作吗?在以太坊网络中,所有参与者都通过消息进行通信。 ..... ... 消息只是一个 json 结构,由人签名。该消息被广播到网络上的所有其他节点。因此,您可以自己购买(不使用 geth 或 MyEherWallet)形成此消息,签名并广播。因此,如果无法签署消息,请购买合同,为什么您不能只在要写入的位置形成消息,首先您在合同上执行某些功能,然后该合同在另一个合同上执行功能(只写它,而不是真的这样做),签名并广播到网络? 以太坊交易的基本安全性在于它们是来自签署消息的账户。如果改变了,什么会阻止我发送交易将你所有的以太币转移给我?

以上是关于一份合约能否拥有另一份合约的代币的主要内容,如果未能解决你的问题,请参考以下文章

代币(ETH)空投工具

使用智能合约存取erc20代币

我可以将我的自定义 ERC-20 与我的智能合约一起使用吗?

PancakeSwap 合约 / 用另一个代币交换代币

在持有者之间划分合约价值(实际上是代币合约)

如何将 ERC20 代币发送到智能合约余额?