如何利用 MerkleTree 来实现 NFT的公平开图,以及如何验证
May 21st, 2022

HippyGhosts 终于在 5/20 如期上线,在社区铸造的 1500 个 ghosts 中有 20 个稀有款,有部分已经被 mint 出来,例如下图,他们的 Token ID 分别是 205 和 268,一个单眼的 Ninja,一个金属 Ninja 。🥳

#205

0bf413340f0db024d3621259bc4140f9defad64ac78725d90f569a131be561f4
0bf413340f0db024d3621259bc4140f9defad64ac78725d90f569a131be561f4

#268

413a4990d7788b4449ea4e322b03e582531ec699d4c08440a1c60f1031e425e6
413a4990d7788b4449ea4e322b03e582531ec699d4c08440a1c60f1031e425e6

为什么我们可以在文章里提前公开图片?

然后有人问我一个问题,因为现在 HippyGhosts 还没有开图,我是不是会根据 mint 的结果来对应分配稀有款,或者之后给某些地址开出特定的图?答案是不会。

因为所有 9999 个 HippyGhosts 的图片已经冻结,这些图片的 base64 编码进行 keccak256 哈希以后构成的 MerkleTree 已经提前生成并记录在了合约里。每当一个 Ghost 的图片公开了以后,任何人都可以验证图片的完整性和图片的位置(也就是 Token ID)。

所以,我这会儿说的稀有款,它的编号 #205 和它的图片内容,都是提前已经确定好的。而“提前确定好的图片内容和位置“这两个事实,任何人都可以在图片公开以后验证。

同理,未来开图以后,看到的每一张图,它的顺序和内容也已经提前确定,并且可以被验证,这样以确保未来开图过程的公平。

那比如说,如何验证上面这张图?

现在这个 HippyGhosts #205 提前开图,我需要验证,这个图不是我现在临时决定的,并且这个图,我在 mint 之前,已经把它排在了 9999 个图中的第 205 位。

首先,在新窗口打开这个图片,浏览器中可以看到这个图片的 base64 编码,这就是图片的数据,对这个数据进行 keccak256 哈希后,得到

0bf413340f0db024d3621259bc4140f9defad64ac78725d90f569a131be561f4

然后在 HippyGhosts 的 MerkleTree 中寻找这一串哈希,位置为第 205 个叶子结点

https://api.hippyghosts.io/~/storage/merkletree

因为这个 MerkleTree 是在 HippyGhosts 自己的服务器上的,接下来就是确认它的数据是否可信,首先从 MerkleTree 的第一行获得 MerkleRoot

58d247a687ef48f010e2e6107a04d575787163cfb0d70543c421a5001e9f5aab

同时这个 MerkleRoot 数据也存在于 HippyGhosts 的 Renderer 合约源代码中

https://etherscan.io/address/0x856bd414d7c4718f844795b30510af2f5fee2ee1#code#F9#L10

这里要提起一个叫做隔离见证的东西,意思就是:就是一个结果的出现,需要依赖于一个事实的发生。在这个例子中,结果就是 MerkleRoot,事实就是所有图片的内容和顺序。

58d247a687ef48f010e2e6107a04d575787163cfb0d70543c421a5001e9f5aab

现在我们在合约代码中发现了结果(即MerkleRoot),这个结果是在合约部署的时候就出现了,自然就是在 mint 之前,那么,所有图片的内容和顺序这个事实也一定发生在合约部署之前。这是因为根据 MerkleTree 的特点,如果图片的内容和顺序不同,MerkleRoot 也会变化,那么对于一个确定的 MerkleRoot,就一定有确定的图片内容和顺序。

讲完了,当然这不是公平开图的最有思路,只是我自己比较喜欢用 MerkleTree 来处理它。如果在公平开图这个事情上有其他想法,欢迎一起交流。

🔗 https://muselink.cc/web3nomad

Subscribe to web3nomad.eth
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from web3nomad.eth

Skeleton

Skeleton

Skeleton