在以太坊合约中使用 .send() 函数发送以太币时,以太币从哪里来

Where do the ethers come from when sending ethers with .send() function in ethereum contract

我正在学习 here 之后的以太坊代币合约。我对下面的代码感到困惑:

function sell(uint amount) returns (uint revenue){
if (balanceOf[msg.sender] < amount ) throw;        // checks if the sender has enough to sell
balanceOf[this] += amount;                         // adds the amount to owner's balance
balanceOf[msg.sender] -= amount;                   // subtracts the amount from seller's balance
revenue = amount * sellPrice;
if (!msg.sender.send(revenue)) {                   // sends ether to the seller: it's important
    throw;                                         // to do this last to prevent recursion attacks
} else {
    Transfer(msg.sender, this, amount);             // executes an event reflecting on the change
    return revenue;                                 // ends function and returns
}

}

msg.sender.send(revenue)表示向卖家发送以太币。我的问题是:

要发送的以太币是来自msg.sender还是来自代币合约? 我认为它们来自 msg.sender。不过msg.sender其实是代表卖家的吧?这使得卖家向自己发送以太币。我可以知道如何理解这一点。然后如何让合约自动将以太币发送回用户帐户?

谢谢!

我做了一些测试来弄清楚这个问题。我发现发送到目标地址的以太币来自令牌合约实例地址。

我之前很困惑,因为我不明白合约实例在构造后如何获得以太币。现在我了解到,当帐户调用由合约关键字 payable 标记的方法时,合约实例会获得以太币。当调用发生时,以太币同时被发送到合约地址。在demo token code中,buy()方法起到了发送以太币到合约地址的作用。

我刚开始学习以太坊合约。我的认识可能还有一些错误。如果有请告诉我。非常感谢!

谢谢!