基于Hyperledger Fabric实现ERC721

时间:2024-02-25 22:27:44

介绍

超级账本(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