前言
本文将详细介绍如何利用 Ethers.js 库来创建个性化的区块链铭文,并深入探讨铭文技术的各项特性
比特币相关概念
总量:2100万枚
最小单位:聪(sat)
单位换算表
| 单位 | 中文名称 | 英文名称 | 换算关系 |
|---|---|---|---|
| BTC | 比特币 | Bitcoin | 1 BTC |
| cBTC | 比特分 | Bitcent | 0.01 BTC |
| mBTC | 毫比特 | Milli-Bitcoin | 0.001 BTC |
| μBTC | 微比特 | Micro-Bitcoin | 0.000001 BTC |
| sat | 聪 | Satoshi | 0.00000001 BTC |
什么是铭文
一种将数据(如文本、图片、音频、视频等)永久写入区块链的技术。通过Ordinals协议,将数据存储在区块链的某个最小单位(如比特币的“聪”)中,从而实现数据的不可篡改和永久存储。
铭文的技术实现
比特币铭文(通过Ordinals协议)
-
核心原理:比特币铭文通过Ordinals协议实现,该协议为比特币的最小单位“聪”分配唯一编号(序号),用户可以将任意数据(如文本、图片、音频等)作为元数据写入到特定的聪中。
-
技术细节:铭文数据存储在比特币交易的见证(Witness)字段中,利用隔离见证(SegWit)和Taproot升级提供的技术空间。
-
创建过程:
- 选择要铭刻的数据(如文本、图片等)。
- 将数据转换为适合存储的格式(如Base64编码)。
- 创建一笔比特币交易,将数据写入交易的见证字段。
- 发送交易到比特币网络,等待确认。
以太坊铭文(通过Ethscriptions协议)
-
核心原理:以太坊铭文通过Ethscriptions协议实现,允许用户将数据写入以太坊交易的
calldata字段。 -
技术细节:数据以16进制字符串的形式存储在交易中,用户可以通过智能合约或直接发送交易来创建铭文。
-
创建过程:
- 将要铭刻的内容转换为16进制字符串。
- 创建一笔以太坊交易,将16进制字符串填入
calldata字段。 - 发送交易到以太坊网络,等待确认。
铭文的应用场景
- 数字艺术和收藏品:艺术家可以将作品直接嵌入区块链,创建独一无二的数字艺术品,这些艺术品可以在市场上进行交易。
- 数字身份和所有权证明:铭文可以作为数字身份或所有权证明的形式,确保数据的真实性和不可篡改。
- 智能合约和协议:企业可以使用铭文进行智能合约和协议的记录,确保交易的透明性和安全性。
- 版权保护:创作者可以通过铭文技术在区块链上注册作品,确保作品的原创性和版权归属。
铭文的争议与挑战
- 网络拥堵和手续费:铭文的大量使用可能导致区块链网络拥堵,增加交易手续费。
- 对区块链本质的争议:部分比特币社区成员认为,比特币应保持其作为价值转移和存储的简单特性,而铭文的出现可能会使比特币网络变得复杂。
代码实例实现以及相关说明
-
文字铭文
const { ethers } = require("hardhat");
async function sendTextInscription() {
// 替换为你的钱包私钥和目标地址
const privateKey = "0xac0974xxxxxx";//钱包私钥
// 替换为你的节点提供商URL
const provider = new ethers.JsonRpcProvider("https://sepolia.infura.io/v3/{object_id}");
const wallet = new ethers.Wallet(privateKey, provider);
const strtoHex=(str)=>{
return "0x"+Buffer.from(str,"utf-8").toString("hex")
}
const inscriptionContent='{"p": "erc-20","op": "deploy","tick": "boykayuri","max": "21000000","lim": "10000"}'//格式参考https://domo-2.gitbook.io/brc-20-experiment
const hexData = strtoHex(inscriptionContent);
// 构建交易
const tx = {
to: wallet.address,
value: ethers.parseEther("0.0"), // 可以发送少量ETH作为交易的一部分
data: hexData,
// nonce: await provider.getTransactionCount(wallet.address),
// gasLimit: 1000000, // 根据需要调整gas限制
// gasPrice: ethers.parseUnits("20", "gwei") // 根据网络情况调整gas价格
};
// 签名并发送交易
const txResponse = await wallet.sendTransaction(tx);
console.log("Transaction Hash:", txResponse.hash);//拿到交易hash在区块浏览器上验证
// 等待交易被打包进区块
const receipt = await txResponse.wait();
console.log("Transaction Receipt:", receipt);
}
sendTextInscription().catch(console.error);
-
图片铭文
const { ethers } = require("hardhat");
const fs = require('fs');
const path = require('path');
async function sendImageInscription() {
// 替换为你的钱包私钥和目标地址
const privateKey = "5025c087dedcf32dxxxxx";//钱包私钥
const toAddress = "0xf39xxxxx";
// 替换为你的节点提供商URL
const provider = new ethers.JsonRpcProvider("https://sepolia.infura.io/v3/{object_id}");
const wallet = new ethers.Wallet(privateKey, provider);
// 图片路径
const imagePath = path.join(__dirname, 'logo.jpg');//读取图片
// 读取图片并转换为Base64编码
const imageBuffer = fs.readFileSync(imagePath);
const base64Image = imageBuffer.toString('base64');
// 构建铭文数据
const inscriptionData = `data:image/png;base64,${base64Image}`;
// 将铭文数据转换为16进制字符串
const hexData = ethers.solidityPacked(["string"], [inscriptionData]);
// 构建交易
const tx = {
to: toAddress,//转向目标地址
value: ethers.parseEther("0.0"), // 可以发送少量ETH作为交易的一部分
data: hexData,
nonce: await provider.getTransactionCount(wallet.address),
gasLimit: 1000000, // 根据需要调整gas限制
gasPrice: ethers.parseUnits("20", "gwei") // 根据网络情况调整gas价格
};
// 签名并发送交易
const txResponse = await wallet.sendTransaction(tx);
console.log("Transaction Hash:", txResponse.hash);//拿到hash在区块浏览器上验证
// 等待交易被打包进区块
const receipt = await txResponse.wait();
console.log("Transaction Receipt:", receipt);
}
sendImageInscription().catch(console.error);
-
验证图片
-
代码实例说明
- 供应商:主要使用infura供应商的sepolia链,
- 合约说明:不管是文字、图片、音视频铭文等最主要的区别在Tx中的data的不同,
- 验证浏览器:验证发布的sepolia区块浏览器
- 文字铭文参考:文字铭文格式参考
总结
铭文技术为区块链带来了新的应用场景和可能性,但同时也引发了关于其对区块链本质和网络性能影响的讨论。