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