RWAs练习 1-房地产通证化01

**使用的通证标准:ERC-1155

理解1155:

1. 核心创新:混合型代币

ERC1155 = NFT(非同质化代币) + FT(同质化代币)的混合体。就像你在数据库里设计了一张表,每行记录既可以存储唯一的NFT数据(比如房地产信息),又可以存储可分割的FT数据(比如游戏金币)。

2. 左边NFT部分(每个ID唯一)​

  • erc1155.uri(id):相当于每个代币ID对应的API接口,返回元数据(类似你熟悉的REST API返回JSON)
  • 元数据示例:图片URL、房产地址、建造年份等(就像你在Web2中存储的带附件的数据库记录)

3. 右边FT部分(同质化代币)​

  • 用圆形数量表示可分割性(比如代币ID=2对应1000个同质化代币,类似ERC20代币)
  • 可用于游戏金币、积分等需要批量操作的场景

4. 开发者优势(对比传统ERC20/ERC721)​

  • 节省Gas费:批量转账(比如同时转5个NFT+100个FT)
  • 节省存储:一个合约管理所有类型代币(不用为NFT和FT分别部署合约)
  • 原子操作:像数据库事务一样同时处理多种代币(比如用1个NFT+50个FT兑换1个高级NFT)

举个Web2类比

假设你在开发一个游戏:

  • 传统方式:用户表(MySQL) + 金币表(MongoDB) + 道具表(Redis)
  • ERC1155方式:所有数据存在一个智能合约里,通过代币ID区分不同类型,且支持批量操作

为什么重要?

这种设计特别适合需要复杂经济体系的场景:元宇宙道具系统(皮肤NFT+金币FT)、房地产凭证(房产NFT+产权份额FT)、游戏装备(唯一武器NFT+弹药FT)等,你现在只需要维护一个智能合约就能实现过去需要多个系统配合的功能。

使用的API:Zillow

区块链选择两个考虑点:

  1. 是否能使用CCIP
  2. gas费用是否低廉

链下数据获取

为了创建一个与现实世界资产关联并反映其价值的链上资产,我们需要将区块链与现实世界进行连接。为实现这一目标,我们将使用 :

  • Chainlink Functions: 将使我们能够从 Zillow API 上读取数据
  • Automation 服务: 将自动化这一调用过程实现数据每日更新

写代码:获取资产的基本信息

js 复制代码
// Import the ethers library from npm
const { ethers } = await import("npm:ethers@6.10.0");
const Hash = await import("npm:ipfs-only-hash@4.0.0");

// Make an HTTP request to fetch real estate data
const apiResponse = await Functions.makeHttpRequest({
  url: `https://api.bridgedataoutput.com/api/v2/OData/test/Property('P_5dba1fb94aa4055b9f29696f')?access_token=6baca547742c6f96a6ff71b138424f21`,
});//源数据

// Extract relevant data from the API response
const realEstateAddress = apiResponse.data.UnparsedAddress;
const yearBuilt = Number(apiResponse.data.YearBuilt);
const lotSizeSquareFeet = Number(apiResponse.data.LotSizeSquareFeet);
const livingArea = Number(apiResponse.data.LivingArea);
const bedroomsTotal = Number(apiResponse.data.BedroomsTotal);

const metadata = {
  name: "Real Estate Token",
  attributes: [
    { trait_type: "realEstateAddress", value: realEstateAddress },
    { trait_type: "yearBuilt", value: yearBuilt },
    { trait_type: "lotSizeSquareFeet", value: lotSizeSquareFeet },
    { trait_type: "livingArea", value: livingArea },
    { trait_type: "bedroomsTotal", value: bedroomsTotal }
  ]
};

// Stringify the JSON object
const metadataString = JSON.stringify(metadata);

const ipfsCid = await Hash.of(metadataString);
console.log(ipfsCid);

return Functions.encodeString(`ipfs://${ipfsCid}`);

写完之后进行测试和验证

测试:Functions Playground

把output拿出来验证: ipfs.io/ipfs/QmRYfrZ4yobkBMUD3Y4d4NV28ZeTUFCBwWSm1Z3B2Ndkca

这样就成功了。下面就是资产的基本信息:

js 复制代码
{
  "name": "Real Estate Token",
  "attributes": [
    {
      "trait_type": "realEstateAddress",
      "value": "#836 490 Sandy Vista Mills, Destineyhaven, Ohio 98253"
    },
    {
      "trait_type": "yearBuilt",
      "value": 1969
    },
    {
      "trait_type": "lotSizeSquareFeet",
      "value": 1998
    },
    {
      "trait_type": "livingArea",
      "value": 7411
    },
    {
      "trait_type": "bedroomsTotal",
      "value": 4
    }
  ]
}

写代码:收集定价信息

js 复制代码
// Import ethers library
const { ethers } = await import("npm:ethers@6.10.0");

// Create ABI coder for data encoding
const abiCoder = ethers.AbiCoder.defaultAbiCoder();

// Get token ID from input arguments
const tokenId = args[0];

// Fetch property data from API
const apiResponse = await Functions.makeHttpRequest({
  url: `https://api.bridgedataoutput.com/api/v2/OData/test/Property('P_5dba1fb94aa4055b9f29696f')?access_token=6baca547742c6f96a6ff71b138424f21`,
});

// Extract and convert pricing data to numbers
const listPrice = Number(apiResponse.data.ListPrice);
const originalListPrice = Number(apiResponse.data.OriginalListPrice);
const taxAssessedValue = Number(apiResponse.data.TaxAssessedValue);

// Encode data for NFT use
const encoded = abiCoder.encode(
  [`uint256`, `uint256`, `uint256`, `uint256`],
  [tokenId, listPrice, originalListPrice, taxAssessedValue]
);

// Log data for verification
console.log(
  `Token ID: ${tokenId} \nList Price: ${listPrice} \nOriginal List Price: ${originalListPrice} \nTax Assessed Value: ${taxAssessedValue}`
);

// Return encoded data as bytes
return ethers.getBytes(encoded);
相关推荐
mldong4 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排5 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60615 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角6 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!6 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰7 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi8 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen9 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马9 小时前
AI源码分析:拆解模型底层实现逻辑
前端
IT_陈寒10 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端