Post

基于区块链交易公钥在多链进行跨链追查:原理与实践

基于区块链交易公钥在多链进行跨链追查:原理与实践

随着区块链技术的不断发展,越来越多的项目和资金分散在不同的区块链网络中。对于合规审计、安全追踪和资金流动分析等场景,如何确定同一个私钥是否在多条链上产生实际交易,往往是突破口之一。本文将介绍一个普适的技术思路:通过在某条链(如以太坊)获取交易公钥,再将其转换到另一条采用相同椭圆曲线(secp256k1)的链(如比特币),进而在该链上验证是否有对应的签名交易,从而确认是否确系同一私钥所控。


1. 从以太坊交易中获取公钥

1.1 为什么能获取公钥?

在以太坊中,每一笔交易都会包含签名字段 (v, r, s),以及待签名消息的哈希(通常是交易哈希或更底层的 RLP 编码哈希)。以太坊提供了名为 ecrecover 的机制,能从 (v, r, s) 与消息哈希中恢复出用于签名的完整公钥。

  • 签名字段
    • v:恢复标记(包含链 ID 信息或椭圆曲线恢复信息)
    • rs:签名的核心数据,分别对应椭圆曲线的 x 坐标部分
  • 公钥恢复
    • ecrecover(msgHash, v, r, s)非压缩公钥(65 字节,前缀 0x04 + X/Y 坐标)

1.2 技术流程

  1. 提取交易信息
    在区块浏览器(如 Etherscan)或通过节点 RPC 接口,找到目标地址发起的一笔交易,记录其中的:
    • v, r, s
    • 交易哈希(或待签名数据哈希)
  2. 调用 ecrecover
    可以在本地脚本(如 web3.py、ethers.js 等)中使用内置函数 ecrecover(或等效实现)来恢复公钥。

  3. 验证正确性
    以太坊地址 = Keccak-256(公钥去掉前缀 0x04 后 64 字节)后 20 字节
    将恢复得到的地址与交易发起地址比对,如果一致则说明公钥获取无误。

完成上述步骤后,我们便得到了该以太坊地址对应的真实公钥(记为 PubKey_ETH)。由于以太坊和比特币都采用 secp256k1 曲线,这一公钥可被用于任意基于 secp256k1 的区块链上进行地址推导。


2. 转换为比特币地址并在链上追查

2.1 比特币地址生成规则

在比特币链上,最经典的地址生成方式是 P2PKH(Pay to Public Key Hash),即我们常见的以 1 开头的比特币主网地址。生成流程概述如下:

  1. 准备公钥
    一般使用压缩公钥(33 字节,前缀 0x020x03)更常见,也可以使用非压缩公钥(65 字节),只是地址会不同。
    • PubKey_ETH 是非压缩格式,需要根据 Y 坐标的奇偶,转换出对应压缩格式。
  2. 双哈希
    先对公钥做 SHA-256,再对结果做 RIPEMD-160 → 得到 20 字节的 PubKey Hash

  3. 版本前缀与校验和
    在主网下,P2PKH 前缀为 0x00;然后对 “前缀 + PubKey Hash” 再做两次 SHA-256,取前 4 字节作为校验和,拼接在后面。

  4. Base58Check 编码
    最终可得到典型的 1xxxx... 形式的比特币地址(记为 Addr_BTC)。

示例(Python 伪代码):

1
2
3
4
5
6
7
pub_key = compress(pub_key_65)         # 若需压缩
sha_1 = SHA256(pub_key)
ripe_1 = RIPEMD160(sha_1)
payload = b'\x00' + ripe_1            # 0x00为比特币P2PKH前缀
checksum = SHA256(SHA256(payload))[:4]
address_bytes = payload + checksum
btc_address = Base58CheckEncode(address_bytes)  # 形如 1xxxx...

2.2 在比特币链上验证实际交易

有了 Addr_BTC 后,我们需要在比特币区块浏览器(如 blockchain.com、btc.com 等)查询该地址是否真有链上交易,且由它主动发起过交易(即该地址作为输入的交易)。

  1. 查询交易记录
    如果 Addr_BTC 从未有任何交易或仅仅收到过 BTC 而没有消费(花费),则说明尚无证据表明同一个私钥实际在比特币链上操作过。

  2. 获取公钥以再次验证
    在比特币的 P2PKH 脚本中,当一个地址花费对应的 UTXO 时,输入脚本会包含签名公钥

    • 区块浏览器通常可在输入脚本详情里看到签名和公钥(或解析后的信息)。
    • 若该公钥与 PubKey_ETH(或其压缩/非压缩等效形式)完全一致,则可确认这是同一个私钥在比特币上签名的凭证。

由此,我们实现了从以太坊到比特币的“公钥跨链验证”——只有当在比特币区块上也能观察到该公钥用于签名的交易,才说明目标私钥确实跨链使用了。


3. 多链追查的意义

一旦确认同一个私钥同时在以太坊和比特币上都有交易签名,就可以在更广的范围内分析该私钥的资金流向和交易行为:

  • 合规审计 / AML(反洗钱)
    监管机构或安全部门可以根据已知的以太坊地址,顺藤摸瓜查看是否在比特币网络也有活跃,进而更全面地掌握可疑资金的跨链转移路径。

  • 资产管理与风控
    一些多链钱包用户可能有意或无意地复用同一个私钥。安全审计时需注意这一点——一旦某条链上私钥泄露,其他链上地址也会面临风险。

  • 研究和数据分析
    对多链生态的学术研究、市场分析或用户画像时,也可借助此方法发现跨链关联,为高维度数据分析提供帮助。


4. 注意事项

  1. 仅能对“主动发起过”交易的地址恢复公钥
    • 在以太坊上,如果一个地址仅接收代币或转账而从未发起过交易,则无法通过 ecrecover 获取它的公钥。
    • 在比特币上,只有当某地址“花费”了它的 UTXO,才会在交易输入脚本里暴露公钥。
  2. 同一私钥 ≠ 同一助记词
    • 助记词 (BIP39) 可以派生出许多子私钥。即使两个地址共用同一个私钥,也不一定是同一助记词;用户也可能手工导入相同私钥到不同钱包。
  3. 极小概率碰撞
    • 理论上,不同助记词或随机生成方式可能极低概率地产生相同私钥,但概率极其微小(约 2^-256),几乎可忽略不计。
  4. 隐私与匿名
    • 一旦在一条链上签名,就有可能被恢复出公钥,从而推导到其他链可能的地址;这在某些情况下会降低用户的匿名性与隐私保护。

5. 总结

基于区块链交易公钥在多链进行跨链追查”的核心思路就是:

  1. 先在一条链(如以太坊)上,通过已发起交易恢复公钥
  2. 将该公钥按照其他采用 secp256k1 曲线的区块链(如比特币)的地址生成规则进行转换
  3. 在目标链上查询是否有实际签名交易,并可进一步对比公钥来确认。

如果确有对应的签名交易,那就可以确定同一个私钥跨链使用,从而对资金流动和交易行为做更深层次的分析。这种方法在安全审计、合规检查、反洗钱以及多链资产研究等场景中都扮演着重要角色,为区块链行业的健康有序发展提供了技术支持。

简而言之,只要能在以太坊上获取到实际公钥,就可在比特币乃至更多基于 secp256k1 的链上推导相应地址并查验是否存在签名交易。若确认有实际交易且公钥匹配,即可判定由同一个私钥控制。这一跨链验证思路,对于打通区块链生态和深入挖掘跨链资金流向至关重要。

This post is licensed under CC BY 4.0 by the author.