使用Ethers.js在以太坊上创建和验证铭文

153 阅读5分钟

前言

本文将详细介绍如何利用 Ethers.js 库来创建个性化的区块链铭文,并深入探讨铭文技术的各项特性

比特币相关概念

总量:2100万枚
最小单位:聪(sat)
单位换算表

单位中文名称英文名称换算关系
BTC比特币Bitcoin1 BTC
cBTC比特分Bitcent0.01 BTC
mBTC毫比特Milli-Bitcoin0.001 BTC
μBTC微比特Micro-Bitcoin0.000001 BTC
satSatoshi0.00000001 BTC

什么是铭文

一种将数据(如文本、图片、音频、视频等)永久写入区块链的技术。通过Ordinals协议,将数据存储在区块链的某个最小单位(如比特币的“聪”)中,从而实现数据的不可篡改和永久存储。

铭文的技术实现

比特币铭文(通过Ordinals协议)
  • 核心原理:比特币铭文通过Ordinals协议实现,该协议为比特币的最小单位“聪”分配唯一编号(序号),用户可以将任意数据(如文本、图片、音频等)作为元数据写入到特定的聪中。

  • 技术细节:铭文数据存储在比特币交易的见证(Witness)字段中,利用隔离见证(SegWit)和Taproot升级提供的技术空间。

  • 创建过程

    1. 选择要铭刻的数据(如文本、图片等)。
    2. 将数据转换为适合存储的格式(如Base64编码)。
    3. 创建一笔比特币交易,将数据写入交易的见证字段。
    4. 发送交易到比特币网络,等待确认。
以太坊铭文(通过Ethscriptions协议)
  • 核心原理:以太坊铭文通过Ethscriptions协议实现,允许用户将数据写入以太坊交易的calldata字段。

  • 技术细节:数据以16进制字符串的形式存储在交易中,用户可以通过智能合约或直接发送交易来创建铭文。

  • 创建过程

    1. 将要铭刻的内容转换为16进制字符串。
    2. 创建一笔以太坊交易,将16进制字符串填入calldata字段。
    3. 发送交易到以太坊网络,等待确认。

铭文的应用场景

  • 数字艺术和收藏品:艺术家可以将作品直接嵌入区块链,创建独一无二的数字艺术品,这些艺术品可以在市场上进行交易。
  • 数字身份和所有权证明:铭文可以作为数字身份或所有权证明的形式,确保数据的真实性和不可篡改。
  • 智能合约和协议:企业可以使用铭文进行智能合约和协议的记录,确保交易的透明性和安全性。
  • 版权保护:创作者可以通过铭文技术在区块链上注册作品,确保作品的原创性和版权归属。

铭文的争议与挑战

  • 网络拥堵和手续费:铭文的大量使用可能导致区块链网络拥堵,增加交易手续费。
  • 对区块链本质的争议:部分比特币社区成员认为,比特币应保持其作为价值转移和存储的简单特性,而铭文的出现可能会使比特币网络变得复杂。

代码实例实现以及相关说明

  • 文字铭文
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);
  • 验证图片

屏幕截图 2025-07-09 172307.png

屏幕截图 2025-07-09 172605.png

总结

铭文技术为区块链带来了新的应用场景和可能性,但同时也引发了关于其对区块链本质和网络性能影响的讨论。