Academic-Research

如何真實地模擬網路未使用交易輸出的分佈?

  • February 9, 2015

我正在做一個模擬來探索更新檔對 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 輸出使其餘輸出超出比例,因此這是一個沒有最小輸出的圖:

在此處輸入圖像描述

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