Укажите отправителя между контрактными вызовами
Возможно ли при вызове контракта из другого указать отправителя?
Что-то вроде API, выставленного web3.
function sendTokensToContract() {
//Send tokens from this contract to this contract (?!)
token.transfer(this, amount);
//Send tokens from sender to this contract
token.transfer(this, assetPrice, {sender: msg.sender});
}
Спасибо.
1 ответ
Нет, но да.
Нет, потому что контракт не может отправлять что-либо из ничего, кроме самого себя. Нет возможности {из: account}. Сделки являются «из» контракта. Без исключений.
Да, поскольку if токен-контракт отвечает за ведение бухгалтерской книги для токенов или что-то еще, что она отслеживает, тогда просто нужно выполнить некоторые внутренние операции бухгалтерии.
Просто упрощенный пример с иллюстрациями о функциональности, необходимой в token.transfer. Будьте действительно осторожны, чтобы убедиться, что вы не открыли его пользователям, которые тратят токены из любой старой учетной записи. Это будет хаос:
function sendTokensFromAnywhere(address sender, address receiver, uint amount)
onlyAuthorized // needs definition, or look at 2nd example
returns(bool success)
{
token.transfer(sender, receiver, amount);
return true;
}
contract Token {
modifier onlyOwner() {
// owner is trusted, but no one else
if(msg.sender != owner) throw;
_;
}
function Token() {
// assume deployment originates from the "owner"
owner = msg.sender;
// owner will be the only contract authorized to use transfer()
}
...
function transfer(address sender, address receiver, uint amount)
onlyOwner // sender is obviously dangerous, so control who can call this
returns (bool success)
{
if(balances[sender] < amount) throw;
balances[sender] -= amount;
balances[receiver] += amount;
return true;
}
На практике функции, открытые для общественности, должны, вероятно, гарантировать, что пользователи могут переходить только из своих собственных учетных записей:
function sendTokensFromAnywhere(address receiver, uint amount)
public
returns(bool success)
{
token.transfer(msg.sender, receiver, amount); // only own tokens
return true;
}
Объект, вызывающий функцию, может передавать только () из своих собственных активов, поэтому мы можем удалить onlyAuthorized, а не определять его.
С небольшой дополнительной осторожностью (хотя ничто в token.transfer в настоящее время не возвращает false):
function sendTokensFromAnywhere(address receiver, uint amount)
public
returns(bool success)
{
if(token.transfer(msg.sender, receiver, amount)) return true;
// looks like something went wrong with the transfer
throw;
}
Надеюсь, это поможет.