Academic-Research
如何真實地模擬網路未使用交易輸出的分佈?
我正在做一個模擬來探索更新檔對 BitcoinCore 的CoinSelection行為的有用性。為此,我正在尋找關於未使用輸出的分佈與它們在 satoshi 中的值相對應的統計數據。
到目前為止,除了過時的未使用交易輸出數量之外,我還沒有找到太多關於該主題的內容,因為搜尋詞可能與許多不相關的主題發生衝突。
是否有任何文件或其他來源討論:
- 如何真實地模擬所有 UTXO(未使用的交易輸出)的價值分佈(以 satoshi 為單位)?
- 哪種類型的曲線最接近分佈?
- 網路 UTXO 值的均值、標準差和變異數是多少?
- 獎勵:UTXO 值的分佈如何隨時間變化?
澄清:我對模擬 UTXO 中持有的聰的數量感興趣。
我還沒有閱讀任何試圖分析未使用輸出數量的論文。更多時候,人們對地址餘額的分佈感興趣。這可能很有趣,因為它反映了比特幣的均勻分佈。
我確實找到了這篇文章: http: //www.coindesk.com/what-block-chain-analysis-tells-bitcoin/,這似乎是您可能感興趣的,並且與 UTXO 的分佈有關。
如果你
gettxoutsetinfo
使用比特幣核心 RPC 呼叫,它會告訴你一些關於 UTXO 集的基本資訊。我只是這樣做並得到:{ "height" : 338396, "bestblock" : "000000000000000009f32437cb28d54ff600ec020778c8ce84ecf93b99d5218c", "transactions" : 4525842, "txouts" : 16217914, "bytes_serialized" : 566046691, "hash_serialized" : "1ad2172e4d37ce21291c116580f5b527e4c302b9c2ce4e88a91c0c00f748fb8d", "total_amount" : 13709764.78496462 }
所以看起來一個UTXO的平均數量是:
13709764.78496462 / 16217914 = 0.84534699
為了分析輸出的數量(注意,這不僅僅是UTXO),我編寫了這個快速腳本:
<?php require_once 'jsonRPCClient.php'; $bitcoin = new jsonRPCClient('http://{username}:{password}@127.0.0.1:8332/'); $info = $bitcoin->getinfo(); $height = $info['blocks']; $numTrials = 1000; $includeCoinbase = false; $cutoffs = array(); for ($i = 0; $i < 10; $i++) { $cutoffs[] = $i; } for ($i = 1; $i < 10; $i++) { $cutoffs[] = 10*$i; } for ($i = 1; $i < 10; $i++) { $cutoffs[] = 100*$i; } for ($i = 1; $i < 10; $i++) { $cutoffs[] = 1000*$i; } function GetRange($value) { global $cutoffs; for ($i = 0; $i < count($cutoffs)-1; $i++) { if ($cutoffs[$i] <= $value && $value < $cutoffs[$i+1]) return $cutoffs[$i] . " - " . $cutoffs[$i+1]; } return $cutoffs[count($cutoffs)-1] . " - ..."; } $sum = 0; $distribution = array(); for ($i = 0; $i < $numTrials; $i++) { $blockhash = $bitcoin->getblockhash(rand(1, $height)); $block = $bitcoin->getblock($blockhash); $randTxIndex = rand(0, count($block['tx'])-1); if ($randTxIndex == 0 && !$includeCoinbase) { $i--; continue; } $randTxHash = $block['tx'][$randTxIndex]; $randTx = $bitcoin->getrawtransaction($randTxHash, 1); $numOutputs = count($randTx['vout']); $randOutput = $randTx['vout'][rand(0, $numOutputs-1)]; $value = $randOutput['value']; $sum += $value; $distribution[GetRange($value)] += 1; } echo (json_encode($distribution, JSON_PRETTY_PRINT) . "\n"); echo "average: " . ($sum / $numTrials) . "\n";
結果是(經過一點清理之後):
average: 89.55518291596 START END COUNT 0 1 636 1 2 73 2 3 18 3 4 20 4 5 14 5 6 11 6 7 8 7 8 8 8 9 11 9 10 12 10 20 36 20 30 26 30 40 15 40 50 16 50 60 29 60 70 5 70 80 5 80 90 4 90 100 3 100 200 29 200 300 4 300 400 4 400 500 1 500 600 1 600 700 1 700 800 1 800 900 3 900 1000 0 1000 2000 2 2000 3000 1 3000 4000 0 4000 5000 0 5000 6000 1 6000 7000 0 7000 8000 0 8000 9000 0 9000 ... 2
其中,當繪製時,給出:
由於 0-1 輸出使其餘輸出超出比例,因此這是一個沒有最小輸出的圖: