Solidity

如何通過中繼/入門級合約進行函式呼叫

  • July 12, 2017

我正在嘗試創建一個入門級契約(即入口點):

繼電器.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) createEntityin 時Relay,因為Relay沒有createEntity函式,Relay會呼叫的 fallback 函式。的值currentVersion是您的實例Access2,因此它將delegatecall(msg.data)在該Access2實例上執行。 msg.data包含隨後將在該實例上呼叫createEntity函式的資訊。Access2

另一種說法:您要求Relay執行一些數據(createEntity使用某些數據和參數呼叫函式),但由於Relay不知道如何處理該數據,它會將數據傳遞給Access2.

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