Bitcoinj

代表他人接受付款,但無法消費

  • April 22, 2015

TL;DR 我希望在我的應用程序中為每個供應商帳戶儲存某種密鑰,允許我的應用程序生成一個接收地址供客戶付款。

我正在用 Java 編寫一些我想允許使用比特幣的發票軟體。基本上我想要發生的是供應商可以將某種密鑰保存到他們的帳戶詳細資訊中(類似於 PayPal id 和密鑰),並且任何通過比特幣支付給該供應商的客戶都將獲得支付的 URL。我不希望這是一個中間人軟體,因為我的伺服器上永遠不會有任何比特幣,我不會接受付款,它只會將供應商的付款地址提供給客戶。

我的理解是,使用收款地址可以做到這一點,但是每次付款都使用一個地址是不好的,所以這是不可能的。我不希望供應商在每次付款後都必須添加一個新地址,因為這根本不是使用者友好的。

所以我想知道是否有某種方法可以在我的伺服器上為供應商生成地址,而無需持有他們的錢包。我一直在研究 bitcoinj,似乎有辦法做到這一點,但我對比特幣很陌生。這還有可能嗎?這是我的申請的合理期望嗎?如果沒有,我還有其他選擇嗎?

這完全可以通過稱為BIP32的比特幣的可選添加來實現。不幸的是,標準客戶端沒有實現 BIP32,但是有其他客戶端實現了它。

  1. 請您的客戶下載最新版本的Electrum,然後讓他們為您提供擴展公鑰

(正如我上面所說,有多個客戶端可以做到這一點,我只是最熟悉 Electrum。) 2. 在您的 BitcoinJ 應用程序中包含此程式碼:

String serialized_xpub = "xpub.....";
unsigned int address_num = 4;
NetworkParameters params = MainNetParams.get();
DeterministicKey root_xpub = DeterministicKey.deserializeB58(null, serialized_xpub, params);

// Derive m/0/<n>, Electrum's BIP32 path
DeterministicKey receiving = HDKeyDerivation.deriveChildKey(root_xpub, new ChildNumber(0, false));
DeterministicKey new_address_key = HDKeyDerivation.deriveChildKey(receiving, new ChildNumber(address_num, false));
String new_address = new_address_key.toAddress().toString();

只要您使用相同的 xpub 和address_num. 不過,請確保不要跳過五個或更多地址。如果您最終這樣做了,那麼您的客戶可以生成地址,直到他們看到新的付款。

另外,請注意您沒有此地址的私鑰。如果您的客戶失去了他們的錢包,那麼這些硬幣就會消失。 3. 把那個地址寫在發票上。 4. 錢會出現在他們的錢包裡。

祝您的申請好運!

引用自:https://bitcoin.stackexchange.com/questions/36953