Testnet

比特幣中是否有用於測試的沙箱?

  • February 22, 2021

比特幣中是否有用於測試的沙箱,以便我可以在不探勘的情況下創建樣本比特幣並進行交易以進行測試?

測試網真的很重(數百 GB),現在有一個更輕的替代方案:signet. 還有一個名為 的僅限本地網路regtest,我將其放在自己的部分中。最後,我將解釋txindex,這是擁有自己的迷你區塊瀏覽器的有用選項。

書籤

要使用它,首先使用以下選項啟動 bitcoind:

bitcoind -signet

它需要同步,但它會比 testnet 快得多,因為該鍊是最近才啟動的,並且在撰寫本文時只有大約 27000 個塊:

% bitcoin-cli -signet getblockchaininfo
{
 "chain": "signet",
 "blocks": 26029

您可以使用bitcoin-cli -signet getnewaddress獲取一個新地址,然後將其粘貼到水龍頭中:https ://signet.bc-2.jp/ (如果它抱怨您沒有錢包,請參閱下一節)。請注意signet地址也是如何以tb(稱為“人類可讀前綴”,hrp)開頭的,就像測試網地址一樣。

% bitcoin-cli -signet listunspent
[
 {
   "txid": "9484eff65e5c33f601a8d6446859ffbc6ba59ffd53dca564d66a7c09e040c26a",
   "address": "tb1q7x3nnyskqmgrj9hp95fgfg75fz50x4khay3s0t",
   "amount": 10.00000000,
   "confirmations": 3,

如果您沒有立即看到任何內容,請稍等。交易到達後,您會看到確認計數定期上升。Signet 比 testnet 有更多的正常塊。

註冊測試

regtest 並不是真正的網路,因為它不打算公開使用。這條鏈從創世開始,工作量證明被有效地禁用,所以你可以只探勘自己的塊。如果您需要測試重組和類似的東西,這將非常有用,而您將無法使用 signet。

% bitcoind -regtest

讓它在單獨的終端視窗中執行。

現在你應該有一個空鏈:

% bitcoin-cli -regtest getblockchaininfo
{
 "chain": "regtest",
 "blocks": 0,

現在,讓我們看看你是否有錢包:

% bitcoin-cli -regtest getwalletinfo          
error code: -18
error message:
No wallet is loaded.

如果您收到這樣的錯誤,請創建一個錢包:

% bitcoin-cli -regtest createwallet testwallet
{
 "name": "testwallet",
 "warning": ""
}

現在,您可以創建一個新地址:

% bitcoin-cli -regtest getnewaddress          
bcrt1q0qx0d7prvrd64s3e3trq39fet7jwdecstw5tzu

注意上面提到的 HRP 現在是“bcrt”,“bitcoin regtest”。

挖一些硬幣

沒錯,CPU 探勘還活著;)事實上,regtest 只有在你自己生成一些塊時才有塊。這對測試很好,你有時間弄清楚。

你可以直接挖到錢包(所謂的coinbase outputs,你可能聽說過以這些名字命名的公司)。在這裡,我使用 shell 插入使用上面的命令生成的地址(也應該在 Windows 上的 PowerShell 中工作):

% bitcoin-cli -regtest generatetoaddress 10 $(bitcoin-cli -regtest getnewaddress)
[
 "2e25176b5122a3d16eca11355b2807ebf99e8ef3cf01e32634417baf47cb9a4b",
 "3e8136a62d513925a075700e92789d70da67d5b3dd986e936d65b12a3ba53c72",
 "55ca10e3932a9087259a3826148aa660e09b69b63fe84d6a81bc4e57de052060",
 "4864e894662693ae7e32cb0d2a8bc3ad94c4f5e67e109873555bc5f7b5c166bc",
 "0de8a4bfb5fa5a38fba39dcf9fe360e3382e6fa56c226553c30736525bea659e",
 "69e3a04724793b90de126358a99f297b821cac83b9be12f3d569effd73729199",
 "3eb2a83540ce04ef75f5258359ee1695fa0b2e6cbc04a078f85e3182cd500004",
 "35e39307638bca2db359ee8fa6930fbbf20e5d465882c50e05c05e2510ca2e28",
 "12f2b855729929aa091a7cffccb66886a6c406c7855f8851c25ab162b17455f1",
 "2414f3ddfa767aa1916f296066d35ae58c828b49e84542c57509e7161201b746"
]

我們挖了一些比特幣,但你要記住有“幣成熟度”,這意味著幣在挖礦後不能立即使用,即使在 regtest 上也不行。

所以在探勘這 10 個區塊之後,你會看到錢包仍然報告沒有未使用的輸出:

% bitcoin-cli -regtest listunspent
[
]

為了使硬幣成熟,再開採一百個區塊(我將省略輸出,它只是上面的命令,100而不是10),您將在第一個命令中看到開采的硬幣:

% bitcoin-cli -regtest listunspent
 {
   "txid": "6fe92df06b95a20db44f989471483802a9aebc56e93057dca9fe0546445d35ff",
   "vout": 0,
   "address": "bcrt1qlu9a5687f3m4ct3r5ndlwy8juppgghysy2s67f",
   "label": "",
   "scriptPubKey": "0014ff0bda68fe4c775c2e23a4dbf710f2e042845c90",
   "amount": 50.00000000,
   "confirmations": 110,
   "spendable": true,
   "solvable": true,
   "desc": "wpkh([a45ff478/0'/0'/2']02ebc0275e56ecca4a80d6a6ff7d7ab884c972cff9db9a91b9bb3681741624d41a)#rgeusc6u",
  

會有十個這樣的交易,因為我們最初開采的十個區塊都已經成熟。他們的確認計數從 101 到 110。

處理比特幣輸出jq

請注意如何使用標準 JSON 工具從bitcoin-cli輸出中提取資訊。

例如,我們可以驗證未使用的錢包輸出數量。在上一節的範例中,我們探勘了 110 個區塊,每個區塊都有一個用於核心錢包的 coinbase 輸出。但只有前 10 個已經成熟:

% bitcoin-cli -regtest listunspent | jq length
10

重新開始,核爆鏈條

您可能希望在執行測試之前和/或之後重置您的測試環境。使用 regtest,您可以刪除整個區塊鏈。所以關閉bitcoind我們上面開始的過程。您可以簡單地擦除 regtest 目錄,但要非常小心,不要擦除錯誤的目錄(實際上,您在執行測試的文件系統中甚至不應該有真正的(主網)硬幣)。

% rm -rf ~/.bitcoin/regtest/

這不是真正的出廠重置,因為如果您有任何配置~/.bitcoin/bitcoin.conf,它仍然會被載入。因此,如果某些事情仍然無法正常工作,請檢查您的配置。

刪除 signet 區塊鏈沒有多大意義,因為您只需在重新啟動後下載完全相同的鏈(除非某些東西嚴重損壞)。blocks因此,為了確保一個乾淨的signet測試環境chainstate,可能只擦除除wallets和之外的所有內容indexes

Txindex,你自己的區塊瀏覽器

比特幣核心有一個簡潔的功能,可以讓你查找任意交易的資訊。但是你必須先啟用它。為此,請寫txindex=1在 中~/.bitcoin/bitcoin.conf,可能在一個regtestsignet部分中,儘管我只是將它放在頂層,因為我的主網硬幣在其他地方,它對所有測試都很有用。

現在,啟用 txindex 後,您可以檢索區塊 1 的第一筆交易(在創世之後)的資訊:

bitcoin-cli -signet decoderawtransaction $(
 bitcoin-cli -signet getrawtransaction $(
   bitcoin-cli -signet getblock $(
     bitcoin-cli -signet getblockhash 1
   ) | jq -r '.tx[0]'
 )
)

例如,您將獲得這些硬幣被鎖定的輸出腳本:

 ...
 "vout": [
   {
     "value": 50.00000000,
     "n": 0,
     "scriptPubKey": {
       "asm": "0 9243f727dd5343293eb83174324019ec16c2630f",

“getrawtransaction”步驟需要 txindex。

這類似於您將在區塊瀏覽器中看到的資訊。在這個例子中,我使用了 signet(它有一個公共區塊瀏覽器),但是對於 regtest,你顯然沒有可用的區塊瀏覽器,所以 txindex 可以派上用場。

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