bips/bip-stealth.mediawiki 主分支

  • genjix
  • 发布于 2025-03-15 12:11
  • 阅读 26

本文档提出了隐秘支付(Stealth Payments)的概念,允许用户发布单个地址并接收付款,而无需发送方和接收方之间的任何形式的通信。接收者可以通过扫描区块链来找到发给自己的付款。文档详细描述了隐秘地址的格式、交易格式、密钥推导过程,以及如何通过扫描区块链来发现与隐秘地址相关的交易,并提供了测试向量。

跳到内容

genjix/ bips 公开

折叠文件树

文件

master

搜索此仓库

/

bip-stealth.mediawiki

复制路径

Blame更多文件操作

Blame更多文件操作

最近提交

genjixgenjix

dkjffjdfdk

2015年1月15日

4434547 · 2015年1月15日

历史

历史

打开提交详情

查看此文件的提交历史。

307 行 (230 loc) · 9.34 KB

/

bip-stealth.mediawiki

顶部

文件元数据和控件

  • 预览

  • 代码

  • Blame

307 行 (230 loc) · 9.34 KB

Raw

复制原始文件

下载原始文件

大纲

编辑和原始操作

  BIP: XX
  Title: Stealth Payments
  Authors: Peter Todd <pete@petertodd.org>
  Status: Final
  Type: Standards Track
  Created: 2015-01-16
## 目录<br>Permalink: 目录<br>- 摘要<br>- 动机<br>- 地址格式<br>- 事务格式 <br> - 输出格式<br>- 推导密钥 <br> - 重用 Scan-Pubkey<br>- 测试向量 <br> - 基于隐身前缀扫描行<br> - 前缀匹配<br>- 来源

摘要

Permalink: 摘要

隐身支付使得单个地址可以公开出版,并且在发送者和接收者之间没有任何形式的通信的情况下接收付款。

接收者能够扫描区块链以查找发给自己的付款。此 BIP 仅涉及隐身机制。

动机

Permalink: 动机

当前的最佳实践要求用户为每个新的接收付款创建一个新的比特币地址,以保持隐私。然而,在实践中,这给用户带来了巨大的可用性负担,并将用户暴露于对其隐私的潜在侧信道攻击。隐身支付在发送方实现匿名支付,即使在连接受到攻击的情况下也是如此。

地址格式

Permalink: 地址格式

Mainnet 版本 = 0x2a (42),testnet 版本 = 0x2b (43)

  [version:1=0x2a] [options:1] [scan_pubkey:33] [N:1] [spend_pubkey_1:33] ...
    [spend_pubkey_N:33] [number_sigs:1] [prefix_length:1] [prefix:prefix_length/8, round up]

  options bitfield = 0 或 1 (重用 scan_pubkey 进行支付)

当我们希望进行接收者可以发现的交易(作为发送者)时,我们必须暴力破解 nonce 值(grind),该值产生正确的前缀,因此 ephemkey 输出的哈希产生正确的 stealth_prefix,如隐身地址中指定的那样。

def number_prefix_bytes(prefix_bits_length)
    if prefix_bits_length == 0:
        return 0
    return prefix_bits_length / 8 + 1

事务格式

Permalink: 事务格式

隐身元数据总是成对出现在输出之前:

 * out #1 - 支付 A 的元数据
 * out #2 - 隐身支付 A
 * out #3 - 支付 B 的元数据
 * out #4 - 隐身支付 B
 * out #5 - 常规支付 C
 * out #6 - 支付 D 的元数据
 * out #7 - 隐身支付 D
 * out #8 - 常规支付 E
 * out #9 - 常规支付 F
 * out #10 - 支付 G 的元数据
 * out #11 - 隐身支付 G

输出格式

Permalink: 输出格式

  P = 发送者创建的临时公钥

事务以此格式编码 ephemkey:

tx outputs:
-> RETURN &lt;P:32> ...
-> DUP HASH160 &lt;pkh:20> EQUALVERIFY CHECKSIG

RETURN 输出中的剩余空间保留用于未来的隐身地址功能。

按照惯例,只有以 02 开头的公钥将用于扫描公钥。客户端将生成密钥,直到找到一个以 02 开头的密钥。

推导密钥

Permalink: 推导密钥

接收者:

Q = 公钥(EC 点,33 字节)
d = 私钥(整数,32 字节)

Q = dG

发送者(有 Q,没有 d):

P = eG

通过发布 P,只有发送者和接收者才能访问 c:

c = H(eQ) = H(dP)

发送者:

Q' = Q + cG

接收者:

Q' = Q + cG = (d + c)G

private key = d + c [记住: mod curve.order 并在必要的\
地方用 0x00 填充]

重用 Scan-Pubkey

Permalink: 重用 Scan-Pubkey

假设我们希望保持我们的隐身支付密钥的私密性,但仍然能够扫描发送给我们的付款。通常,要扫描隐身支付,我们需要解密我们的隐身密钥以查看是否收到了付款。对于钱包来说,在没有用户交互的情况下执行此操作是不可接受的,因为它有泄露其钱包的风险。

我们可以改为使用双密钥隐身方案。

接收者:

Q = 公共扫描密钥(EC 点,33 字节)
d = 私人扫描密钥(整数,32 字节)
R = 公共支付密钥
f = 私人支付密钥

Q = dG
R = fG

stealth address: &lt;scan=Q> &lt;spend=R, ...>

发送者(有 Q,没有 d):

P = eG

通过发布 P,只有发送者和接收者才能访问 c:

c = H(eQ) = H(dP)

发送者:

R' = R + cG

接收者:

R' = R + cG     [无需解密钱包]
   = (f + c)G   [解密钱包后]
     [记住: mod curve.order 并在必要时用 0x00 填充]

在此方案中,我们可以使用扫描密钥对 (Q, d) 来生成共享密钥 c,然后从公共部分 R 推导出地址。

测试向量

Permalink: 测试向量

基于隐身前缀扫描行

Permalink: 基于隐身前缀扫描行

~/worker/blockchain$ block_db last_height blocks_lookup blocks_rows
338286
~/worker/blockchain$ stealth_db scan
Usage: stealth_db scan INDEX ROWS PREFIX FROM_HEIGHT
~/worker/blockchain$ stealth_db scan stealth_index stealth_rows 100010010 0
Ephemkey: 4f41010001a08d061b753d68747470733a2f2f6370722e736d2f624e56387837
Address: 80a908a7afd284ce51416d1acb9cce310104874d
Tx hash: 87164d76a0217adaa26c0938dd34152cbcb92026b4e443d043031f1634a4ab91

Ephemkey: 4f41010001e8071b753d68747470733a2f2f6370722e736d2f6552544c71506f
Address: 00bbb1a2a970410a015320ccea65deb44b48d337
Tx hash: e9b9a7f901b633a5c2d368a5143edd8b0ea2c02430849b0e449cfc748db98318

Ephemkey: 4f410100010a1b753d68747470733a2f2f6370722e736d2f75764769644c5f74
Address: af7dcdba3432a447afd077271923cc80e40fc639
Tx hash: 724925429b5447026179146e7d8cb2034984629d89d20ce6c30aa2944bd5a2d8

Ephemkey: 060f94c45703924e55ba2dfd74ace52b74f56e7f4873765f121cb2f5a1882327
Address: fe4ca30c546c3b43be42ab4e92dbfe661a9b7878
Tx hash: 8e67e6ba349e94fe6ef96999ce88dcc1f780d2dfc50cafb30339dafe06aaa7ae

Ephemkey: 061eba8f65022e3cce87e1a7662417c0d0559b109181e55ceedf5775cbaeaaf5
Address: b4ef2e78bad43c597c81f33eda982ec0ebab4e1c
Tx hash: 478ccd767260adbf14f93280703c62e399dea8e8f9048377957a52bbb19cadf6

