什么是数字藏品

​ 基于区块链的数字藏品是使用区块链技术通过唯一标识确认权益归属的数字作品、艺术品和商品,能够在区块链网络中标记出其所有者,并对后续的流转进行追溯,包括但不限于数字图片、音乐、视频、电子票证、数字纪念品等各种形式.基于区块链的数字藏品是基于联盟区块链技术生成和发行的,只能被通过了实名认证的区块链用户所拥有、具备唯一标识的非同质化数字商品.

数字藏品趋势

​ 国内相关机构通过借鉴国外NFT技术和商业模式,剥离其数字资产属性,秉承国产化合规化的原则,探索实现基于区块链的在联盟链上发行的数字藏品,保证在监管合规的框架内,充分发挥区块链技术在数字版权保护方面的作用,为数字作品的所有权及流转提供解决方案.NFT和基于区块链的数字藏品都使用了区块链技术来解决数字作品的确权难题,但是区别于NFT侧重于数字作品的资产属性和流转价值,区块链数字藏品则更加关注数字藏品本身的价值,锚定其版权价值.

国外公链与国内联盟链

​ 由于国家规定,我国是严禁虚拟货币交易,所以在以太坊上发行NFT、数字藏品显然是不现实的.国内目前比较成熟的区块链框架,例如超级链,长安链,蚂蚁链等.综合几个区块链服务后,认为百度超级链的开放网络更适合发行数字藏品.

百度开放网络的优势

  • 灵活便捷,门槛低
    百度开放网络提供联盟链服务,用户完成注册即可使用区块链服务,并且有丰富的合约模板和强大的功能组件,降低了使用门槛.

  • 国产可控
    开放网络所使用的区块链技术由百度完全自主开发,并且完全开源,满足国内区块链标准要求.支持国密算法,并且通过等保三级等评测,安全性上有保障.

  • 上链成本低
    区别于公链动辄多个以太的gas,百度开放网络具备计算和存储资源的弹性付费能力,可以实现按需按量灵活计费,并且调用合约gas费也非常低,单笔交易1分钱左右.

  • 节点开放,公信力强
    目前开放网络已上线17个超级节点,并且面向社会招募超级节点,也已通过区块链信息服务备案,也有百度品牌背书,百度超级链具有很强的公信力.

使用百度开放网络

​ 首先需要注册一个百度账号,访问链接登录或者注册 https://passport.baidu.com/v2/?login&tpl=search_blockchain&u=https%3A%2F%2Fxuper.baidu.com%2Fn%2Fconsole

1652250937103

​ 登录之后,跳转到控制台页面.

1652251166813

​ 控制台页面会显示开放网络的一些概览数据,右上角个人中心页面会显示下载私钥,重置安全码等操作.(如果没有实名认证, 需要先完成实名认证).

1652251293475

编写数字藏品智能合约

​ 要明白数字藏品的智能合约该怎么编写,首先要了解ERC721和ERC1155规范,两者最大的区别就是ERC721每次只能发行一个数字藏品,批量发行gas消耗比较大,ERC1155则支持批量发行多种数字藏品,大家可以根据不同的使用场景选择不同的合约标准.目前开放网络支持C++和Solidity编写的智能合约,可以参考 OpenZeppelin/openzeppelin-contracts项目,是ERC1155合约的标准实现.
需要注意:开放网络的EVM虚拟机,目前不支持ERC1155的批量操作.

1652255020946

​ 标准的ERC1155合约

1652255682737

部署数字藏品智能合约

​ 用户默认第一次进来,需要创建合约账号之后后,才能进行后续的部署合约操作,这里不再演示了,用户点击下一步即可.

​ 然后点击开放网络下方的合约管理页面,即可部署合约了.

1652251507297

​ 上图便是我自己的合约账号以及我再百度开放网络部署的合约了.目前部署合约有两种方式,一种是直接在网页创建智能合约,一种是通过SDK来部署智能合约.

​ 第一种:网页部署只能合约,用户只用点击创建智能合约后,选择一个合约模板即可创建,在线IDE里面编辑好代码,编译部署即可.

​ 第二种:用SDK 调用百度开放网络服务来实现部署智能合约.官方操作指南中的文档非常详细, https://xuper.baidu.com/n/doc#/e76de83b/1_0_0/b9490d79.下面直接上代码,讲一下SDK去部署合约(建议使用Golang SDK部署合约).
1652252448790
上图为一个简单的部署合约所需要的文件.
erc目录下熟悉Solidity 合约的朋友应该都不陌生,这两个即合约的二进制文件和abi文件,部署合约时需要用到.

keys/admin/private.key 即为用户自己的私钥,可以从百度网络的控制台,个人中心下载.

test/conf 为调用百度开放网络服务所需要的配置文件.如下所示(具体功能也可以去百度开放网络的文档中了解.按照以下配置即可)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# endorseService Info
# testNet addrs
endorseServiceHost: "39.156.69.83:37100"
complianceCheck:
  # 是否需要进行合规性背书
  isNeedComplianceCheck: true
  # 是否需要支付合规性背书费用
  isNeedComplianceCheckFee: true
  # 合规性背书费用
  complianceCheckEndorseServiceFee: 400
  # 支付合规性背书费用的收款地址
  complianceCheckEndorseServiceFeeAddr: aB2hpHnTBDxko3UoP2BpBZRujwhdcAFoT
  # 如果通过合规性检查,签发认证签名的地址
  complianceCheckEndorseServiceAddr: jknGxa6eyum1JrATWvSJKW3thJ9GKHA9n
