通过碎片化NFT实现商业模式创新

通过碎片化NFT实现商业模式创新

今年早些时候,我们使用区块链应用构建器(Blockchain App Builder)发布了符合ERC-1155标准的可替代和非可替代代币支持。ERC-1155标准使应用开发人员可以使用单个链码创建可替代和非可替代代币。我们始终相信简单性,而ERC-1155使链码的开发和维护变得更加简单和容易。我们通过40多个REST API扩展了ERC-1155支持,以创建完整的代币生命周期,并加快市场上任何代币应用的推出速度。今年9月,我们基于ERC-1155发布了可拆分非可替代代币(fractional NFT)支持,以自动生成完整的碎片化非可替代代币的生命周期。

资产碎片化是资产代币化的重要概念。当资产价值增加时,购买资产的倾向减弱。这使得资产变得不流动。资产碎片化创造了一种商业模式创新,买家可以购买高价值资产的一部分。购买高价值资产的一部分增加了购买和销售资产的倾向,并增加了资产的流动性。碎片化NFT促进了高价值资产的共同所有权,并促进包容性,从而创建了一个更加民主的NFT市场。

碎片化NFT为现实世界的企业带来了创新。例如,一个房地产或一件艺术品可以由多个所有者拥有,知识产权可以轻松跟踪并在多个组织之间共享,音乐家、出版商和体育联盟可以通过众包为他们的新作品提供更好的资金支持,并加强与粉丝的联系。创意社区可以根据地区范围或其他因素将其作品作为原始NFT的碎片化许可证授权给多个组织。代表授予奖励的信件可以追溯到不仅是直接受助者,还包括子受助者,这在政府拨款进一步由初步受助者细分为子拨款的情况下经常发生。

区块链应用构建器使应用开发人员能够自动生成可替代和非可替代代币链码,并在本地Hyperledger Fabric或Oracle Blockchain Platform Cloud Services上部署、测试和调试链码。区块链应用构建器现在还通过碎片化非可替代代币增强了商业模式创新。我们坚信,区块链中的代币化不仅仅是为了成本优化,还包括增加收入。当更多人参与市场时,就有可能增加收入,而碎片化NFT有助于企业增加参与度。

NFT的实现可以通过4个简单的步骤来完成:

  1. 规范模板中的资产声明
  2. 使用所有核心生命周期方法(创建,转移等)自动生成碎片化NFT链码
  3. 添加自定义逻辑以处理链码方法的附加市场功能
  4. 使用REST API对碎片化NFT链码进行测试

碎片化NFT案例示例

为了说明使用区块链应用构建器实现碎片化NFT的过程,我们选择了一个房地产市场的使用案例,以模拟对房地产进行部分所有权。NFT平台提供商将房地产开发商引入平台。开发商(建筑商)为一个房地产创建了一个碎片化NFT,并为该房地产NFT创建了总的代币份额数量。例如,一个房地产开发商可以为代表价值50万美元的2000平方英尺房地产创建10个代币份额。这意味着一个代币份额代表该房地产的200平方英尺,买家可以以50,000美元购买代表10%所有权的一个代币份额。

如果两个买家分别从房地产开发商购买了2个代币份额和3个代币份额,那么买家1需要支付10万美元购买2个代币份额(即400平方英尺的房产),而买家2需要支付15万美元购买3个代币份额(即600平方英尺的房产)。房地产开发商可以根据市场价值定期设定房地产的销售价格。如果整个房产的销售价格根据市场价值达到60万美元,那么买家1可以以12万美元的价格出售2个代币份额,获利2万美元。

房地产开发商还可以出租该房产。拥有该房产百分比代币份额的买家还可以从租金金额中获得相应的百分比份额。

如果你想了解更多关于区块链的相关内容,可以阅读以下这些文章:
香港证券交易所推出基于区块链的结算平台
区块链技术是如何影响人们的投资方式的?
伯克利可能成为美国第一个允许对区块链进行投资的城市
区块链的普及将如何提高互联网的质量?

图1.房地产市场中的碎片化NFT:卖方为房产创建碎片化NFT,并创建总代币份额
图2.房地产市场中的部分NFT:买方通过支付网关支付等额的销售价格来购买部分所有权
  • 规范模板

在区块链应用构建器的Visual Studio Code (VSC)扩展中的规范下,包含了一个示例模板,或者你可以从区块链应用构建器页面的OBP控制台>开发者工具中下载。规范模板可以使用yaml或json格式创建。用于NFT链码自动生成的模板包括以下几个部分。

  • 代币模型
assets:
 - name: RealEstateProperty #Asset name
   type: token         # Asset type
   standard: erc1155+   # Token standard (extended version of ERC-1155 spec)
   anatomy:
      type: nonfungible # Token type
      unit: fractional       # Token unit

基于ERC-1155标准对碎片化NFT的支持,用户可以将代币标准指定为erc1155+。代币标准中的“+”符号表示我们支持超出ERC-1155标准的附加功能和方法,使NFT更加动态,NFT应用程序更加灵活。然后,在代币解剖部分,将类型指定为非同质化(nonfungible),单位指定为碎片化(fractional)

  • 代币行为
behavior:
    - divisible                                 
    - mintable:                  
    - transferable               
    - roles:
         minter_role_name: minter

根据代币行为的选择,NFT的生命周期方法会被自动生成。在角色行为中,你可以指定用于铸造和/或销毁操作的角色 – 在下面的示例中,我们指定了一个“铸造者”角色。当在规范文件中指定了铸造者角色时,你需要分配可以使用生成的API创建/铸造碎片化NFT的用户。除了代币数据资产之外,我们还在链上生成和维护托管钱包。这些钱包由用户的组织ID(实例所有者的MSPId或客户组织的自定义注册ID)和用户ID标识,并可以通过生成的方法和API进行管理。

  • 自定义属性
properties:  # Custom asset attributes for non-fungible token
    - name: propertySellingPrice # Custom asset attribute to set the real estate property price
      type: number
    - name: propertyRentingPrice # Custom asset attribute maintains the renting amount for the real estate property
      type: number

我们在我们的用例中为碎片化NFT添加了两个自定义属性:房产销售价格,用于指定房地产NFT的销售价格,以及房屋租赁价格,用于指定房地产NFT的租赁金额。自定义属性可以由NFT所有者动态更新。

  • 元数据属性
metadata: # To maintain the metadata on-chain, this tag will be used. Once token has been created, users won't be able to update the metadata attribute values.
    - name: propertyType
      type: string
    - name: propertyName
      type: string
    - name: propertyAddress
      type: string
    - name: propertyImage
      type: string

你可以选择在链上维护元数据属性的副本,以描述NFT。在这个例子中,我们定义了属性类型、属性名称、属性地址和属性图片等属性。与自定义属性不同,元数据属性在创建NFT时提供,并且之后无法修改。

  • 自定义方法
customMethods:
    - executeQuery
    - "setPropertySellingPrice(tokenId: string, propertySellingPrice: number)" # Set the property selling price
    - "setPropertyRentingPrice(tokenId: string, propertyRentingPrice: number)" # Set the property renting price
    - "buyProperty(fromOrgId: string, fromUserId: string, toOrgId: string, toUserId: string, tokenId: string[], tokenShare: number[], sellingAmountPaid: number)"  # Buy the real estate property non-fungible token share after paying the amount using any payment gateway

这些方法在此处指定,以便开发人员可以通过自定义方法添加特定的业务功能。当你使用此模板创建链码时,会自动生成用于管理NFT生命周期的所有其他方法和API,从初始化到创建和转移,以及帐户创建和角色管理以及各种查询。请注意,executeQuery是一个预先生成的方法,并作为API公开给状态数据库的通用查询。

setPropertySellingPrice、setPropertyRentingPrice和buyProperty方法被生成为函数签名,用户可以通过利用App Builder生成的基础代币SDK方法添加自定义业务逻辑。使用ERC1155+代币标准类型,你还可以在同一个规范文件中包含可替代代币、非可替代代币和非代币资产,并且所有与这些资产相关的方法也将被生成。

生成碎片化NFT链码

定制模板后,你可以在App Builder中生成链码。在Visual Studio Code扩展的GUI中,单击链码部分右侧的“+”图标,这将弹出右侧的弹出窗口,你可以在其中创建链代码。

图3.区块链应用构建器-自动生成Chaincode

只需填写链码名称,从语言下拉菜单中选择TypeScript,在下拉列表中选择模板,填写用于搭建项目的位置(仅在生成TypeScript时),选中“启用MVCC优化”复选框,然后点击“创建”按钮以搭建项目并生成链码。规范文件仅针对TypeScript,其中指定了三个自定义方法签名,参数类型是特定于语言的。如果要在Go中生成链码,则需要更改自定义方法签名中的参数规范和数据类型,以与Go兼容(例如,将number类型更改为int)

自定义方法

在使用TypeScript搭建项目后,需要在src目录下的controller.ts文件中更新自定义方法(即setPropertySellingPrice、setPropertyRentingPrice和buyProperty)的逻辑。

自定义方法“setPropertySellingPrice”将使用下面的示例代码设置房产NFT的销售价格。

