2.0新版佛薩奇開發系統|佛薩奇開發DAPP原始碼搭建

搭建猿punk2558發表於2023-02-13

  合約依賴與呼叫


  依賴引入:合約可以透過import引入依賴的外部合約,抽象合約,Interface或者庫。通常,我們使用npm管理合約的外部依賴,管理合約的依賴也有其他辦法(例如git submodule)這會在工作流章節中詳細敘述。


  呼叫:合約可以呼叫其他合約,只需知道地址和ABI,我們就可以在合約內部呼叫其他合約,需要注意的是,呼叫合約也是事務性操作,因此,你不需要透過手動管理非同步操作的方式來等待返回結果。在合約內部呼叫其他合約需要消耗額外的Gas費用。呼叫合約可能由於ABI錯誤或者不支援某個函式方法而導致失敗,但Gas費用並不會返還,我們需要確保在呼叫其他第三方合約前理解對方合約的介面(包括引數型別,順序,返回結構)


  如果你試圖除錯本地合約呼叫某個生產環境的線上合約,佛薩奇13z開4z77發z558,可以使用fork的方式將某個高度的區塊鏈下載到本地執行,這會在工作流章節中詳細敘述。


  ABI:也叫應用程式二進位制介面(Application Binary Interface)ABI是我們理解如何操作一個合約的具體方法的描述,通常在Interface檔案中被定義(如果合約命名為Membership.sol,那麼它的Interface檔案通常叫做IMembership.sol)


  注意:透過這種方式定義可以讓任意合約透過引用interface的方式來呼叫你的合約,但如果你不在Interface中檔案定義它,編譯器也能幫助你編譯出ABI。


  我們可以依賴完整的ABI來呼叫合約(對外部呼叫者來說,ABI通常被編譯成一個JSON檔案),也可以使用它其中的一部分來呼叫,只要它滿足真實合約所宣告的函式(包括引數,引數型別,返回值,返回值型別都一致)後者通常被成為human-readable ABI,例如:


  calldatas[0]=abi.encodeWithSignature(


  ‘execTransfer(uint256,address,address[],uint256[])’,


  memberId,


  memberWallet,


  payroll.tokens.addresses,


  payroll.tokens.amounts


  );


  合約事件:由於合約的函式呼叫是事務性的,並且無法為外部呼叫者(指代DApp或錢包使用者)提供返回值,合約引入了事件的概念。


  事件透過向日志系統中寫入特定資料的方式來實現函式修改的記錄。我們可以透過監聽和查詢的方式列出一個合約註冊的所有事件,實現對函式非同步結果的查詢和前端UI狀態變更。合約事件以某個單一合約為key來進行索引,同時,在宣告事件時,我們可以指定不多於三個index key來確保DApp前端對這些索引key的查詢效率,例如:


  event ModuleProposalCreated(


  address indexed module,


  bytes32 indexed id,


  address indexed sender,


  uint256 timestamp


  );


  如果你期望的查詢是非常複雜的,包括一系列相關聯的合約事件,更好的方法是採用Relay提供的graph/webhook來進行查詢。


  建立合約:我們可以透過合約建立其他合約,這意味著,合約可以成為其他合約的工廠合約或者代理合約。我們也可以透過外部呼叫者(錢包賬戶)向0x00地址傳送合約建立操作來新建網路上的合約,這是我們進行測試和依賴工作流建立合約的方法。


  建立合約需要消耗大量Gas費用,通常,我們會使用特定工具在建立合約前預估並計算費用


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70020115/viewspace-2934993/,如需轉載,請註明出處,否則將追究法律責任。

相關文章