使用Ethers.js在以太坊上创建和验证铭文
前言
本文将详细介绍如何利用 Ethers.js 库来创建个性化的区块链铭文,并深入探讨铭文技术的各项特性
比特币相关概念
总量:2100万枚<br> 最小单位:聪(sat)<br> 单位换算表 单位 中文名称 英文名称 换算关系 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供应商](https://www.infura.io/zh)的sepolia链,
* **合约说明**:不管是文字、图片、音视频铭文等最主要的区别在Tx中的data的不同,
* **验证浏览器**:验证发布的[sepolia区块浏览器](https://sepolia.etherscan.io/tx/0x3498e481cad6a4a92c27596da75ae811bcce2ecbfa3c59980e43338695dd2144)
* **文字铭文参考**:[文字铭文格式参考](https://domo-2.gitbook.io/brc-20-experiment)
### 总结
铭文技术为区块链带来了新的应用场景和可能性,但同时也引发了关于其对区块链本质和网络性能影响的讨论。
版权声明
本文仅代表作者观点,不代表区块链技术网立场。
本文系作者授权本站发表,未经许可,不得转载。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。