I haven't read any papers trying to analyze the amount of unspent outputs. More often, people are interested in the distribution of address' balances. This could be interesting because it reflects how evenly distributed bitcoin is.
I did find this article: http://www.coindesk.com/what-block-chain-analysis-tells-bitcoin/, which seems like it might be of interest to you and is related to the distribution of UTXOs.
If you call gettxoutsetinfo
with the Bitcoin Core RPC calls, it tells some basic info about the UTXO set. I just did this and got:
{
"height" : 338396,
"bestblock" : "000000000000000009f32437cb28d54ff600ec020778c8ce84ecf93b99d5218c",
"transactions" : 4525842,
"txouts" : 16217914,
"bytes_serialized" : 566046691,
"hash_serialized" : "1ad2172e4d37ce21291c116580f5b527e4c302b9c2ce4e88a91c0c00f748fb8d",
"total_amount" : 13709764.78496462
}
So it seems that the average amount of an UTXO is:
13709764.78496462 / 16217914 = 0.84534699
To analyze the amount of outputs (note, this is not only UTXOs), I wrote up this quick script:
<?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";
And the results are (after being cleaned up a little):
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
Which, when plotted, gives:
And since the 0-1 outputs make the rest go out of scale, this is a plot without the smallest outputs: