BitMEX Research: 私钥中的不可阻挡的JPG图片

This article is not available in the current language yet. Showing the original version.
OP_Return 策略限制以及在区块链上储存图片的话题,再次成为人们关注的焦点。由于17%的节点运行着Bitcoin Knots客户端,该客户端支持过滤图片的理念,这场争论短期内不会平息。 我们讨论“信息论”并解释图片如何被包含在虚假的比特币地址中,以及为何阻止此行为是不可行的。我们继续解释私钥同样是随机数据,也可以用于储存图片。 我们创建一个示例交易,其中包含一个更“不可阻挡的图片”,该图片储存在故意设置的脆弱私钥中,这些私钥可以通过区块链上的可用数据计算出来。

2025 年 6 月,比特币核心开发者合并了一个拉取请求,该请求基本上取消了软件中的 OP_Return 大小限制策略。我们已经就此话题发表过观点,认为从长远来看,手续费市场才是我们对抗垃圾交易的工具,而不是策略限制和过滤器。

然而,取消 OP_Return 大小限制的决定在某些比特币社区群体中引发了争议,有人声称这会助长垃圾交易,例如链上 JPG 图片。另一项抱怨是,核心开发者没有采取足够行动来对抗垃圾交易,也未阻止区块链上的 JPG 图片。当 Udi Wertheimer 通过“Taproot Wizards”的形式将图片放入区块链,以此嘲弄反垃圾交易者时,反垃圾交易或支持过滤的群体希望或期待比特币核心开发者能采取措施阻止,但他们没有。

因此,越来越多的人开始运行 Bitcoin Knots,这个客户端据说能通过过滤器更有效地对抗垃圾交易。根据 Coin.Dance 的数据显示,截至 2025 年 8 月 25 日,大约 17% 的可连接节点运行着 Bitcoin Knots。

信息论

尽管有些人批评比特币核心开发者没有对抗图片,但另一些人回应说,核心开发者不应该玩“打地鼠”游戏,因为这只会浪费时间。

这基本上意味着,比特币核心可以采取措施对抗图片,但这只会暂时有效,因为垃圾交易发送者总会找到绕过防御的方法。这是一场不对称的战斗,垃圾交易发送者每前进一步,所付出的努力远少于那些试图阻止垃圾交易的人。这场战争终将迎来结局,而垃圾交易发送者将最终获胜。

为什么比特币核心开发者有义务投入时间和精力去打一场最终会输掉的仗呢?因此,许多开发者不愿参与这场战斗是可以理解的。

从支持过滤的视角来看,他们可能也承认这一点,但他们辩称,过滤器的存在是为了增加垃圾交易的成本,即使付出足够的努力也能绕过它们。

Claude Elwood Shannon

Claude Elwood Shannon

当谈到使用过滤器来阻止垃圾信息时,有人可能认为这是一场注定失败的战斗,因为这与**“信息论”**有关。信息论是克劳德·香农在 20 世纪 40 年代正式提出的一门科学,它研究信息的交流。香农引入了计算机科学和信息传输的一些核心概念。

因此,仅仅用“信息论”来断定支持过滤的人完全错误,可能有些不妥。更准确的说法是,信息论可以被视为一个科学领域,人们可以在这个领域里争论,图片总是可以被储存在看似随机的数据中,而这些数据是比特币交易必需的。所以,说“信息论”证明了什么,可能并不公平。

交易的必需数据

最基本层面,比特币的金融交易有一些必要的组成部分以确保交易能正常运行。具体来说,每笔交易都需要一个公钥和一个签名。没有这两个核心组件,比特币交易将无法运作。因此,这些组件必须上链。

当接收比特币时,需要提供一个比特币地址。由于这些地址是通过哈希函数生成的,所以地址本身与随机数据无法区分。因此,与图片相关的数据可以被用作“虚假地址”,并将比特币发送到这些地址。

这些虚假地址会以输出哈希的形式进入公共区块链。由于没有与这些地址关联的公钥,这些比特币将永远无法被找回。

将此理解为“信息论”是说,哈希函数是一个随机过程,它会产生可用于传输信息的熵。无论使用何种过滤器,这都无法真正阻止。这些虚假地址在比特币历史上曾被使用过,下面是一些例子。

虚假地址

2013 年 12 月,有人利用“虚假地址”的方式将前南非总统纳尔逊·曼德拉的图片编码到了比特币区块链上。下图展示了这张图片。

Sources:https://mempool.space/tx/78f0e6de0ce007f4dd4a09085e649d7e354f70bc7da06d697b167f353f115b8e,https://mempool.space/tx/8881a937a437ff6ce83be3a89d77ea88ee12315f37f7ef0dd3742c30eef92dba,

List of associated fake addresses: https://bitfossil.com/78f0e6de0ce007f4dd4a09085e649d7e354f70bc7da06d697b167f353f115b8e/ADD

早在这之前,2011 年 5 月,虚假且不可花费的地址就被用来将比特币标志储存在比特币区块链中。

Source:https://mempool.space/tx/ceb1a7fb57ef8b75ac59b56dd859d5cb3ab5c31168aa55eb3819cd5ddbd3d806

应该指出的是,像这样使用虚假地址的垃圾交易,确实会使运行节点变得更加困难,因为它可能会使 UTXO 集膨胀。这也是允许 OP_Returns 的部分理由。

禁止虚假地址

如果有人想阻止虚假地址,这理论上是可行的。但这将需要对比特币进行根本性的重新架构和协议变更。阻止这类地址的方法可以是要求交易输出包含一个数字签名,从而证明存在公私钥对,并且地址是“真实的”。因此,交易输入和输出都需要一个签名。

虽然这在理论上可行,但这将是一项巨大的工程,并带来以下缺点:

  • 所有现有钱包都将与新交易格式不兼容,旧式交易将被禁用。过去从未发生过禁用旧交易的情况,这会威胁货币主权,人们可能因此丢失资金。

  • 交易流程需要改变,接收方不仅需要向发送方提供地址,还需要提供数字签名。

  • 链上签名数量会增加,交易规模会变得更大,损害比特币的扩容能力。

  • 这可能会鼓励地址重复使用,损害隐私。

  • 这将是一项协议变更,需要广泛的共识,可能需要一次硬分叉。

  • 比特币的许多功能,如 P2SH 或 Taproot,可能需要被移除,或者至少我们无法享受 P2SH 的好处。

  • 更多的公钥可见,使比特币更容易受到量子攻击。

正如你所看到的,上述做法是完全不可行的,并且会带来彻底的灾难。然而,即使是这种极端的改变,也可能无法阻止 JPG 图片。在仔细排除所有其他选择之后,人们仍然可以将图片储存在私钥中,毕竟私钥只是随机数据,它们是比特币的必要组成部分。因此,对于比特币开发者来说,这仍然是一场会输的战斗。他们将投入巨大的精力,彻底重新架构比特币和所有钱包,而垃圾交易发送者只会相对轻松地转向其他方式。

JPG 图片作为私钥

比特币私钥只是一个 256 位的随机数。这样一个数在数学上等同于一个 16x16 像素的图像,其中每个像素要么是黑色,要么是白色。所有私钥都可以用这些微小的图像来表示。

我们通过创建下面这样的一个人像图片,来制作了一个比特币私钥。我们将这张图片保存为 JPG 格式,如下图所示。

从支持过滤的角度来看,尽管通过作图来生成私钥可能不是使用比特币最安全的方式,但这种行为仍可能被视为非法的。它被视为垃圾信息,因为从某些角度看,我们正在将 JPG 图片放到区块链上,或者在区块链中使用 JPG 图片。

然而,当然,用过滤器来限制比特币的这种使用在数学上是不可能的,因为这些图片在数学上等同于表达私钥的任何其他方式。

要从图片生成私钥,每个像素都可以根据其黑白属性被赋值为 1 或 0,如下所示的 256 位数字就说明了这一点。

由上述私钥生成的一个比特币地址如下:

1JfvNAje3G3Gvt41hL4P7Eh96NLj79o5v7

这只是用一个私钥生成一个小的图片。但当然,这可以扩大规模。你可以生成一个 1MB 的大图片,然后将其分解成数千个私钥。这些私钥可以用于交易,并对区块链进行垃圾信息攻击。这种行为很可能被视为垃圾信息。然而,仅仅用一个私钥生成一个图片并用其处理“金融交易”,即使是最极端的支持过滤者,也可能不会将其视为垃圾信息,尽管这涉及图片。

脆弱的签名

上述将“图片”上链的方法并不是特别有效。首先,在进行比特币交易时,私钥应该是保密的,而垃圾信息发送者希望图片是公开可见的。

然而,可以生成一种不安全的签名,使得私钥可以从链上数据计算出来。如果图片数据可以从区块链上的可用数据中确定,那就等同于把图片放在了区块链上。

为了用 ECDSA 签署消息,在生成签名的过程中需要进行各种计算。其中一项计算需要一个随机生成的值 K。比特币历史上曾因 K 值使用了不良的随机性而出现过各种安全问题,例如 Blockchain.info 钱包在 2013 年 8 月发生的问题。由于安全漏洞,同一 K 值被用于签署多笔交易。这一漏洞导致了用户资金被盗。

另一个在不同消息中使用相同 K 值的例子是索尼的 Playstation 3 游戏机,它对每款游戏都使用了相同的 K 值。这一漏洞在 2010 年德国混沌计算机大会上被披露。几天后,传奇黑客 George Hotz 公布了 Playstation 3 的私钥。因此,K 值必须既保密又对每条消息使用不同的 K 值,否则任何人都可以计算出私钥。

我们开发了一个使用这些脆弱 K 值的基本方案,将一个 JPG 图片放入我们的私钥中,这样任何人只要能访问区块链,都可以计算出这些私钥。然后,我们通过广播我们的交易,使用这个系统将一个 JPG 图片放在了区块链上。我们相信,这是比特币历史上第一张储存在脆弱私钥中的重要/有意义的图片。

我们在一个单输入单输出的交易中,创建了一个 15-of-15 的 P2SH 多重签名输入。交易总大小为 1,690 字节。由于输入是 15-of-15 的多重签名输入,链上总共有 15 个签名和 15 个公钥。其中 15 个关联私钥中有 14 个是 JPG 图片,也就是本文顶部的图片。为了向 2011 年的图片致敬,它是黑白相间的比特币标志。

来源:

https://mempool.space/tx/700f1b8216d4b28cdbf7fe8abb4061763d51019b2a1007a3d811f50e320db98a

在我们的结构中,为了创建脆弱签名,我们并没有对多个消息使用相同的 K 值。我们选择了一个系统,其规则是:

  • 第一个 K 值是第一个公钥的 SHA256 哈希值

  • 第二个 K 值是第一个 K 值的 SHA256 哈希值

  • 第三个 K 值是第二个 K 值的 SHA256 哈希值

  • 以此类推…

  • 第 15 个 K 值是一个真正安全生成的随机数

这样,对于区块链的普通观察者来说,签名看起来相当安全。但是,一旦有人知道我们选择 K 值的方式以及 K 值是什么,他们就可以计算出 14 个私钥。我们可以不断改变这个方案,如果支持过滤的一方试图通过过滤暴露的 K 值来阻止我们,我们就可以开发出一种新的、更安全的方案,始终领先一步。

由于需要全部 15 个私钥才能花费该地址的资金,而只有 14 个私钥是脆弱的,因此资金仍然是安全的,攻击者无法在交易被确认前卷走资金。因此,我们既实现了资金安全的目标,又让作为图片的私钥进入了公共领域。

根据维基百科的公式,计算私钥的公式如下:

值得注意的是,SR 值在签名中是可用的,而 Z 是消息哈希。因此,如果有人知道 K 值,就可以轻松计算出私钥。

我们使用了下面的 Python 脚本来为我们进行计算。下面的脚本计算了第一个私钥。

from hashlib import sha256 # transaction id: 700f1b8216d4b28cdbf7fe8abb4061763d51019b2a1007a3d811f50e320db98a

# compute the first k using the first public key (onchain data)

k_hex = sha256(bytes.fromhex('028f98d43a28e131ec1ca2bed82007e36b811a703046213390b308823cea98774a')).digest()

k_list = [int.from_bytes(k_hex, 'big')]

# compute the subsequent k

for i in range(13):

k_hex = sha256(k_hex).digest()

k_list.append(int.from_bytes(k_hex, 'big'))

# r and s of the first signature (onchain data)

r = 0x468ee7af91e05978ca8c1683f6191776553d23eaa1121007d27e52c53ad1d864

s = 0x5fd79b53024ce968dea52744542b0671a7a35b17b72b7d46a4c54e9709ae2a45

# the first

k value

k = k_list[0]

# z is the SignatureHash

z = 0x1cd9060f9b6caf7b05804999133f2d979c62899ac0c0c2c6e5f943fd1d83f910

# ORDER is a constant # https://github.com/bitcoin/bitcoin/blob/master/test/functional/test_framework/crypto/secp256k1.py#L167

ORDER = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

# There are two potential private keys for each signature, but only one is correct.

# In this scenario, the correct key is private_key_2.

private_key_1 = ((s * k - z) * pow(r, -1, ORDER)) % ORDER

private_key_2 = ((-s * k - z) * pow(r, -1, ORDER)) % ORDER

print(hex(private_key_1))

print(hex(private_key_2))

通过上述方法计算出的私钥,见下表:

1 b7010000ffd8ffe000104a46494600010101004800480000ffdb004300432e32
2 3a322a433a363a4b47434f64a66c645c5c64cc929a79a6f1d4fefaedd4e9e5ff
3 ffffffffffffffe5e9ffffffffffffffffffffffffffffffffffffffffffc000
4 0b08002b002b01011100ffc40019000002030100000000000000000000000004
5 0500020301ffc400251000020202010305010101000000000000010200030411
6 122122611331415171a13281ffda0008010100003f0036cb16a42ee740459767
7 5961210f05f1ef072ccdd4927ccbd7916d67b5cfe1ea231c5cb5bfb5bb5febee
8 131567dc6cb8a03da9d3fec1d38f31cf6577d75192e3d4943147e22d0002df13
9 0cda0af17441e985036208ac558329d11ec639a6d16d4afd06c44cc49624fb93
10 222f37551f27519e5ad6ca9535a2bf91d272c031b04a6cbec6b7fb164d52c655
11 0013a9cc9acd77baf9d8fc9b615952baab5659cb746fa84e45156439736f1e3d
12 a7e84adf6555627a48e1ceb43aee2e8cb1f114d085fdc8dcbe6637aebb5ff63d
13 bcc59df53fcab2ff00258dced5942760b723fb338561e21b583b8d20fec6924c
14 eda6bb477a03e62ab5155f4074dc370e8a8af22809f30c927fffd90000000000
15 Not disclosed

一旦你获得了所有私钥,只需将它们拼接在一起,并移除两端的一些字节,即可得到以下字符串。

ffd8ffe000104a46494600010101004800480000ffdb004300432e323a322a433a363a4b47434f64a66c645c5c64cc929a79a6f1d4fefaedd4e9e5ffffffffffffffffe5e9ffffffffffffffffffffffffffffffffffffffffffc0000b08002b002b01011100ffc400190000020301000000000000000000000000040500020301ffc400251000020202010305010101000000000000010200030411122122611331415171a13281ffda0008010100003f0036cb16a42ee7404597675961210f05f1ef072ccdd4927ccbd7916d67b5cfe1ea231c5cb5bfb5bb5febee131567dc6cb8a03da9d3fec1d38f31cf6577d75192e3d4943147e22d0002df130cda0af17441e985036208ac558329d11ec639a6d16d4afd06c44cc49624fb93222f37551f27519e5ad6ca9535a2bf91d272c031b04a6cbec6b7fb164d52c6550013a9cc9acd77baf9d8fc9b615952baab5659cb746fa84e45156439736f1e3da7e84adf6555627a48e1ceb43aee2e8cb1f114d085fdc8dcbe6637aebb5ff63dbcc59df53fcab2ff00258dced5942760b723fb338561e21b583b8d20fec6924ceda6bb477a03e62ab5155f4074dc370e8a8af22809f30c927fffd9

这 439 字节的十六进制数据可以转换成一个 JPG 文件。这便得到了以下这个不可阻挡的图片:

Share to:

Author: BitMEX Research

Opinions belong to the column author and do not represent PANews.

This content is not investment advice.

Image source: BitMEX Research. If there is any infringement, please contact the author for removal.

Follow PANews official accounts, navigate bull and bear markets together
PANews APP
US stocks closed mixed, with crypto stocks generally declining.
PANews Newsflash