基於Hyperledger Fabric實現ERC721

JoeyHua發表於2021-10-14

介紹

超級賬本(Hyperledger)專案是首個面向企業應用場景的開源分散式賬本平臺。由linux基金會牽頭,包括 IBM 等 30家初始企業成員共同成立的。

區塊鏈網路主要有三種型別:公共區塊鏈、聯盟或聯合區塊鏈,以及私有區塊鏈。Hyperledger Fabric定位是面向企業的分散式賬本平臺,引入許可權管理,設計上支援可插拔、可擴充套件,是首個面向聯盟鏈場景的開源專案。

REC721是一個區塊鏈數字資產標準,我的這篇文章初探區塊鏈數字加密資產標準ERC721有介紹,本文不再贅述。

準備工作

根據Hyperledger Fabric官網的要求,我們需要如下的環境:

  • Git
  • cURL
  • Docker
  • Java JDK

然後根據官網的要求搭建好環境,具體過程參見官網:https://hyperledger-fabric.readthedocs.io/en/latest/prereqs.html

專案分為合約和應用程式兩部分,下面會分別介紹。

合約

先來看一下目錄結構

.
|-- BasicContract.java ----------------------合約檔案
|-- ERC721Context.java ----------------------合約上下文
|-- IERC721.java ----------------------------ERC721介面
|-- Utils.java ------------------------------工具類
|-- constant --------------------------------存放常量的目錄
|   `-- ContractConstant.java
|-- event -----------------------------------存放事件的目錄
|   |-- ApprovalEvent.java
|   |-- ApprovalForAllEvent.java
|   |-- Event.java
|   `-- TransferEvent.java
|-- ledgerapi -------------------------------對State的抽象,定義了基礎的增刪改查
|   |-- State.java
|   |-- StateDeserializer.java
|   |-- StateList.java
|   `-- impl
|       `-- StateListImpl.java
`-- state -----------------------------------存放state的目錄
    |-- Balance
    |   |-- Balance.java
    |   `-- BalanceList.java
    |-- NFT
    |   |-- NFT.java
    |   `-- NFTList.java
    `-- OperatorApproval
        |-- OperatorApproval.java
        `-- OperatorApprovalList.java

合約的具體內容太長了,這裡就不放出來了,地址:https://github.com/huajiayi/ERC721-implementation/blob/main/contract-java/src/main/java/org/example/BasicContract.java

需要注意的有幾點:

  • 部署合約的時候合約名要和settings.gradle中的名字一樣,不然會報錯
  • Hyperledger Fabric不支援方法過載,所以safeTransferFrom的兩個方法得捨棄一個
  • Hyperledger Fabric不支援帶有Transaction註解的方法巢狀呼叫,會報錯

應用程式

應用程式就簡單多了,只有三個檔案

.
|-- App.java ------------------------------主程式        
|-- EnrollAdmin.java ----------------------註冊Admin
`-- RegisterUser.java ---------------------註冊User

這裡要注意的是,User是由Admin來授權的,所以必須先註冊Admin,再註冊User。

寫這個應用的時候也遇到了一些坑:

  • 在應用端獲取不到msg.sender,所以得在合約中寫一個返回自己的方法
@Transaction(intent = Transaction.TYPE.EVALUATE)
    public String msgSender(ERC721Context ctx) {
        return ctx.getClientIdentity().getId();
    }
  • 傳參的時候不能傳null,合約會報錯
  • 檔案內不能有中文,不然編譯可能會通不過
  • 重啟網路後,需要吧wallet資料夾刪除,因為證照被重新生成了,wallet內的檔案是和證照相關的

同樣具體內容就不放了,地址:https://github.com/huajiayi/ERC721-implementation/tree/main/application-java/src/main/java/application/java

專案地址

專案已經上傳到GIthub上,有需要的同學可以自行檢視:https://github.com/huajiayi/ERC721-implementation

參考

https://linux.cn/article-11328-1.html
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
https://hyperledger-fabric.readthedocs.io/en/latest/whatis.html

相關文章