@Validator(yup.string(), yup.number())
  public async setPropertySellingPrice(tokenId: string, propertySellingPrice: number) {
    try {
      const token = await this.Ctx.ERC1155Token.get(tokenId);
      const t = new RealEstateProperty(token);
      t.propertySellingPrice =  propertySellingPrice;
      await this.Ctx.ERC1155Token.update(t);
      let msg = `Token ID : '${tokenId}' has been updated with latest property selling price'`;
      return {msg}
      } catch(error) {
          throw new Error(error.message);
    }
  }

自定义方法“setPropertyRentingPrice”将使用下面的示例代码设置房产NFT的租赁价格。

@Validator(yup.string(), yup.number())
  public async setPropertyRentingPrice(tokenId: string, propertyRentingPrice: number) {
    try {
      const token = await this.Ctx.ERC1155Token.get(tokenId);
      const t = new RealEstateProperty(token)
      t.propertyRentingPrice =  propertyRentingPrice;
      await this.Ctx.ERC1155Token.update(t);
      let msg = `Token ID : '${tokenId}' has been updated with latest property renting price'`;
      return {msg}
      } catch(error) {
          throw new Error(error.message);
    }
  }

买方调用“buyProperty”自定义方法,从房地产建筑商那里购买一小部分房产NFT。

@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.array().of(yup.string()), yup.array().of(yup.number()), yup.number())
  public async buyProperty(fromOrgId: string, fromUserId: string, toOrgId: string, toUserId: string, tokenId: string[], tokenShare: number[], amountPaid: number) {
    try {
      const token = await this.Ctx.ERC1155Token.get(tokenId[0]);
      const t = new RealEstateProperty(token);
      const sellingAmountShare = (t.propertySellingPrice/t.quantity)*tokenShare[0]
      let msg = `'${tokenShare[0]}' token shares of Token ID : '${tokenId}' has not been transferred'`;
      if (sellingAmountShare === amountPaid) {
            const from_account_id = await this.Ctx.ERC1155Account.generateAccountId(fromOrgId, fromUserId, ACCOUNT_TYPE.USER_ACCOUNT);
            const to_account_id = await this.Ctx.ERC1155Account.generateAccountId(toOrgId, toUserId, ACCOUNT_TYPE.USER_ACCOUNT);
            await this.Ctx.ERC1155Token.batchTransferFrom(from_account_id, to_account_id, tokenId, tokenShare);
            await this.Ctx.Model.update(t);
            msg = `'${tokenShare[0]}' token shares of Token ID : '${tokenId}' has been successfully transferred to UserID : '${toUserId}'`;
      }
      else {
              throw new Error(`'${tokenShare[0]}' token shares of Token ID : '${tokenId}' has not been transferred to UserID : '${fromUserId}' as the amount paid :  '${amountPaid}' is not equal to the selling amount share : '${sellingAmountShare}'.'`);
      }
      return {msg};
    } catch(error) {
        throw new Error(error.message);
    }
  }

一旦你将这些方法复制到controller.ts并保存链码,你可以使用Deploy选项卡将其部署到你的Oracle Blockchain平台实例中。在使用Blockchain App Builder Visual Studio Code扩展部署NFT链码时,你需要传递代币管理员的组织ID和用户ID来初始化NFT链码。一旦链码部署成功,代币管理员将能够创建NFT账户,将NFT铸造者角色分配给用户,并能够添加其他管理员用户。

使用REST API测试碎片化NFT链码

为了测试碎片化NFT链码,我们可以使用REST API调用链码方法。REST API可以使用Postman进行简单的测试,Postman是一种流行的REST API测试工具。这些API可以轻松地集成到其他系统或自定义前端,如Web或移动应用程序中。可以从OBP控制台>开发人员工具使用“下载规范示例和相关代码”链接下的“FractionalNFTinRealEstate”文件夹中下载示例Postman collection文件。解压下载的“obp-app-builder-samples”文件,进入“FractionalNFTinRealEstate”文件夹。将“Fractional NFT in Real Estate – TypeScript.postman_collection.json” Postman collection导入到Postman中。

如下图所示,碎片化NFT链码的测试可以通过以下7个简单步骤完成。

  1. 创建用户账户和NFT账户
  2. 为NFT资产的用户账户添加铸造者角色
  3. 创建房地产NFT
  4. 设置房地产的销售价格
  5. 在市场上购买房地产NFT的一部分
  6. 跟踪房地产NFT的完整历史记录
  7. 根据用户获取账户详细信息
图4.房地产市场

你可以参考“如何在Oracle Blockchain上设置和交易NFT”博客文章中关于符合ERC-721标准的NFT的“创建NFT账户”部分,了解如何创建Identity Cloud Service(IDCS)用户以及如何在Hyperledger Fabric上创建用户身份。

请注意,你必须打开Postman集合的变量选项卡以设置变量值。这些值将在所有API调用中重复使用。

图5.具有更新变量值的Postman集合

1. 创建用户帐户和NFT帐户

一旦用户身份和自定义注册已经设置好,NFT管理员可以通过调用自动生成的方法“createAccount”在链上创建NFT账户。“createAccount”方法可以在一个事务中创建一个用户账户,并在该用户账户下创建一个可替代通证账户和一个NFT账户。一个用户账户可以持有多个可替代通证账户,但只能拥有一个NFT账户。每个组织ID下的每个用户ID只会有一个用户账户。

图6. createAccount API的Postman请求/响应

托管钱包用户账户以及NFT通证账户现已创建;请注意,在响应体中,结果包括区块链交易ID以及指示资产类型为“ouaccount”的有效负载和其属性 – 与账户关联的accountID、userID和orgID,关联的NFT账户ID以及账户中当前NFT的数量。

可以使用相同的API创建其他房地产建筑商和市场用户的附加账户,只需在请求体中更改orgID和userID的值即可。

2. 为NFT资产的用户账户添加铸造者角色

NFT管理员可以通过将铸造者角色分配给NFT账户来指定哪个用户可以铸造NFT。NFT管理员将调用自动生成的方法“addRole”,将铸造者角色分配给特定NFT资产的现有NFT账户。

指定的账户现在可以铸造或创建NFT,与此链上关联的交易ID将与响应结果一起返回,同时返回成功消息。你可以为任何其他房地产建筑商的账户添加此角色。

图7.addRole API

3. 创建房地产NFT

具有铸造者角色的用户可以通过调用自动生成的方法“createRealEstatePropertyToken”来创建/铸造NFT。请注意,该方法在名称中包含了类名“RealEstateProperty”,因为它是从RealEstateProperty NFT类的模板生成的。铸造NFT后,该通证将自动归属于铸造该通证的用户,并存放在他们的托管钱包中。

图8.createRealEstatePropertyToken API

4. 设置房地产的销售价格

房地产建筑商可以设置房产的销售价格,并可以根据市场价格进行更新。

图9.setPropertySellingPrice API

5. 在市场上购买房地产NFT的一部分

一旦房产NFT被铸造并设置了销售价格,任何不是当前NFT所有者的用户现在都可以购买该房产NFT的一部分。此示例中未显示付款集成,但市场应用可以使用已发布的API与各种支付网关集成,以处理法定货币支付;例如,使用Oracle Integration Cloud PayPal适配器、Oracle Monetization Cloud或更灵活的Oracle CX Commerce支付选项。或者你可以使用OBP可替代通证,可能是通过法定货币支付或从公共区块链交换加密通证而获得的,然后将NFT支付处理为从买家账户转账到卖家账户的可替代通证转移。

一旦付款完成,市场可以调用自定义方法“buyProperty”来将房地产建筑商的钱包(即NFT铸造者的账户)中的一部分房地产NFT转移给新买家的账户。

图10.buyProperty API

6. 跟踪房地产NFT的完整历史记录

任何用户都可以使用REST API通过“chaincode-queries” URI调用自动生成的方法“getTokenHistory”来跟踪房产NFT的完整历史记录,而不是使用“transaction” URI。

图11.gertTokenHistory API

7. 根据用户获取账户详细信息

任何用户都可以通过在URI中使用“chaincode-queries”调用自动生成的方法“getAccountDetailsByUser”来检查自己的用户账户详细信息,而不是使用“transaction”。响应将显示用户在其NFT账户中拥有的NFT ID和关联的通证份额。

图12.getAccountDetailsByUser API

在本文中,我们阐述了如何利用碎片化NFT创建创新的商业模式。碎片化NFT具有吸引更多人进入市场。我们坚信,包容性和更广泛的获取渠道推动了更大的商业创新,而碎片化NFT可以打造一个更具包容性的社会。我们展示的功能使应用程序开发人员和业务用户能够快速原型化他们的用例,并生成可用于生产的部分NFT链代码。我们的目标是让应用程序开发人员、顾问和业务用户能够快速开发部分NFT用例,并通过显著降低开发成本和实现创新的商业模式来提高其采用率。

感谢阅读!我们欢迎你在反馈部分提出问题/意见。你还可以订阅我们的YouTube频道,观看大量大数据行业相关公开课:https://www.youtube.com/channel/UCa8NLpvi70mHVsW4J_x9OeQ;在LinkedIn上关注我们,扩展你的人际网络!https://www.linkedin.com/company/dataapplab/

原文作者:Gourav Sarkar
翻译作者:文杰
美工编辑:过儿
校对审稿:Jason
原文链接:https://blogs.oracle.com/blockchain/post/business-model-innovation-through-fractional-nft