Может ли один контракт владеть токенами другого

Если я правильно понял, у смарт-контрактов нет закрытого ключа, поэтому они не могут подписывать транзакции. Первая транзакция подписывается на покупку пользователя, и если контракт вызывает другой контракт и так далее, эти транзакции также подписываются на покупку пользователя. Итак, что, если у нас есть два контракта 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
}

Если он это сделает, он может, используя передачу функции в контракте А и передавая в нем свой собственный адрес, украсть токены с баланса контракта Б в контракте А.

Так я прав, и это действительно возможно, или я где-то допустил ошибку? И если это возможно, как в этом случае контракт может владеть токенами других контрактов?

2 ответа

Я думаю, что нашел ответ на свой вопрос. Первый человек, который подписывает последовательность сообщений, не может обмануть и заменить второе сообщение, потому что, когда узлы будут проверять его действия, они все будут запускать эту последовательность сообщений на своем EVM, и если второе сообщение недействительно (то есть оно не является исходя из договора) состояние не изменится.

Да, контракты могут иметь токены.

Указанная вами транзакция не будет работать; ты не можешь просто выбрать from адрес. Транзакция отправляется с внешней учетной записи (EOA), то есть с учетной записи, которая имеет закрытый ключ. И только человек с таким закрытым ключом может подписать такую ​​транзакцию. Посмотрите, поможет ли это сообщение в блоге: https://programtheblockchain.com/posts/2017/12/29/how-ethereum-transactions-work/.

Другие вопросы по тегам