Stealth-Address
技術層面的隱形地址
假設使用者
A
想要將比特幣發送到使用者B
隱身地址。
B
使用者的隱身地址到底是什麼?是他的公鑰嗎?由於使用者需要根據橢圓曲線 Diffie-HellmanA
將他的私鑰與使用者的公鑰相乘,所以我假設使用者正在接收完整的點,即使用者的公鑰。B``A``B
- 使用者
A
應計算PrivA * PublicB
出座標。據我所知,這一點將通過將其乘以publicB
和一個隨機數來使用,然後將發送到網路。如果我說的是正確的,我怎麼能乘以這個座標,PublicB
因為它們都是點。我們是否只能從 diffie hellman 的計算中得到這一點的一個軸?
使用者 B 的隱身地址究竟是什麼?是他的公鑰嗎?
在最簡單的隱身地址方案中,是的。確切的編碼取決於實現;DarkWallet 的描述在他們的 wiki中。
我如何將此座標與 PublicB 相乘,因為它們都是點?
正確,
S = PrivA * PublicB = PrivB * PublicA
是一個點。我們想要一個完整的共享秘密。ECDH 告訴你使用 x 座標S
作為共享密鑰,但在比特幣中它的做法不同。而是int(sha256(compress(S)))
使用:
- 根據SEC 1 的 Elliptic-Curve-Point-to-Octet-String 轉換以壓縮形式序列化 S
- 獲取它的 SHA-256 摘要
- 將結果解釋為 256 位大端整數
c
然後,A 使用這個整數來計算 A 花費的公鑰,並由 B 計算B 可以從中贖回PublicB + c*G
的私鑰(基點生成器在哪裡)。(PrivB + c) * G``G
請注意,這種“最簡單”的方案存在問題。B 的錢包軟體可以查看 B 是否可以贖回 UTXO(以跟踪錢包的餘額)的唯一方法是進行上述數學運算,這需要
PrivB
. 換句話說,它使只看錢包成為不可能(冷錢包不切實際)。對此的一種解決方案是使用一對
PublicB
/PrivB
對 ECDH,但使用不同的PublicB2
/PrivB2
對來導出支出/兌換密鑰。現在,您可以將其保存PrivB
在僅用於觀看的錢包和PrivB2
冷錢包中。不利的一面是,B 的隱身地址現在是原來的兩倍,同時包含PublicB
和PublicB2
。