Internal-Transactions

無法通過call呼叫內部函式

  • April 30, 2017

我有一個簡單的測試契約:

pragma solidity ^0.4.8;

contract Test {
 uint public myVal;

 function callIt() {
     this.call.gas(50000)(bytes4(sha3("setMyVal(uint256)")), 123);
 }

 function setMyVal(uint _newVal) internal {
     myVal = _newVal;
 }
}

我正在remix中測試契約。似乎我不能呼叫setMyValfrom callItifsetMyVal設置為internal- 為什麼?我仍然在同一個契約中呼叫它。這種情況下的簽名與 不同bytes4(sha3("setMyVal(uint256)"))嗎?

僅供參考:刪除internal關鍵字時一切正常。但我不想讓這些函式從外部呼叫。以防萬一:我正在考慮使用類似於函式指針的這種模式,與之前討論的類似。

Solidity 中有兩種非常不同的函式呼叫。

  1. 內部呼叫通過JUMP命令發生,可以與任何未標記的函式一起使用external。這些比外部呼叫便宜得多,並且維護諸如msg.sender, msg.gas,calldata等之類的東西。內部呼叫只能合約中發生,並且可以訪問標記的函式internal
  2. 外部函式呼叫通過來自“外部擁有帳戶”的事務或通過CALL操作碼發生,並依賴 ABI 介面將呼叫分派給正確的函式。這些類型的呼叫改變了發送者、呼叫數據、值等。它們無法到達internal函式。

如果您希望能夠使用該CALL方法呼叫函式,則應將函式公開,但創建一個修飾符以禁止來自其他地址的呼叫。

pragma solidity ^0.4.8;

contract Test {
 uint public myVal;

 modifier onlySelf(){
     if (msg.sender != address(this)) throw;
     _;
 }

 function callIt() {
     this.call.gas(50000)(bytes4(sha3("setMyVal(uint256)")), 123);
 }

 function setMyVal(uint _newVal) onlySelf {
     myVal = _newVal;
 }
} 

引用自:https://ethereum.stackexchange.com/questions/15663