#创建平行链所需要的最低费用
minNewChainAmount: "100"
crypto: "xchain"
txVersion: 3  // 部署合约时一定要改为 3.

test/new_erc_test.go 即为部署合约的主体代码,这里都以单元测试形式展现.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package test

import (
	"encoding/base64"
	"encoding/hex"
	"encoding/json"
	"fmt"
	"testing"

	"github.com/xuperchain/xuper-sdk-go/v2/account"
	"github.com/xuperchain/xuper-sdk-go/v2/xuper"
)

var xuperClient *xuper.XClient  // 连接超级链的 client
var acc *account.Account	// 用户账户 acc 
var err error
var ContractName = "contractName"  // 合约名  自己设置

func init() {
	xuperClient, err = xuper.New("39.156.69.83:37100") // 百度开放网络接入地址
	if err != nil {
		fmt.Println("new xuperclient error ", err.Error())
		return
	}
	// 用 自己的私钥加载出 acc 账户 private.key
	acc, err = account.GetAccountFromFile("../keys/admin/", "自己的安全码")
	if err != nil {
		fmt.Println("new xuperclient error ", err.Error())
		return
	}
}

// 部署合约
func Test_DeployContract(t *testing.T) {
    // 首先,加载合约 abi 和  二进制文件
	abiPath := "../erc/ShengJianERC1155.abi"
	abi, err := ioutil.ReadFile(abiPath)
	if err != nil {
		panic(err)
	}
	// 合约bin 所在路径
	binPath := "../erc/ShengJianERC1155.bin"
	bin, err := ioutil.ReadFile(binPath)
	if err != nil {
		panic(err)
	}
	// 设置为自己百度开放网络的 合约账号.记得更换为自己合约管理中的合约账号
	adminAcc.SetContractAccount("XC1111111111111111@xuper")
    
    // 设置合约初始化参数  以自己的引入的合约文件的初始化参数为准
	args := make(map[string]string)
	args[""] = ""
    
	// 调用 部署合约 方法,返回交易信息
	t2, err := xuperClient.DeployEVMContract(adminAcc, ContractName, abi, bin, args, xuper.WithBcname("xuper"))
	if err != nil {
		fmt.Println("DeployEVMContract error", err.Error())
		return
	}
    // 解析交易ID 合约部署成功
	fmt.Println(string(t2.ContractResponse.GetBody()), t2.GasUsed, hex.EncodeToString(t2.Tx.Txid))
	
}

​ 执行完以上述代码,大家也可以在部署完成后可以到网页上的合约管理页面查看,看是否有刚刚自己部署的合约.

调用数字藏品智能合约

​ 部署完合约之后最重要的就是调用了,下面演示如何调用数字藏品的智能合约,发行数字藏品,还是用Golang的SDK演示(如果有需要其他SDK调用的可以参考官方文档).

1652256397166

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
/**
	@Test: 发行资产.
*
*/
func Test_Mint(t *testing.T) {
	var args = make(map[string]string)
	// 资产类ID
	args["to"] = ""
    args["id"] = ""
    args["amount"] = ""
    args["data"] = ""
	t2, err := xuperClient.InvokeEVMContract(superAccount, ContractName, "mint", args, xuper.WithBcname("xuper"))
	if err != nil {
		fmt.Println(err.Error())
		return
	}
    // 获取发行资产的交易Hash
	fmt.Println(hex.EncodeToString(t2.Tx.Txid))
}

​ 以上就是使用开放网络发行数字藏品的示例,基于ERC1155标准合约,如果大家有其他需求可以对合约进行改造定制.在百度开放网络发行数字资产的难度相对比较低,开放人员也更容易上手,gas成本低,区块链技术完全自主开发,安全可靠,公信力强.

查询数字资产

​在链上发行资产后,用户需要查询到自己资产的余额,交易记录等. 百度开放网络的浏览器,只是显示gas的流转,不显示合约内藏品的转移信息,为此社区开发了opennft-client浏览器插件,并已经开源: https://github.com/shengjian-tech/opennft-client

opennft-client 是针对opennft合约进行定制开发的浏览器插件, 下面介绍下如何使用opennft-client实现查询资产,交易详情等功能.

​首先下载插件,插件下载地址 https://gitee.com/shengjian-tech/opennft-client/raw/master/MakerONE.zip

​然后在浏览器,加载浏览器插件.以Chrome浏览器为例,按照下述流程安装浏览器插件
1654740922296
​ 然后,打开浏览器插件,加载自己的私钥,进入插件首页.加载私钥,输入安全码,实际就是Xuper-SDK-JS 调用接口,解析出来账户,然后插件跳转首页,首页显示登录私钥用户的地址,百度开放网络的余额等.目前提供了三个主要功能:转移资产、查询资产余额、查询交易.opennft-client是基于opennft合约开发的,可以参考源码定制功能. 1654741051126

​ 用户转移资产,以及查询资产余额,查询交易等功能操作,如下图所示.输入所需要的参数即可查询,转移等.

1654741272622

1654741298689

​ 上述插件功能的代码,可以参考开源的opennft-client实现思路,对照自己的需求开发对应的插件或Web页面.

OpenNFT

OpenNFT是百度超级链开放网络上首个代码开源的数字藏品平台.
源码地址:
https://gitee.com/shengjian-tech/opennft
https://github.com/shengjian-tech/opennft