Internal-Transactions無法通過
無法通過call
呼叫內部函式
我有一個簡單的測試契約:
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中測試契約。似乎我不能呼叫
setMyVal
fromcallIt
ifsetMyVal
設置為internal
- 為什麼?我仍然在同一個契約中呼叫它。這種情況下的簽名與 不同bytes4(sha3("setMyVal(uint256)"))
嗎?僅供參考:刪除
internal
關鍵字時一切正常。但我不想讓這些函式從外部呼叫。以防萬一:我正在考慮使用類似於函式指針的這種模式,與之前討論的類似。
Solidity 中有兩種非常不同的函式呼叫。
- 內部呼叫通過
JUMP
命令發生,可以與任何未標記的函式一起使用external
。這些比外部呼叫便宜得多,並且維護諸如msg.sender
,msg.gas
,calldata
等之類的東西。內部呼叫只能在合約中發生,並且可以訪問標記的函式internal
- 外部函式呼叫通過來自“外部擁有帳戶”的事務或通過
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; } }