自己一直用来看比特币挖矿难度调整的app好像出了bug。今天花了一上午的时间研究了一下链上的挖矿难度调整的算法。现在在分享一下。
首先,先了解一下难度调整公式:
newdiff=diff*(2016*10*60)/R
newdiff: 新的难度调整值
diff: 上次难度调整结果
(2016*10*60): 每10分钟产生一个区块,两周时间产生区块数=2016,
R: 本次难度调整的2016个出快实际用时
知道了难度调整公式,那难度是怎么求出来的。
难度=创世块hash/当前难度hash
中本聪的源码src/chainparams.cpp文件220行代码的创世块里写死了第一个区块的难度hash为:0x1d00ffff。
genesis = CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN);
这个数的理解是,0x1d表示难度数据的数值有多少个字节。0x1d十进制是29。表示0x00ffff后边补上0后一共是29个字节的长度。所以创世块难度hash就是:
0x00000000FFFF0000000000000000000000000000000000000000000000000000
每次难度调整时都会有新的难度调整Bits值。比如当前的难度Bits值就是:386990361,这是十进制,转成十六进制就是0x17110119。用转换创世hash的方法转换后为:
0x0000000000000000001101190000000000000000000000000000000000000000
那么当前所有出快都必须小于或等于这个hash值才难算合法有效区块。
那么(当前区块高度621287)当前难度就是:
diff=0x00000000FFFF0000000000000000000000000000000000000000000000000000/0x0000000000000000001101190000000000000000000000000000000000000000
diff=16552923967337
结果等于所有网站上显示的621287区块高度的难度值16552923967337
区块数据API
btc.com的api介结:
区块数据调用例子
显示最近的区块
https://chain.api.btc.com/v3/block/latest
显示指定高度的区块
https://chain.api.btc.com/v3/block/608222
显示指定hash的区块
https://chain.api.btc.com/v3/block/0000000000000000000e94b30afc79dd32e19fe4e90618b0dc200a34036b46ec
blockchair.com的api介绍,支持btc,ltc,eth,bch,ripple,stellar,ton/testnet
https://blockchair.com/api/docs
区块数据调用例子,比特币数据单位为聪
显示最近的1个区块数据
https://api.blockchair.com/bitcoin/blocks?limit=1
显示最近的10个区块数据
https://api.blockchair.com/bitcoin/blocks
显示指定高度的区块详细数据
https://api.blockchair.com/bitcoin/blocks?q=id(608200)
LTC的使用和BTC一样,只是把上边链接中的bitcoin换成了litecoin.
数据例子
btc.com:
BTC
数据说明
{
height: int 块高度
version: int 块版本
mrkl_root: string Merkle Root
curr_max_timestamp: int 块最大时间戳
timestamp: int 块时间戳
bits: int bits
nonce: int nonce
hash: string 块哈希
prev_block_hash: string 前向块哈希,如不存在,则为 null
next_block_hash: string 后向块哈希,如不存在,则为 null
size: int 块体积
pool_difficulty: int 矿池难度
difficulty: int 块难度
tx_count: int 块奖励
reward_block: int 块奖励
reward_fees: int 块手续费
created_at: int 该记录系统处理时间,无业务含义
confirmations: int 确认数
extras: {
relayed_by: string 块播报方
}
}
得到的数据
(https://chain.api.btc.com/v3/block/latest)
(https://chain.api.btc.com/v3/block/608226)
{
"data": {
"height": 608226,
"version": 536870912,
"mrkl_root": "0692479167e28724ec42d72f4f9d5dace1ac64dd5033aff6cb3470c3ecb4ebab",
"timestamp": 1576417321,
"bits": 387308498,
"nonce": 3015452293,
"hash": "000000000000000000009702e6fd61c4f2d6afd14ef844db8bf1b9f613906754",
"prev_block_hash": "000000000000000000067d28ec9d70867bab2a59ea38b050b82f39f0b6f19d47",
"next_block_hash": "0000000000000000000000000000000000000000000000000000000000000000",
"size": 1123402,
"pool_difficulty": 477170639938249,
"difficulty": 12876842089682.479,
"tx_count": 1635,
"reward_block": 1250000000,
"reward_fees": 5255308,
"created_at": 1576417345,
"confirmations": 1,
"is_orphan": false,
"curr_max_timestamp": 1576417321,
"is_sw_block": true,
"stripped_size": 956597,
"weight": 3993193,
"extras": {
"pool_name": "SlushPool",
"pool_link": "https://slushpool.com/"
}
},
"err_no": 0,
"err_msg": null
}
blockchair.com:
BTC(https://api.blockchair.com/bitcoin/blocks?limit=1)
{
"data": [
{
"id": 608224,
"hash": "000000000000000000079522cc63f43739f2de6df18c43627d63d3eb16d5fbab",
"date": "2019-12-15",
"time": "2019-12-15 13:39:32",
"median_time": "2019-12-15 12:22:59",
"size": 1169566,
"stripped_size": 941204,
"weight": 3993178,
"version": 536870912,
"version_hex": "20000000",
"version_bits": "100000000000000000000000000000",
"merkle_root": "d621a4b9d5e1f6c84dfd64a855449e02a7071525e8c87d6f2c5c41702cca6f0c",
"nonce": 903910756,
"bits": 387308498,
"difficulty": 12876842089682,
"chainwork": "00000000000000000000000000000000000000000ae026b93669b770616f986f",
"coinbase_data_hex": "03e04709049537f65d652f4254432e434f4d2ffabe6d6d1d98d29707de3c8ff625db2edb68cfd51b88817d95dcf72c14dd9bc489bf68e208000000ceeed33d2220cd9c25bb010000000000",
"transaction_count": 1853,
"witness_count": 1228,
"input_count": 5088,
"output_count": 4725,
"input_total": 715614787561,
"input_total_usd": 50423100,
"output_total": 716864787561,
"output_total_usd": 50511200,
"fee_total": 16277169,
"fee_total_usd": 1146.91,
"fee_per_kb": 13922.3,
"fee_per_kb_usd": 0.980983,
"fee_per_kwu": 4074.98,
"fee_per_kwu_usd": 0.287128,
"cdd_total": 2631.2267182517,
"generation": 1250000000,
"generation_usd": 88076.6,
"reward": 1266277169,
"reward_usd": 89223.5,
"guessed_miner": "BTC.com"
}
],
"context": {
"code": 200,
"source": "A+T",
"time": 0.023128986358642578,
"limit": 1,
"offset": 0,
"rows": 1,
"pre_rows": 1,
"total_rows": 608225,
"state": 608224,
"cache": {
"live": false,
"duration": 60,
"since": "2019-12-15 13:40:55",
"until": "2019-12-15 13:41:55",
"time": 4.0531158447265625e-6
},
"api": {
"version": "2.0.40a",
"last_major_update": "2019-07-19 18:07:19",
"next_major_update": null,
"documentation": "https:\/\/blockchair.com\/api\/docs",
"notice": "Beginning July 19th, 2019 all applications using Blockchair API on a constant basis should apply for an API key (mailto:info@blockchair.com)"
}
}
}
LTC(https://api.blockchair.com/litecoin/blocks?limit=1)
{
"data": [
{
"id": 1753620,
"hash": "ac74a59df14fbde7782d7d56f06ccd601296b35022594162db45736131056346",
"date": "2019-12-15",
"time": "2019-12-15 13:34:21",
"median_time": "2019-12-15 13:27:07",
"size": 3396,
"stripped_size": 2481,
"weight": 10839,
"version": 536870912,
"version_hex": "20000000",
"version_bits": "100000000000000000000000000000",
"merkle_root": "f7b52a1a9f03e18616e3d1bf5723736f8ae0f766769cc1b7adc32eac3c8fa12a",
"nonce": 864342164,
"bits": 436417938,
"difficulty": 5227673.9977748,
"chainwork": "000000000000000000000000000000000000000000000380363ab1ae9aa2f42c",
"coinbase_data_hex": "0314c21a045df6365d2cfabe6d6d6a698c3ee473c740fee60276bdb2b754abfc4dae2efbc65d83d3bccfa39b74e84000000000000000042f4c502f082200236429000000",
"transaction_count": 11,
"witness_count": 8,
"input_count": 15,
"output_count": 21,
"input_total": 3007381084,
"input_total_usd": 1301.9,
"output_total": 4257381084,
"output_total_usd": 1843.02,
"fee_total": 356462,
"fee_total_usd": 0.154312,
"fee_per_kb": 115772,
"fee_per_kb_usd": 0.0501177,
"fee_per_kwu": 36763.8,
"fee_per_kwu_usd": 0.0159151,
"cdd_total": 5093.9833269198,
"generation": 1250000000,
"generation_usd": 541.125,
"reward": 1250356462,
"reward_usd": 541.279,
"guessed_miner": "litecoinpool.org"
}
],
"context": {
"code": 200,
"source": "A+T",
"time": 0.029465913772583008,
"limit": 1,
"offset": 0,
"rows": 1,
"pre_rows": 1,
"total_rows": 1753621,
"state": 1753620,
"cache": {
"live": false,
"duration": 60,
"since": "2019-12-15 13:37:58",
"until": "2019-12-15 13:38:58",
"time": 3.0994415283203125e-6
},
"api": {
"version": "2.0.40a",
"last_major_update": "2019-07-19 18:07:19",
"next_major_update": null,
"documentation": "https:\/\/blockchair.com\/api\/docs",
"notice": "Beginning July 19th, 2019 all applications using Blockchair API on a constant basis should apply for an API key (mailto:info@blockchair.com)"
}
}
}
获取未打包数据区块信息
https://api.blockchair.com/bitcoin/stats
{
"data": {
"blocks": 608227,
"transactions": 484046565,
"outputs": 1290027617,
"circulation": 1810280854497237,
"blocks_24h": 127,
"transactions_24h": 273400,
"difficulty": 12876842089682,
"volume_24h": 68714575466075,
"mempool_transactions": 4644,
"mempool_size": 4224831,
"mempool_tps": 2.783333333333333,
"mempool_total_fee_usd": 887.7269,
"best_block_height": 608226,
"best_block_hash": "000000000000000000009702e6fd61c4f2d6afd14ef844db8bf1b9f613906754",
"best_block_time": "2019-12-15 13:42:01",
"blockchain_size": 253752321054,
"average_transaction_fee_24h": 5248,
"inflation_24h": 158750000000,
"median_transaction_fee_24h": 1857,
"cdd_24h": 3104856.899387399,
"largest_transaction_24h": {
"hash": "ee04f950752be0bbed292056aae42025ad7abdf932b19e3c42a8c50e1fa7e0f1",
"value_usd": 26808956
},
"nodes": 9064,
"hashrate_24h": "81331787721971307411",
"inflation_usd_24h": 11233340.5,
"average_transaction_fee_usd_24h": 0.3713934472758215,
"median_transaction_fee_usd_24h": 0.1314035484,
"market_price_usd": 7076.12,
"market_price_btc": 1,
"market_price_usd_change_24h_percentage": -1.14187,
"market_cap_usd": 128212171062,
"market_dominance_percentage": 66.48,
"next_retarget_time_estimate": "2019-12-19 18:14:58",
"next_difficulty_estimate": 13035843741838,
"countdowns": [
{
"event": "Reward halving",
"time_left": 13063200
}
],
"suggested_transaction_fee_per_byte_sat": 6
},
"context": {
"code": 200,
"source": "A",
"time": 0.6486949920654297,
"state": 608226,
"cache": {
"live": false,
"duration": "Ignore",
"since": "2019-12-15 13:54:03",
"until": "2020-12-14 13:54:03",
"time": 3.0994415283203125e-6
},
"api": {
"version": "2.0.40a",
"last_major_update": "2019-07-19 18:07:19",
"next_major_update": null,
"documentation": "https:\/\/blockchair.com\/api\/docs",
"notice": "Beginning July 19th, 2019 all applications using Blockchair API on a constant basis should apply for an API key (mailto:info@blockchair.com)"
}
}
}
网友评论