EthereumのDAGサイズを計測する機会があったので、計算してみました。
仕様
block高(eth.blockNumber
)に依存しているようです。
python
def get_full_size(block_number):
sz = DATASET_BYTES_INIT + DATASET_BYTES_GROWTH * (block_number // EPOCH_LENGTH)
sz -= MIX_BYTES
while not isprime(sz / MIX_BYTES):
sz -= 2 * MIX_BYTES
return sz
WORD_BYTES = 4 # bytes in word
DATASET_BYTES_INIT = 2**30 # bytes in dataset at genesis
DATASET_BYTES_GROWTH = 2**23 # dataset growth per epoch
CACHE_BYTES_INIT = 2**24 # bytes in cache at genesis
CACHE_BYTES_GROWTH = 2**17 # cache growth per epoch
CACHE_MULTIPLIER=1024 # Size of the DAG relative to the cache
EPOCH_LENGTH = 30000 # blocks per epoch
MIX_BYTES = 128 # width of mix
HASH_BYTES = 64 # hash length in bytes
DATASET_PARENTS = 256 # number of parents of each dataset element
CACHE_ROUNDS = 3 # number of rounds in cache production
ACCESSES = 64 # number of accesses in hashimoto loop
確認方法
block number
- Ethereum BlockChain Explorer and Search によると執筆当時は以下
3932564
確認script
ブラウザで実行したいですよね。。
ブックマークレットを作りました。お気に入りに登録することで確認できるようになります。
以下のスクリプトをお気に入りに登録して実行できます。
javascript:
(function() {
var DATASET_BYTES_INIT = 2**30;
var DATASET_BYTES_GROWTH = 2**23;
var EPOCH_LENGTH = 30000;
var MIX_BYTES = 128;
var isprime = function(n) {
if (n === 2) return true;
var s = Math.sqrt(n);
for(var i = 2; i <= s; i++)
if(n % i === 0) return false;
return n !== 1;
};
var get_full_size = function(block_number) {
var sz = DATASET_BYTES_INIT + DATASET_BYTES_GROWTH * Math.floor(block_number / EPOCH_LENGTH);
sz -= MIX_BYTES;
while (!isprime(sz / MIX_BYTES)) {
sz -= 2 * MIX_BYTES;
}
return sz;
};
var block_number = prompt('block number');
var size = get_full_size(block_number);
var sizeGb = size / (1024**3);
alert('dag size is ' + sizeGb + 'GB');
})();