Raw-Transaction

從私鑰生成的離線地址是否應該將資金發送到錢包?

  • November 2, 2022

我正在嘗試使用 python 包python-bitcoinlib在 testnet 上發送時間鎖事務。github有兩個例子來創建一個地址,然後使用那個地址將比特幣發送到另一個地址。

問題是,當我使用自己的私鑰將比特幣發送到生成的地址時,我的錢包中從未收到比特幣。我可以將交易廣播到第二個地址,但我想訪問比特幣,以防我在時間鎖到來之前改變主意。這是程式碼:

from bitcoinutils.setup import setup
from bitcoinutils.transactions import Transaction, TxInput, TxOutput, Sequence
from bitcoinutils.keys import P2pkhAddress, P2shAddress, PrivateKey
from bitcoinutils.script import Script
from bitcoinutils.constants import TYPE_RELATIVE_TIMELOCK


def main():
   # always remember to setup the network
   setup('testnet')

   #
   # This script creates a P2SH address containing a CHECKSEQUENCEVERIFY plus
   # a P2PKH locking funds with a key as well as for 20 blocks
   #

   # set values
   relative_blocks = 20

   seq = Sequence(TYPE_RELATIVE_TIMELOCK, relative_blocks)

   # secret key corresponding to the pubkey needed for the P2SH (P2PKH) transaction
   p2pkh_sk = PrivateKey('cRvyLwCPLU88jsyj94L7iJjQX5C2f8koG4G2gevN4BeSGcEvfKe9')

   # get the address (from the public key)
   p2pkh_addr = p2pkh_sk.get_public_key().get_address()

   # create the redeem script
   redeem_script = Script([seq.for_script(), 'OP_CHECKSEQUENCEVERIFY', 'OP_DROP', 'OP_DUP', 'OP_HASH160', p2pkh_addr.to_hash160(), 'OP_EQUALVERIFY', 'OP_CHECKSIG'])

   # create a P2SH address from a redeem script
   addr = P2shAddress.from_script(redeem_script)
   print(addr.to_string())

if __name__ == "__main__":
   main()

當我使用自己的私鑰執行此程式碼時,我會得到如下地址:

2N3M2ZnDsw4FMDYTyMmtk6k12pBzbyKJvBR

據我了解,該地址是從我的私鑰創建的,所以我發送給它的資金不應該直接回到我的錢包嗎?

據我了解,該地址是從我的私鑰創建的,所以我發送給它的資金不應該直接回到我的錢包嗎?

除非您告訴您的錢包期待交易發送到該地址,否則錢包無法猜測該地址的雜湊實際上是它恰好擁有私鑰的腳本的雜湊。即使它確實知道,錢包通常也無法花費發送到此類腳本的資金。

接收方錢包本身負責決定它接受資金的地址。你拿了一個錢包的密鑰,用那個密鑰建構一個任意腳本,對它進行雜湊處理,然後把它放在一個地址中,你是在嘗試做錢包的工作。

這類似於你晚上去朋友家吃飯,在他們的院子裡挖一個洞,把錢埋在那裡,然後當他們聲稱他們沒有收到你的錢時表現得非常驚訝(“怎麼辦?你的意思是?錢在你的財產上!是你的!”)。

擁有花費資金的鑰匙不足以讓收款人接受資金。事實上,它甚至可能沒有必要。如果私鑰儲存在硬體錢包中,軟體很可能被配置為接受涉及公鑰的地址支付,它知道硬體錢包有私鑰。但它仍然需要配置為這樣做,就像在您的範例中一樣。

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