Ephemkey: 4f41010001f4031b753d68747470733a2f2f6370722e736d2f7337586c30796b
Address: 24e5368bee20f8c5e5e5c735cda036ccbb56205a
Tx hash: 930283ba8d44367239c206cf55968bfa71396f462b5905af2265ccd7e61cfa69

Ephemkey: 4f410100100ad804db0b0aac02b7d302ac02ac02997ce2040af20c64f4038191
Address: 59717775f32282d4b5c234d985023d891a92db58
Tx hash: 048eb7246358f1389e3bf2f15e261efead8c9a22871421b7acffb2877e086c8c
~/worker/blockchain$ stealth_db scan stealth_index stealth_rows 01010101010 0
~/worker/blockchain$ stealth_db scan stealth_index stealth_rows 01010101 0
Ephemkey: 0665b0e7e50309d0f22d3c45616cb862ba4834d68db36958ee924505c6701bfd
Address: 0e8512e0b8e68dff7e79458a68db5a331361091c
Tx hash: 59b5c54af868e80aff6706ee627beb04d835f5abf3def1d8c60483d8b17eccbd

Ephemkey: 4f4101000180c8afa0251b753d68747470733a2f2f6370722e736d2f47505139
Address: 1a6adc15291555d2a74ea9955e6c623180dd5279
Tx hash: dc9c087c2752b7e2339116e25f341fde47655e638fc5d8aad9620bef5f0b3af8

Ephemkey: 0663306ed402e9b470d57eb92bfcb36bdf27413e815767b5f2a9c2f267c7b1fc
Address: cc190676f1e91cf5c77d256d7011ee3be9f2200e
Tx hash: b17124b2058a601682ece0dd6471abe631f0e3d93a10f141004bd49225b30610

Ephemkey: 4f41010001e8071b753d68747470733a2f2f6370722e736d2f3954627276364a
Address: 107be1ad519802a7d62db6f093b3a83c86e7debb
Tx hash: e504b7cfb82443f711213ef18a73b6eb998640a83d31b12454cf91eb199a67d8
~/worker/blockchain$ stealth_db scan stealth_index stealth_rows 010111101 0
Ephemkey: 0685893aef03b9cafc9cb62787d07ab4a5e3564413225b4603c1cdc28781c9c3
Address: cf1140b10da5a16d9eeb605914c06e9add7359a9
Tx hash: b9f1ee860c3df0282ba342e568405d8f3edf00818225102112166f4d15e04832

Ephemkey: 4f410100109e78b80ed706d7066666c12cbc02bc02c3eb018a0d8a0de807e807
Address: 6485798119fc5474556aa8fdea25581009835061
Tx hash: 90affa3c69e2b9e724d4e90d3e26785d352c570033668944331ec394b7323df8

Ephemkey: 4f410100100a90030a0af908e3ec020a0a64b8170aabc2020a8028ab02d7a0ad
Address: b3b920f1cb33512e8e8360e517d684ebd558ae1b
Tx hash: 01474e191ddf7340a45e97e4683553d4f1c7ac1de96e6472e404ea74b43499df

前缀匹配

Permalink: 前缀匹配

以上面的第一个例子为例: https://blockchain.info/rawtx/87164d76a0217adaa26c0938dd34152cbcb92026b4e443d043031f1634a4ab91

脚本 RETURN 输出为:

6a244f41010001a08d061b753d68747470733a2f2f6370722e736d2f624e563878374d527a77
$ python
>>> import hashlib
>>> hashlib.sha256(hashlib.sha256("6a244f4...".decode("hex")).digest()).digest().encode("hex")
'89556cc68bc8139e0de4d103502b3b413091b0a6a61a17ccb4d2a68c5b0743da'
89 是 10001001
55 是 01010101
6c 是 01101100

因此前缀为:

10001001 + 01010101 + 01101100
100010010101010101101100

来源

Permalink: 来源

  • 原文链接: github.com/genjix/bips/b...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
genjix
genjix
江湖只有他的大名,没有他的介绍。