公开/公告号CN113806817B
专利类型发明专利
公开/公告日2022-07-05
原文格式PDF
申请/专利权人 中科计算技术创新研究院;中科物缘(杭州)计算技术有限公司;
申请/专利号CN202111168545.X
申请日2021-10-08
分类号G06F21/64(2013.01);G06F16/27(2019.01);G06F16/22(2019.01);G06F16/955(2019.01);G06F16/172(2019.01);G06Q20/06(2012.01);
代理机构杭州九洲专利事务所有限公司 33101;
代理人沈敏强
地址 310015 浙江省杭州市拱墅区祥园路108号4幢12层
入库时间 2022-08-23 13:58:39
法律状态公告日
法律状态信息
法律状态
2022-07-05
授权
发明专利权授予
技术领域
本发明涉及一种构建孪生NFT的方法、全量可信存储的NFT协议和系统。适用于区块链技术领域。
背景技术
区块链技术由于其去中心化、无法篡改的特性,能够为数字内容等各种数字资产提供以非同质化代币(NFT,Non-Fungible Tokens)为凭据类型的所有权证明,并以分布式等方式存储和分发,同时确保其唯一性并不可篡改,由于此特性使得NFT广泛应用于数字资产等领域。Ethereum Request for Comment-721(ERC721)标准描述了一个不可互换的通证,大多数生成NFT方法是基于ERC721标准的,然而,当前主流NFT和ERC721协议仍然无法解决以下两个问题:
(1)不同区块链上的NFT无法互相流通。目前,数字内容的所有者将自己的作品制作成NFT并发布的某一个区块链上,但由于缺乏NFT跨链机制,该NFT无法在其它的区块链系统中流转和交易。发行者如想在别的区块链上也发行该数字资产,只能在对应区块链系统中再制作一次NFT。这样就产生了两个完全独立且无关的NFT,这与NFT本身所对应的数字内容应当是独一无二的产生了矛盾。如果发行者仅仅是想在更多的区块链平台上对同一个数字内容进行推广,但并不想创造出多个独立的NFT而导致价值的分散,则当前的协议无法做到;
(2)数字内容的存储安全性和可靠性问题。每一个NFT都对应了一个独一无二的数字内容,然而大多数区块链系统由于现有技术受限和费用过高等问题,无法将类似于视频这样的数字内容也就是多媒体类型大文件全量存储在区块链上。因此,通常的做法是将NFT协议对应的智能合约及通证上链,而其对应的数字内容则采用链下存储的方式,如存在中心化网站,或者存至IPFS、Sia等分布式存储平台,并将文件的Hash值等数据存储在NFT中。但这样做存在一定的风险,比如链下存储的数据可能被篡改,IPFS等分布式存储方式并没有设置数据永久保障机制,因此无法保障数据不会消失;所以,即使NFT依然在链上流转,但是NFT所对应的数字内容却被篡改或删除了,即内容本身的存储是不安全、不可靠的。
发明内容
本发明要解决的技术问题是:针对上述存在的问题,提供一种构建孪生NFT的方法、全量可信存储的NFT协议和系统。
本发明所采用的技术方案是:一种在不同区块链上构建孪生NFT的方法,其特征在于:
a、在所有可能产生孪生NFT的区块链上部署孪生智能合约;
b、部署在区块链上的孪生智能合约产生其对应的合约地址;
c、通过区块链上的跨链通信模块记录下每个区块链的标识及其所部署孪生智能合约的合约地址;
d、区块链上的孪生智能合约基于该区块链上待孪生的原始NFT的id和目标区块链的标识生成孪生NFT请求,该请求包括待孪生的原始NFT的id和目标区块链的标识,以及待孪生的原始NFT对应的所有者账户和存储信息;
e、跨链通信模块接收到孪生NFT请求后,识别该孪生NFT请求对应的目标区块链及其对应的孪生智能合约的合约地址,并基于识别出的目标区块链及其对应的孪生智能合约的合约地址向相应孪生智能合约发送孪生NFT的http请求,该请求包括待孪生的原始NFT的id、所有者账户和存储信息;
f、孪生智能合约根据孪生NFT的http请求在其所在区块链上生成id为待孪生的原始NFT的id的NFT,并标注孪生标志。
所述跨链通信模块,包括:
标准通信接口模块,用于在区块链和区块链之间建立通信连接;
域名解析模块,用于解析并访问NFT存储信息中的链接地址;
数据记录模块,用于记录每个区块链的标识及其所部署孪生智能合约的合约地址。
所述存储信息包括待孪生的原始NFT对应JSON文件在区块链中的链接地址;
所述JSON文件基于待孪生的原始NFT对应数字内容的名称、内容描述和链接地址生成。
所述待孪生的原始NFT所在的区块链为ImSQL区块链,待孪生的原始NFT对应的数字内容存储于该ImSQL区块链上。
一种NFT转移交易方法,其特征在于:
在一区块链上将待转移NFT转移到新的所有者账户,该待转移NFT为根据所述构建孪生NFT的方法构建的孪生NFT或为所述构建孪生NFT的方法中的原始NFT;
NFT转移完成后生成NFT转移成功的http请求,该请求包括转移成功NFT的id及新的所有者账户;
跨链通信模块接收NFT转移成功的http请求,并根据该请求中NFT的id确定相应原始NFT和所有孪生NFT所在的区块链地址,以及相应区块链上孪生智能合约的合约地址;
跨链通信模块根据区块链地址及孪生智能合约的合约地址向孪生智能合约发送变更NFT所有者的http请求,该请求包括转移成功NFT的id及新的所有者账户;
孪生智能合约接收到变更NFT所有者的http请求,根据变更NFT所有者的http请求变更该孪生智能合约所在区块链上相应NFT的所有者。
一种支持数字内容全量可信存储的NFT协议,其特征在于,包括:
ERC721协议;
全量数据存储协议,包括实现基于数字内容的名称、内容描述和链接地址生成JSON文件的方法,以及实现基于NFT的id、所有者账户和相应JSON文件链接地址生成NFT的方法;
NFT跨链一致性协议,包括实现所述构建孪生NFT的方法中步骤d、e孪生NFT到别的区块链的方法、实现步骤f在区块链上生成孪生NFT的方法,以及所述NFT转移交易方法中变更NFT所有者的方法。
一种支持数字内容全量可信存储的NFT系统,其特征在于:具有多个区块链,区块链上配置有存储所述NFT协议的ImNFT协议模块。
多个区块链中包括ImSQL区块链,该ImSQL区块链上还配置有跨链通信模块和用于存储数字内容的数字内容存储模块。
本发明的有益效果是:本发明通过将区块链上创建的NFT能够孪生到别的区块链上,孪生后的NFT与原始NFT权利完全一致,可代表原始NFT流通和交易,并可在流通和交易完成后实现不同区块链系统上所有孪生NFT的权属状态的同步,避免各个NFT权属分裂、单独交易等情况所造成的价值分散风险。
本发明结合能够支持海量数据全量上链存储的ImSQL区块链,将NFT所指向的数字内容上链,保证数字内容全量可信存储。
附图说明
图1为实施例中支持数字内容全量可信存储的NFT系统的系统架构图。
图2为实施例中支持数字内容全量可信存储的NFT协议的架构图。
图3为实施例中跨链通信模块的框图。
具体实施方式
如图1所示,本实施例为一种支持数字内容全量可信存储的NFT系统,具有多个不同的区块链,包括ImSQL区块链(http://imsql.chaincomp.net/)、区块链系统A和区块链系统B,每个区块链上均配置有ImNFT协议模块,其中ImSQL区块链上还配置有数字内容存储模块和跨链通信模块。
如图2所示,本例中ImNFT协议模块存储有支持数字内容全量可信存储的NFT协议(ImNFT协议),该分为三个模块:第一个模块是ERC721标准部分,通过包含ERC721协议确保与其的兼容性;第二个模块是全量数据存储协议,确保数据的链上存证和可检索性;第三个模块是NFT跨链一致性协议,确保由ImNFT协议生成的NFT能够在不同的区块链上跨链流通且不造成权利的混乱。
本实施例中ImNFT协议标准定义了如下接口:
(1)返回账户持有NFT数量,此接口属于协议的第一个模块:
balanceOf(address _owner)
其中_owner是所有者账户地址;
(2)返回NFT所有者的地址,此接口属于协议的第一个模块:
ownerOf(uint256 _tokenId)
其中_tokenId为NFT的id,下同;
(3)校验NFT是否存在,此接口属于协议的第一个模块:
exists(uint256 _tokenId)
(4)授予账户具有操作NFT的权限,此接口属于协议的第一个模块:
approve(address _to, uint256 _tokenId)
其中_to为账户地址
(5)返回NFT授权的地址,此接口属于协议的第一个模块:
getApproved(uint256 _tokenId)
(6)授权(取消)账号对所有NFT的操作权限,此接口属于协议的第一个模块:
setApprovalForAll(address _operator, bool _approved)
其中_operator为账户地址,_approved为true时,授权_operator拥有所有NFT权限,_approved为false时,取消_operator所有NFT权限;
(7)查询授权,此接口属于协议的第一个模块:
isApprovedForAll(address _owner, address _operator)
其中_owner为NFT所有者账户地址,_operator为账户地址,如果_operator被_owner授权,返回true,否则返回false;
(8)NFT资产转移,此接口属于协议的第一个模块:
transferFrom(address _from, address _to, uint256 _tokenId)
能够将NFT从_from账户转移到_to账户;
(9)NFT资产转移,此接口属于协议的第一个模块:
safeTransferFrom(address _from, address _to, uint256 _tokenId)
能够将NFT从_from账户转移到_to账户;
(10)返回NFT的名称,此接口属于协议的第一个模块:
name()
(11)返回NFT的缩写名称(符号),此接口属于协议的第一个模块:
symbol()
(12)返回NFT外部数字内容的URL,此接口属于协议的第一个模块:
tokenURI(uint256 _tokenId)
此接口返回一个外部URL,此URL可以被跨链通信模块中的域名解析模块识别,域名解析识别后该URL对应一个描述NFT元数据JSON文件;
(13)设置NFT指向数字内容的名称、描述和内容,生成一个JSON文件保存在区块链,此接口属于协议的第二个模块:
setDigitalAssetInfo(string _name, string _description, string _url)
其中_name为数字内容的名称,_description为数字内容的内容描述,_url为数字内容的外部链接地址。根据入参会生成一个JSON文件保存在区块链中,JSON格式如下:
{
"name": "_name",
"description": "_description",
"image": "_url ",
}
文件存储成功后,返回一个能够访问到该JSON文件的链接地址_urlJson;
(14)返回NFT指向数字内容的名称,此接口属于协议的第二个模块:
getDigitalAssetName(uint256 _tokenId)
(15)返回NFT指向数字内容的描述,此接口属于协议的第二个模块:
getDigitalAssetDescription(uint256 _tokenId)
(16)查询NFT的数字内容的链接_url,此接口属于协议的第二个模块:
getDigitalAsset(uint256 _tokenId)
(17)生成NFT,此接口属于协议的第二个模块:
newNft(address _owner, uint256 _tokenId,string _url)
其中_owner为NFT拥有着的地址,_tokenId为设置的NFT的id,_url为接口setDigitalAssetInfo()返回_urlJson;
(18)同步NFT到别的区块链系统,此接口属于协议的第三个模块:
synNft(uint256 _tokenId, string _toBlockchain)
其中_toBlockchain为需要将NFT同步到目标区块链的标识,_tokenId为待同步NFT的id;
(19)在区块链上生成孪生NFT(对应下述步骤S6),此接口属于协议的第三个模块:
twinNft(address _owner, uint256 _tokenId,string _url)
其中_owner为NFT所有者的地址,_tokenId和_url分别为接口setDigitalAssetInfo()返回的_tokenId和_urlJson;此接口在生成NFT的同时,会将NFT添加孪生标注,即isTwin ()的返回值会为true;
(20)孪生NFT到别的区块链系统(对应下述步骤S5),此接口属于协议的第三个模块:
synTwinNft(uint256 _tokenId, string _toBlockchain)
其中_toBlockchain为需要将NFT孪生到目标区块链的标识,_tokenId为待孪生NFT的id;此方法可以将NFT孪生到目标区块链系统,孪生后的NFT与原NFT完全一致,可以代替原NFT在新区块链系统中流通和交易;
(21)查询是否是孪生NFT,此接口属于协议的第三个模块:
isTwin(uint256 _tokenId)
如果是原始NFT,返回0,孪生NFT,返回1;
(22)变更NFT的所有者地址,此接口属于协议的第三个模块:
setOwner(uint256 _tokenId,address _newOwner)
其中_newOwner为NFT所有者账户。
由以上22个接口组成的ImNFT协议,能够生成数字内容全量可信存储的NFT,并且能够支持NFT跨链查看与跨链流通。
本实施例中跨链通信模块包括标准通信接口模块、域名解析模块和数据记录模块(见图3),其中标准通信接口模块用于在区块链和区块链之间建立通信连接,域名解析模块用于解析并访问数字内容的链接地址和JSON文件的链接地址,数据记录模块用于记录系统中每个区块链的标识及每个区块链上所部署孪生智能合约的合约地址。
本实施例中支持数字内容全量可信存储的NFT系统所提供的功能包括:
功能一:创建NFT,并且NFT所指向的数字内容上链,保证数字内容全量可信存储;
功能二:所创建的NFT能够孪生到别的区块链上,孪生后的NFT与原始NFT权利完全一致,可以代表原始NFT流通和交易。
本例中实现功能一的方法和流程包括:
步骤一:在ImSQL区块链上依据ImNFT协议规范编辑智能合约,并将其部署于ImSQL区块链系统中;
步骤二:上传待生成NFT所要指向的数字内容到ImSQL区块链中,返回能够访问此数字内容的https链接,如:https://chaincomp.com/asset/QmZzBdKF7sQX1Q49CQGmreuZHxt9sVB3hTc3TTXYcVZ7jC,该链接能够通过跨链通信模块中域名解析模块解析并进行访问,所对应的数字内容存储于的数字内容存储模块中;
步骤三:调用智能合约中的setDigitalAssetInfo()方法,设置数字内容的名称、描述信息和数字内容的链接(为步骤二的返回值)。执行后会生成一个JSON文件保存在区块链系统中,最后返回一个能够查询到生成JSON文件的url地址_urlJson,如:https://chaincomp.com/json/QmZzBdKF7sQX1Q49CQGmreuZHxt9sVB3hTc3TTXYcVZ7j,该链接能够被跨链通信模块的域名解析模块解析和访问;
步骤四:调用智能合约中newNft()方法,入参分别填入NFT的_tokenId、接收者的地址_owner和步骤三返回的_urlJson,方法执行后就生成了一个NFT。
本实施例中为实现功能二所采用的在不同区块链上构建孪生NFT的方法,包括:
S1:完成孪生系统的环境部署,在所有可能产生孪生NFT的区块链上部署符合ImNFT协议规范的孪生智能合约,该合约的代码如下:
pragma solidity >=0.4.21 <0.7.0;
import 'zeppelin-solidity/contracts/token/ERC721/ERC721.sol';
import 'zeppelin-solidity/contracts/ownership/Ownable.sol';
contract myImNft is ERC721, Ownable {
//数字内容结构体
struct digitalAsset {
string name;
string description;
string url;
}
//NFT的uri和孪生标识结构体
struct nftInfo {
string uri;
uint256 isTwin;
}
//NFT的uri和数字内容的映射关系
mapping(string => digitalAsset) public digitalAssetMap;
//NFT的tokenId和uri与isTwin的映射关系
mapping(uint256 => nftInfo) public nftInfoMap;
//构造函数
constructor() {
nftName = "ImNft";
nftSymbol = "Nft";
}
//设置数字内容的名称、说明和链接地址,生成JSON文件存储在区块链中,并将传入的信息存入digitalAsset结构体中
function setDigitalAssetInfo(string _name, string _description, string _url) returns (string) {
string _uri = saveJsonFile(_name, _description, _url);
digitalAssetMap[_uri] = digitalAsset({name: _name,description: _description, url: _url});
return _uri;
}
//生成NFT,并将这种方式生成的NFT是否是孪生标志置成0,代表为原生
function newNft(address _owner, uint256 _tokenId, string _uri) external onlyOwner {
super._mint(_owner,_tokenId);
super._setTokenUri(_tokenId, _uri);
nftInfoMap[_tokenId] = nftInfo({uri: _uri, isTwin: 0});
}
//查询数字内容的名称
function getDigitalAssetName(uint256_tokenId) returns(string) {
return digitalAssetMap[nftInfoMap[_tokenId].uri].name;
}
//查询数字内容的描述
function getDigitalAssetDescription(uint256 _tokenId)returns (string) {
return digitalAssetMap[nftInfoMap[_tokenId].uri].description;
}
//查询数字内容的链接
function getDigitalAsset(uint256_tokenId) returns (string) {
return digitalAssetMap[nftInfoMap[_tokenId].uri].url;
}
//发送孪生NFT请求
function synTwinNft(uint256 _tokenId, string _toBlockchain){
address_owner=ownerOf(tokenId);
string_uri = getDigitalAsset(_tokenId);
httpRequestPost(_owner, _tokenId, _uri, _toBlockchain);
}
//生成孪生NFT,并将数字内容信息存储到digitalAsset结构体中
function twinNft(address _owner, uint256 _tokenId, string _uri) {
super._mint(_owner, _tokenId);
super._setTokenUri(_tokenId, _uri);
digitalAsset = httpRequestGet(_uri);
digitalAssetMap[_uri]=digitalAsset({name:digitalAsset.name,description:digitalAsset.description, url: digitalAsset.url});
nftInfoMap[_tokenId] = nft({uri: _uri, isTwin: 1});
}
//查询NFT是否为孪生
functionisTwin(uint256_tokenId){
return nftInfoMap[_tokenId].isTwin;
}
//转移NFT
function setOwner(uint256_tokenId, address_newOwner) {
address_nowOwner=ownerOf(tokenId);
super._transfer(_nowOwner, _newOwner, tokenId);
}
}
该合约命名为myImNft,继承了ERC721和 Ownable合约,ERC721合约中包含本例中ImNFT协议的第一个模块实现,myImNft合约无需重复实现第一个模块接口;digitalAsset代表数字内容的结构体,由数字内容的名称、说明和链接url组成;digitalAssetInfoMap代表JSON文件的链接uri与数字内容的映射关系;nftInfo代表NFT数字内容链接uri与是否为孪生NFT标识isTwin的结构体;nftInfoMap代表NFT的tokenId与nftInfo的映射关系;_toBlockchain代表区块链唯一标识ID;_owner为账户地址;构造函数中初始化了NFT的名称和符号;合约中各函数功能均有注解,其中部分函数是调用其它合约中定义和实现的函数。
S2:步骤一完成后,部署在各个不同区块链上的孪生智能合约会产生一个对应的合约地址,即_smartcontractAddress。
S3:在跨链通信模块中对每个不同的区块链系统均有一个唯一标识ID,即_toBlockchain;本例利用跨链通信模块中的数据记录模块,记录下系统中每个区块链的标识_toBlockchain及其所上部署的孪生智能合约的合约地址_smartcontractAddress。
S4:按本例中功能一的步骤在ImSQL区块链中生成一个NFT。
S5:孪生NFT到别的区块链系统。将ImSQL区块链中的NFT同时孪生至区块链系统A和区块链系统B上。
S51、区块链上的孪生智能合约基于该区块链上待孪生的原始NFT的id和目标区块链的标识生成孪生NFT请求,该请求包括待孪生的原始NFT的id和目标区块链的标识,以及待孪生的原始NFT对应的所有者账户和存储信息。
(1)在ImSQL区块链上调用合约中synTwinNft()方法,传入NFT的_tokenId以及目标区块链的标识_toBlockchain;
(2)通过步骤(1)中synTwinNft()方法查询到待孪生的原始NFT的所有者账户_owner、JSON文件的_url,并基于上述信息生成孪生NFT请求发送给跨链通信模块,此孪生NFT请求的入参JSON内容如下:
{
"tokenId": "_tokenId",
"owner": "_owner",
"url": "_url",
"toBlockchain":"_toBlockchain",
}
S52、跨链通信模块接收到孪生NFT请求后,数据记录模块根据参数_toBlockchain识别待孪生NFT的目标区块链地址,以及目标区块链上孪生智能合约的合约地址_smartcontractAddress,并基于识别出的目标区块链及其对应的孪生智能合约合约地址向相应孪生智能合约发送孪生NFT的http请求,该请求的JSON格式为:
{
"tokenId": "_tokenId",
"owner": "_owner",
"url": "_url",
"smartcontractAddress":"_smartcontractAddress",
}
此http接口的目的是调用目标区块链系统中地址为smartcontractAddress的孪生智能合约中的twinNft()方法。
S6、在区块链上生成孪生NFT。目标区块链上的孪生智能合约根据孪生NFT的http请求调用孪生智能合约中的twinNft()方法在其所在区块链上生成id为原始NFT的id的NFT,称之为孪生NFT,并标注孪生标志。孪生NFT与原始NFT的唯一区别是是否孪生的标志,即isTwin()方法的返回值不同。
在本实施例的支持数字内容全量可信存储的NFT系统上生成多个孪生NFT后,当其中任何一个NFT发生交易时,采用如下的NFT转移交易方法:
(1)接收到转移NFT请求,用协议中safeTransferFrom()方法,将待转移NFT转移至新的所有者账户_newOwner;
(2)NFT转移成功后,发送NFT转移成功的http请求给跨链通信模块,此请求的入参JSON内容如下:
{
"tokenId": "_tokenId",
"newOwner": "_newOwner",
}
其中,tokenId为待转移NFT的id,newOwner为NFT新的所有者账户;
(3)跨链通信模块接收到NFT转移成功的http请求后,根据数据记录模块中的内容,判断该_tokenId代表的原始NFT和所有孪生NFT所在的区块链地址,并由此找到相应区块链上每个孪生智能合约的合约地址;
(4)跨链通信模块向原始NFT和所有孪生NFT所在的区块链的孪生智能合约发送变更NFT所有者的http请求,请求JSON为:
{
"tokenId": "_tokenId",
"newOwner": "_newOwner",
"smartcontractAddress":"_smartcontractAddress",
}
(5)目标区块链的智能合约接收到http请求后,执行智能合约中setTwinOwner()方法,变更该目标区块链NFT的所有者。
由此,完成了NFT的转移及不同区块链系统上所有孪生NFT的权属状态的同步,避免了各个NFT权属分裂、单独交易等情况所造成的价值分散风险。