基於Hyperledger Fabric實現ERC721


介紹

超級賬本(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM