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:[email protected]");
const Hash = await import("npm:[email protected]");

// 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:[email protected]");

// 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);
相关推荐
Senar3 小时前
如何判断浏览器是否开启硬件加速
前端·javascript·数据可视化
HtwHUAT4 小时前
实验四 Java图形界面与事件处理
开发语言·前端·python
利刃之灵4 小时前
01-初识前端
前端
codingandsleeping4 小时前
一个简易版无缝轮播图的实现思路
前端·javascript·css
天天扭码4 小时前
一分钟解决 | 高频面试算法题——最大子数组之和
前端·算法·面试
全宝4 小时前
🌏【cesium系列】01.vue3+vite集成Cesium
前端·gis·cesium
拉不动的猪5 小时前
简单回顾下插槽透传
前端·javascript·面试
烛阴5 小时前
Fragment Shader--一行代码让屏幕瞬间变黄
前端·webgl
爱吃鱼的锅包肉5 小时前
Flutter路由模块化管理方案
前端·javascript·flutter
风清扬雨6 小时前
Vue3具名插槽用法全解——从零到一的详细指南
前端·javascript·vue.js