title: data-share-nft CreateTime: 2021-12-23 14:07:00 UpdateTime: 2023-10-17 17:40:02 CategoryName: web --- --- title: "data-share-nft" date: 2021-12-23T14:07:00+08:00 draft: false tags: ["web"] categories: ["web"] author: "springrain" --- # 数据共享交换资产化 ## 数据共享交换 基于区块链实现的数据资源合约,完成数据的共享交换. 数据资源合约在内部调用数据加工合约,数据传输合约和数据归集合约,完成数据的归集,传输,加工和展示.如果包含文件附件,返回IPFS地址. 整体步骤如下: - 1.数据资源合约执行GetData合约方法,调用数据加工合约的Working方法 - 2.数据加工合约执行Working合约方法,调用数据传输合约的transmission方法,使用私钥对数据解密,对数据Hash校验,格式转化数据清洗等. - 3.数据传输合约执行transmission方法,调用数据采集合约的Gather方法,采集数据,使用公钥加密 - 4.数据采集合约执行Gather方法,执行数据采集逻辑 合约标准: 必须要有以上所描述的四个合约按照合约执行顺序执行,以上四个合约除了合约内执行的方法外还应包括以下所述所有方法. 合约必须包含 - 1.获取执行步骤的方法,方法名:GetContractStep - 2.获取资源响应格式的合约方法,方法名:GetRespFormat - 3.获取响应数据全量数据格式的合约方法,方法名:GetFullDataFormat - 4.获取合约请求参数格式的合约方法,方法名:GetParamsFormat - 5.获取合约开放条件的合约方法,方法名:GetOpenCondition - 6.数据铸造NFT的方法,方法名:MintNFT ### 获取执行步骤合约的方法 方法名:GetContractStep 数据共享交换使用到的合约信息,返回每个合约的节点名.链名.合约名.所属资源等参数. ```json { index:{ "NodeHost":"所属节点主机(string类型)", "ChanName":"链名称(string类型)", "Name":"合约名(string类型)", "Res":"所属资源(string类型)", "Ext":"扩展属性(string类型)" } } ``` 例如: ```json { 0:{ "NodeHost":"192.168.32.121:37101", "ChanName":"xuper", "Name":"res_dir", "Res":"xxx", "Ext":"xxx" }, 1:{ "NodeHost":"192.168.32.121:37101", "ChanName":"xuper", "Name":"data_working", "Res":"xxx", "Ext":"xxx" }, 2:{ "NodeHost":"192.168.32.121:37101", "ChanName":"xuper", "Name":"data_tran", "Res":"xxx", "Ext":"xxx" }, 3:{ "NodeHost":"192.168.32.121:37101", "ChanName":"xuper", "Name":"data_gather", "Res":"xxx", "Ext":"xxx" } } ``` ### 获取资源响应格式的合约方法 方法名:GetRespFormat 获取合约响应的数据格式,用于说明本合约的主方法的返回格式,例如```json```,```string```,```file```等,根据业务场景约定返回格式 ### 响应数据全量数据格式的合约方法 方法名:GetFullDataFormat 获取合约主方法返回的数据格式结构,包含上链数据和返回的数据 ```json { "statusCode":"状态码(string类型)", "errorMessage":"错误信息(string类型)", "dataFormat":"数据格式(string类型)", "onChainData":{ "key1":"数据1(string类型)" , "key2":"数据2(string类型)" }, "returnData":{ "key1":"数据1(string类型)" , "key2":"数据2(string类型)" } } ``` - ```statusCode```:本次处理的状态码,成功是```success```,失败是```error``` - ```errorMessage```:错误状态时,记录错误的信息 - ```dataFormat```:返回的数据格式,一般是```json```格式 - ```onChainData```:上链的数据,使用json格式,记录上链的key和value - ```returnData```:返回数据的格式,格式和```dataFormat```对应,一般是json格式. 例如: ```json { "statusCode":"success", "errorMessage":"", "dataFormat":"json", "onChainData":{ "name":"数据1(string类型)" , "data":"数据2(string类型)" }, "returnData":{ "name":"数据1(string类型)" , "data":"数据2(string类型)" } } ``` ### 获取请求参数格式的方法 方法名:GetParamsFormat 获取合约主方法的调用参数格式 ```json { "数据名称":"数据说明(数据类型)" } ``` 例如: ```json { "id":"主键(string类型)", "name":"名称(string类型)", "job":"任务作业名称(string类型)" } ``` ### 获取合约开放条件的方法 方法名:GetOpenCondition 返回合约主方法开放的条件,类型为字符串 例如:```获取授权或者是管理员``` ### 数据铸造NFT的方法 方法名:MintNFT 把数据内容铸造成NFT藏品,获取NFT藏品之后才可以正常调用数据资产 参数如下: - ```tokenID```:铸造的NFT藏品ID,每个数字资产商品保持唯一,(int64类型) - ```amount```:铸造的数量(int类型) - ```data```:藏品内容([]byte字节数组类型) 返回值为 ```error```错误信息字符串. ## NFT资产交易 允许在同一个智能合约中无限量地重复使用同质化或者非同质化的Token,数据资源合约调用NFT合约,实现数据资源的NFT铸造 基于ERC-1155合约改造,统一使用Action方法作为入口,实现NFT铸造,转移,销毁等功能 ### Action入口方法 方法名:Action NFT的入口方法,```action```参数标识需要执行的动作,其他参数是动作方法需要的参数 ### 获取NFT资产的uri方法 返回一个 https://token-cdn-domain/{id}.json 字符串,id会使用tokenID 替换成64位字符串, 不够使用0补齐,类似https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json json文件内是Token的额外扩展信息, 调用```Action``` 方法,传递参数```action=uri```,具体参数如下: ```json { "action":"uri", "tokenID":"NFT资产的TokenID(int64类型)" } ``` 例如: ```json { "action":"uri", "tokenID":12635527497359748 } ``` ### 铸造NFT Token的方法 为 ```to``` 账户铸造数量 ```amount``` 个的 ```tokenID``` NFT资产 调用```Action``` 方法,传递参数```action=mint```,具体参数如下: ```json { "action":"mint", "to":"铸造token的账户地址(string类型)", "amount":"铸造的token数量(int64类型)", "tokenID":"NFT资产的TokenID(int64类型)" } ``` 例如: ```json { "action":"mint", "to":"TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY", "amount":1000, "tokenID":12635527497359748 } ``` ### 销毁NFT Token的方法 销毁 ```from``` 账户 ```amount``` 个 ```tokenID``` NFT资产 调用```Action``` 方法,传递参数```action=burn```,具体参数如下: ```json { "action":"burn", "from":"销毁token的账户地址(string类型)", "amount":"销毁的token数量(int64类型)", "tokenID":"NFT资产的TokenID(int64类型)" } ``` 例如: ```json { "action":"burn", "from":"TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY", "amount":1000, "tokenID":12635527497359748 } ``` ### 转移NFT Token的方法 将 ```amount``` 个 ```tokenID``` 从 ```from``` 账户转移到 ````to````账户 (安全的) 调用者必须得到授权才可以从参数 ```from``` 指定的账户转账token 如果参数 ```to``` 设定的地址为零地址,则交易必须回滚 对参数 ```tokenID``` 所指的token,如果其转出账户的余额小于参数 ```amount``` 所定义的金额,则交易必须回滚 如果转账交易出现任何其它错误,交易也必须回滚 调用```Action``` 方法,传递参数```action=safeTransferFrom```,具体参数如下: ```json { "action":"safeTransferFrom", "from":"需要转移token的账户地址(string类型)", "to":"接受token的账户地址(string类型)", "amount":"销毁的token数量(int64类型)", "tokenID":"NFT资产的TokenID(int64类型)", "data":"参数数据([]byte字节数组)" } ``` 例如: ```json { "action":"safeTransferFrom", "from":"TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY", "to":"bQJ4yoQdAkrNqnzbDcETJGQTr5mJpf4YB", "amount":1000, "tokenID":12635527497359748, "data":[] } ``` ### 获取账户余额的方法 获取 ```owner``` 账户中的token余额,需要授权才能查询账户余额 调用```Action``` 方法,传递参数```action=balanceOf```,具体参数如下: ```json { "action":"balanceOf", "owner":"token持有者账户(string类型)", "tokenID":"NFT资产的TokenID(int64类型)" } ``` 例如: ```json { "action":"balanceOf", "owner":"TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY", "tokenID":12635527497359748 } ``` ### 授权管理NFT资产方法 授权或撤销其他操作者```to```管理其所有的token 调用```Action``` 方法,传递参数```action=setApprovalForAll```,具体参数如下: ```json { "action":"setApprovalForAll", "to":"被授权人账户(string类型)", "approved":"true 给{to}授权,false 撤销 {to}授权(bool 布尔类型)" } ``` 例如: ```json { "action":"setApprovalForAll", "to":"TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY", "approved":true } ``` ### 获取NFT授权管理状态 ```owner``` 资产给 ```operator``` 的授权状态,返回bool值 调用```Action``` 方法,传递参数```action=isApprovedForAll```,具体参数如下: ```json { "action":"isApprovedForAll", "owner":"NFT拥有人的账户(string类型)", "operator":"被授权人账户(string类型)" } ``` 例如: ```json { "action":"isApprovedForAll", "owner":"TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY", "operator":"bQJ4yoQdAkrNqnzbDcETJGQTr5mJpf4YB" } ```