BTC NFT 铸造指南
王一石(yishi.io)
在这篇文章中,我会以 .stats 域名的铸造为例,带你走一遍完整的 BTC NFT 铸造流程。在延展阅读处,会稍微解释下闪电网络、Taproot 地址和 Ordinals 协议。
需要哪些前期准备
下载 Xverse 钱包,我们后面会用它来存储 NFT,因为它能够正确识别 Ordinals 协议的资产。
下载 Alby 浏览器插件钱包,用来处理闪电网络交易,这款钱包的体验相当不错。
准备好自己的 OKX 账号,我们要用它提取闪电网络的 BTC 到自己的钱包。
接收 BTC NFT 的重要前提是你的钱包支持 Taproot 地址格式,它们通常以 bc1p 开头,这是重要的识别方式。
这是目前我自己用的最顺手的组合,如果你习惯使用其他钱包,如 Bluewallet、Muun 等,同样可行。
截止目前,OneKey 钱包还没有支持 Taproot 地址和闪电网络,但我看到官方已经提过,估计很快会上。
我需要跑 Bitcoin 全节点吗
不需要,现在已有很多免节点的替代铸造工具。
但是,如果你想更深入参与 BTC Ordinals NFT 市场,并且将手续费降到最低,建议你去 Bitcoin Core 下载最新的钱包。
下载好后按下图修改设置,不要修剪节点,不然你会白同步,Ordinal 是要追溯到整个 BTC 区块的第一笔交易的。
同时,最好将 BTC 的区块数据放到至少1TB容量的外置硬盘,不然会很占你的电脑空间,目前整个 BTC 网络的数据大约500GB。
如果你对自己搭节点不感兴趣,只想快点 Mint,那这里跳过就好,也不用下 Bitcoin Core 钱包了。
Sparrow 钱包是必需的吗?
不是,那是一个月前的做法。
Sparrow 是个很棒的钱包,但它无法显示 NFT,并且操作门槛高,不建议入门用户使用,高阶用户随意。
给钱包氪金
把你的 Alby 钱包准备好,怎么使用这里不赘述。
从你的 OKX 提一些 BTC 到 Alby,不要提多,最多几百美金等额的 BTC 足矣,网络选择:BTC-闪电网络。
再从你的 OKX 提一些 BTC 到 Xverse,Xverse 不支持闪电网络,普通提现就可以。
现在你的两个钱包都有 BTC 了,它们大概长这样:
选择铸造工具:
https://ordinalsbot.com/
https://gamma.io/
https://unisat.io/inscribe
其实,在 BTC 链上铸造 NFT 不叫 Mint,叫 Inscribe,铭刻的意思。不过在 ETH 市场大家已经很熟悉 Mint 了,所以下面我还是会用 Mint 来指代铸造这个过程。
目前最好用的 Mint 工具目前就是上面3个,下面我来以 Gamma 为例,带大家铸造一个 .sats 域名。
.sats 是 BTC 网络上类似 ENS 的项目,没有自己的代币,没有预挖,铸造是免费的。我没有囤积 .stats 域名,只铸造了极少量(不足20个)参与。
根据其文档,铸造是要把下图这个文本刻到 BTC 主网上。
那我要怎么操作才能把它们铸造上去呢,显然不可能通过 BTC 转账留言,对吧?
这时候我们可以选择上面提到的铸造工具,它们其实没有什么特别,只是将 BTC 网络的铸造过程可视化,让用户更容易上手。
访问 https://gamma.io/ordinals
选择 Text 文本
把 .stats 文档里写的文本贴过来,name 字段换成你要的域名,如:abc.stats
轻触继续,选择费率,一般我们选 Higher fee 以保证铸造尽快成功。
注意,每次铸造 NFT,Gamma 都要收你5.7刀左右的服务费,还是比较贵的。unisat 会便宜一些,操作上有细微区别。总之,我们先学会用 Gamma 铸造,然后自己再去尝试其他工具。
下面这个步骤最为关键:接收地址必须填 Taproot 格式的(以 bc1p 开头),否则你的 NFT 可能会丢失。此外,邮件最好填一下,Gamma 会将订单信息推给你。
那么, Taproot 地址上哪里找呢?
还记得我们在文章开头下载的 Xverse 钱包吗。按照下图,轻触按钮1访问 NFT 面板,接着,轻触按钮2 接收,选择 Taproot 地址(bc1p开头),把这个地址复制到上面的 Gamma 地址栏 👆
按提示继续,你需要勾选下方的使用协议。
紧接着,Gamma 会生成订单。在这个订单页面,你可以看到有两个要素:
BTC 金额
收币地址
按照页面指示,将正确的金额转到对应的地址,确保无误,然后等待 Gamma 铸造完成。
稍等片刻,通常10-30分钟后(BTC 网络需要出块确认),你就可以在自己的 Xverse 钱包看到 BTC NFT 了。
至此,你已经完成了 BTC 网络上 .sats 域名 NFT 的铸造,比预想中的简单对吗?我们继续。
如何确定域名有没有被注册
你可以使用这个非正式的 API 接口查询,https://api.sats.id/names/abc.sats
将链接末尾的 abc.sats 换成你想要注册的域名,如:123.stats
那么你就能得到如下链接:
https://api.sats.id/names/123.sats
如果返回信息的信息像这样,那就说明这个域名尚未被注册:
否则,就是已经被注册了。
自动查询 .stats 域名
手动查询仍然比较繁琐,你可以通过脚本程序查找可注册的域名,这样效率会更高(比如你想要注册全部可用的 10K 数字域名)。
以下只是代码示意,无法直接运行。
你需要自行编辑,才能使其在自己的电脑上运行。
// 定义接口地址
const apiUrl = "https://api.sats.id/names/";;
// 定义循环延迟时间(单位:毫秒)
const delay = 1000;
// 生成随机不重复数字的函数
function getRandomNumbers(count, min, max) {
if (count > max - min + 1) {
throw new Error("不能生成足够的不重复数字");
}
const numbers = new Set();
while (numbers.size < count) {
numbers.add(Math.floor(Math.random() * (max - min + 1)) + min);
}
return [...numbers];
}
// 定义循环函数
function loop(numbers, index) {
const number = numbers[index];
// 构造接口地址
const url = apiUrl + number + ".sats";
// 调用接口
fetch(url)
.then(response => response.text())
.then(data => {
// 判断返回内容是否包含指定字符串
if (data.includes(".sats not found")) {
console.log("找到了:" + url);
}
})
.catch(error => {
console.log("请求出错:" + url);
})
.finally(() => {
// 延迟1秒后执行下一次循环
if (index < numbers.length - 1) {
setTimeout(() => loop(numbers, index + 1), delay);
}
});
}
// 生成随机不重复数字
const numbers = getRandomNumbers(9999, 1, 9999);
// 启动循环
loop(numbers, 0);
除了数字域名,你也可以穷举所有可注册的字母域名。
以下是简单代码,可以直接运行。
它的规则是找到所有3字母的域名,如果你要调整规则,简单修改代码即可。
const letters = [
"n",
"a",
"s",
"d",
"t",
"i",
"c",
"o",
"e",
"m",
"p",
"b",
"x",
"q",
"z",
"f",
"g",
"h",
"j",
"k",
"l",
"r",
"u",
"v",
"w",
"y",
];
const urls = [];
// 生成所有可能的 URL
letters.forEach((l1) => {
letters.forEach((l2) => {
letters.forEach((l3) => {
const url = `https://api.sats.id/names/${l1}${l2}${l3}.sats`;
urls.push(url);
});
});
});
// 随机排序 URL 数组
urls.sort(() => Math.random() - 0.5);
// 发送请求的函数
const fetchUrl = async (url) => {
try {
const response = await fetch(url);
const text = await response.text();
if (text.includes(".sats not found")) {
console.log(`找到了:${url}`);
}
} catch (error) {
// 忽略错误
}
};
// 并发发起请求
const concurrency = 20;
let index = 0;
const interval = setInterval(() => {
for (let i = 0; i < concurrency; i++) {
const url = urls[index];
fetchUrl(url);
index++;
if (index >= urls.length) {
clearInterval(interval);
break;
}
}
}, 1000);
运行这些 JS 脚本很容易,你只要在自己的浏览器任意位置点击 Inspect(检查),并在 Console(控制台)复制/粘贴代码就可以。符合条件的域名会自动提示你。
我们先前下载的 Alby 有什么用
Alby 是闪电网络钱包,只支持闪电网络转账。
上面提到了ordinalsbot 这个工具,它支持使用闪电网络付款,还支持批量铸造。
这样你就不用等待网络长达20-30分钟的确认,更快抢到你想要的 NFT。
在你学会如何使用 Gamma 后,就可以尝试这些更复杂一些的工具来探索 BTC NFT。
关于闪电网络、Taproot 和 Ordinals 协议
⚡️ 闪电网络(Lightning Network)
闪电网络是一种基于比特币技术的二层协议,可以加快交易速度和扩展性。它通过创建多个支付通道,使用户能够实时、高效、低成本地进行点对点交易,从而避免了需要等待矿工验证和打包的过程。这种网络类似于数字钱包,用户可以在其中创建支付通道并存入比特币,在通道内与其他用户进行交易,这些交易不需要写入区块链。当用户关闭支付通道并提取比特币时,最终余额将被写入区块链。
🥕 Taproot 地址
Taproot 是比特币网络的一种新型地址格式,是最新的升级方案之一。它采用了一种新的地址编码方式,可以提供更好的隐私、安全和可扩展性。Taproot 地址可以隐藏多个公钥或脚本,使得交易只展示最终使用的公钥或脚本,保护了用户隐私;它还可以被用于多种不同的交易类型,并且使用 Taproot 地址的交易规模通常比传统的交易规模要小,从而降低了交易费用。另外,Taproot 地址还可以减少脚本的使用,降低区块链大小和交易的复杂性,提高比特币网络的可扩展性。
⭕️ Ordinals 协议
这其实是 Casey Rodarmor 创办的,使用序数理论来标记和跟踪“注册”,即嵌入在区块链中的数据/内容:
序数是定义系列中位置的任何数字(例如,第一,第二,第三)。在比特币的情况下,Ordinal 是一个特定 Satoshi 的未使用交易输出(UTXO),其中包含一个包含内容(例如文本、图像或 MP3)的“注册”。已注册的 Satoshi 被设置为特殊交易,以便用户可以识别和跟踪它们。
事实上,这个解决方案早在2012年就在比特币论坛上提出了。Ordinals NFT 有一个有趣的点,它们不使用比特币的 OP_RETURN 字段。这个命令允许用户在链上提交任意数据。
Taproot 也很关键,它放宽了这些要求,完全取消了数据限制,因此理论上你可以铸造一个占据整个区块数据空间的4MB 大小的 NFT。
我常用的 BTC NFT 工具
https://ordinalsbot.com/
https://gamma.io/
https://dune.com/dataalways/ordinals
https://ordinals.com/
https://unisat.io/inscribe
https://ordinals.market/
https://ordlists.com/numbers
https://ordinalswallet.com/
特别感谢
我在了解 BTC Ordinals 协议的过程中,从 @李欢 和 @xiyu 身上学到很多。你可以关注他们的推特,他们经常分享 BTC 的知识和见解。同时,非常感谢 @zuozhuo 提工的域名查询脚本,十分好用。
祝各位铸造愉快。