Solidity
契約改變另一個契約的狀態
在我的系統中,使用者可以請求通過可信合約進行驗證。當使用者創建帳戶時,他會部署此合約(省略不相關的部分)
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 的介面,因為其他兩個合約都與它通信。這裡有一個更實際的例子:有一個簡單的契約工廠模式嗎?
希望能幫助到你。