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);
相关推荐
好_快23 分钟前
Lodash源码阅读-nth
前端·javascript·源码阅读
maybe啊28 分钟前
js 使用 Web Workers 来实现一个精确的倒计时,即使ios手机锁屏或页面进入后台,倒计时也不会暂停。
开发语言·前端·javascript
好_快29 分钟前
Lodash 源码阅读-baseNth
前端·javascript·源码阅读
好_快32 分钟前
Lodash源码阅读-join
前端·javascript·源码阅读
子洋33 分钟前
Chroma+LangChain:让AI联网回答更精准
前端·人工智能·后端
好_快35 分钟前
Lodash源码阅读-isIndex
前端·javascript·源码阅读
好_快37 分钟前
Lodash源码阅读-reverse
前端·javascript·源码阅读
Gazer_S2 小时前
【基于 SSE 协议与 EventSource 实现 AI 对话的流式交互】
前端·javascript·人工智能·交互
银迢迢3 小时前
如何创建一个Vue项目
前端·javascript·vue.js
几何心凉6 小时前
如何解决Vue组件间传递数据的问题?
前端·javascript·vue.js