在这篇文章中,我会以 .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 网络的铸造过程可视化,让用户更容易上手。
选择 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);
除了数字域名,你也可以穷举所有可注册的字母域名,代码示意如下:
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 工具
特别感谢
我在了解 BTC Ordinals 协议的过程中,从 @李欢 和 @xiyu 身上学到很多。你可以关注他们的推特,他们经常分享 BTC 的知识和见解。同时,非常感谢 @zuozhuo 提工的域名查询脚本,十分好用。
祝各位铸造愉快。