Solidity
如何通過中繼/入門級合約進行函式呼叫
我正在嘗試創建一個入門級契約(即入口點):
繼電器.sol
pragma solidity ^0.4.8; contract Relay { address public currentVersion; address public owner; modifier onlyOwner() { if (msg.sender != owner) { throw; } _; } function Relay(address initAddr) { currentVersion = initAddr; owner = msg.sender; } function changeContract(address newVersion) public onlyOwner() { currentVersion = newVersion; } function() { if(!currentVersion.delegatecall(msg.data)) throw; } }
還有我的契約
Access2.sol
pragma solidity ^0.4.8; import './Storage.sol'; import './Relay.sol'; contract Access2{ Storage s; address Storageaddress=0xcd53170a761f024a0441eb15e2f995ae94634c06; function Access2(){ Relay r=new Relay(this); } function createEntity(string entityAddress,uint entityData)public returns(uint rowNumber){ s = Storage(Storageaddress); uint row=s.newEntity(entityAddress,entityData); return row; } function getEntityCount()public constant returns(uint entityCount){ s = Storage(Storageaddress); uint count=s.getEntityCount(); return count; } }
兩個合約都已部署。
如果我使用 Access2 的對象通過 web3 訪問 Access2 的方法,它工作正常,但現在的問題是如何通過 Relay 訪問 Access2 的方法。
我可以使用的對象
Relay
嗎?這看起來像是可升級合約的副本,但 我的問題不是關於編寫可升級合約,而是從入門級合約呼叫我們合約的功能:即入門級合約的概念如何運作?
提前致謝
是的,
Relay
您可以呼叫Access2
函式,例如createEntity
.實現它的重要程式碼
Relay
是它的備份功能:function() { if(!currentVersion.delegatecall(msg.data)) throw; }
閱讀關於fallback-function的問題和答案有助於了解更多資訊。
基本上,當你呼叫 (call)
createEntity
in 時Relay
,因為Relay
沒有createEntity
函式,Relay
會呼叫的 fallback 函式。的值currentVersion
是您的實例Access2
,因此它將delegatecall(msg.data)
在該Access2
實例上執行。msg.data
包含隨後將在該實例上呼叫createEntity
函式的資訊。Access2
另一種說法:您要求
Relay
執行一些數據(createEntity
使用某些數據和參數呼叫函式),但由於Relay
不知道如何處理該數據,它會將數據傳遞給Access2
.