Solidity

契約改變另一個契約的狀態

  • August 4, 2017

在我的系統中,使用者可以請求通過可信合約進行驗證。當使用者創建帳戶時,他會部署此合約(省略不相關的部分)

pragma solidity ^0.4.11;

contract User {
   // State variables
   address owner = msg.sender;
   bool verified = false;
   uint creationTime = now;
   struct PersonalInfo {
       string firstName;
       string LastName;
       string email;
   }
   uint level = 0;

   function requestVerification(address trustEntity) {
       /*
           This function should send a verification request
           to a trust entity's contract
       */
   }
}

有一個已知的可信實體,每個人都知道其合約地址,該實體應該是唯一能夠驗證使用者的實體。它的契約(省略非相關部分)是

pragma solidity ^0.4.11;

contract TrustEntity {
   address owner;
   address registry;
   address[] public pendingRequests;

   function verifyUsers(address user) {
       /*
           Whenever a user requests verification, his
           address should be pushed to the pendingRequests
           array, so it can then be fetched to verify or
           reject
       */
   }   
}

我看到的每個契約與另一個契約互動的例子,它們都在同一個文件中(文件這個問題)所以我不知道一個契約是否可以呼叫另一個契約(或者,在這種特定情況下,將地址推送到另一個合約的狀態變數/更改另一個合約的狀態變數)。

是的。

呼叫合約需要兩件事;要呼叫的合約的地址,以及 ABI 的描述。總之,ABI 是對函式名稱和參數佈局的描述。

您經常會在同一個文件中看到合約,因為它為編譯器提供了它需要的關於 ABI 的資訊。在許多情況下,不會手動部署一個或多個合約,而是通過一個或多個其他合約中的流程進行部署。

您可能會看到如下內容:

import "/Utility.sol"; // something already deployed. We want the code so the compiler can see the interface.

contract Factory { // something that deploys instances
 Utility utility; // Type is Utility (contract)
 function Factory(address _utility) {
   utility = Utility(_utility); // Utility at the supplied (known) address
 }
 function newInstance() returns(address contract) {
   Instance = new Instance(utility); // make a new instance and inform about another contract's address
   return instance;
}

contract Instance { // something that will copied/deployed many times
 Utility utility;
 function Instance(address _utility) { // utility address passed in
   utility = Utility(_utility); // get set to use the Utility
 }
}

上面的構想是部署了Utility,部署者知道地址,所以他們在部署Factory的時候把它傳給了constructor(不然怎麼知道?)。他們不需要部署實例,因為工廠會這樣做。當 Factory 被編譯時,編譯器仍然需要查看所有三個源文件。Factory 需要一個它應該部署的字節碼的副本,new Instance();並且它需要與 Utility 的介面,因為其他兩個合約都與它通信。

這裡有一個更實際的例子:有一個簡單的契約工廠模式嗎?

希望能幫助到你。

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