**使用的通证标准: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
区块链选择两个考虑点:
- 是否能使用CCIP
- 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}`);
写完之后进行测试和验证
把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);