Solidity
如果一個合約的函式呼叫了另一個合約的函式,那麼這個合約的地址就是msg.sender嗎?
例如,眾籌合約有一個功能,它使用已在正在部署的程式碼中進一步定義的代幣合約創建一個名為“token”的 ERC20 代幣。建構子包含
token = createTokenContract();
createTokenContract() 方法包含:
function createTokenContract() internal returns (TierToken) { return new ERC20Token(); }
當在眾籌中的應付函式中時,它現在在我的眾籌合約中呼叫“令牌”函式,例如
token.transfer(beneficiary, tokenAmount);
在那次通話中,誰是 msg.sender?傳遞函式來自 OpenZeppelins 實現,因此包含:
function transfer(address _to, uint256 _value) public returns (bool success) { require(_to != address(0)); //not sending to burn address require(_value <= balances[msg.sender]); // If the sender has sufficient funds to send require(_value>0);// and the amount is not zero or negative // SafeMath.sub will throw if there is not enough balance. balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); Transfer(msg.sender, _to, _value); return true; }
在使用餘額的這些餘額檢查和轉移中
$$ msg.sender $$,那個發件人現在是包含對該函式的呼叫的眾籌合約的地址嗎?還是發送者是將乙太幣發送到合約的使用者(然後呼叫令牌函式)? 這可能很簡單,但我無法在文件中找到關於 msg.sender 與合約呼叫其他合約函式相關的很好解釋。
謝謝你的幫助。
如果一個合約的函式呼叫了另一個合約的函式,那麼這個合約的地址就是msg.sender嗎?
是的。
tx.origin
是發送交易的外部賬戶。來自 Solidity 文件:
msg.sender(地址):消息的發送者(目前通話)
tx.origin(地址):交易的發送者(完整的呼叫鏈)