Skip to content

Instantly share code, notes, and snippets.

@kallewoof
Last active January 8, 2017 06:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kallewoof/9b0e541366941e08e41ab1bf3e03f017 to your computer and use it in GitHub Desktop.
Save kallewoof/9b0e541366941e08e41ab1bf3e03f017 to your computer and use it in GitHub Desktop.
Bitcoin picks longest chain regardless of work done. In practice, work done is based on difficulty, not on the hash, which is why this fails.
> hexstr = (i) => { a = Buffer.alloc(4); a.writeInt32LE(i); return a.toString('hex'); }
[Function: hexstr]
> f = (e,i) => { console.log(`e=${JSON.stringify(e)}; i=${JSON.stringify(i)}`)};
[Function: f]
> const { BitcoinNet, BitcoinGraph, Block, BlockHeader } = require('bitcointest')
undefined
> net = new BitcoinNet('../bitcoin/src', '/tmp/bitcointest', 22001, 22002);
{ path: '../bitcoin/src',
cfgprefix: '/tmp/bitcointest',
nextport: 22001,
nextrpcport: 22002,
nodes: [] }
> graph = new BitcoinGraph(net);
{ net:
{ path: '../bitcoin/src',
cfgprefix: '/tmp/bitcointest',
nextport: 22001,
nextrpcport: 22002,
nodes: [] } }
> const nodes = net.launchBatchS(4);
undefined
> const [n1,n2,n3,n4] = nodes;
undefined
> net.waitForNodesS(nodes, 50000)
undefined
> net.mergeS(nodes);
[ null, null, null, null, null, null ]
> n1.generateBlocksS(1);
[ '5b6aab3faca3a1a76cab5f26b1e98a77fba91a791168c43dc812d90989902efc' ]
> net.syncS(nodes);
undefined
> const x = net.partitionS(nodes, 2);
undefined
> const [blockhash] = n2.generateBlocksS(1);
undefined
> graph.printBlockChainsS([n1,n2],[n3,n4])
0f9188f1
5b6aab3f
3d697a37
undefined
> b = n2.getBlockS(blockhash);
{ hex: undefined,
header:
{ hex: undefined,
version: 536870912,
prevBlock: 'fc2e908909d912c83dc46811791aa9fb778ae9b1265fab6ca7a1a3ac3fab6a5b',
merkleRoot: '0d31dbf3b653d53812111a674d81450da34c4faa74f9ec37f0662eb2793a8778',
timestamp: 1483849377,
bits: '207fffff',
nonce: 7,
tx: [ '78873a79b22e66f037ecf974aa4f4ca30d45814d671a111238d553b6f3db310d' ] },
vtx:
[ { hex: '02000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03520101ffffffff0200f2052a010000002321021bf670c29b3674afe32616508a916093119826eb7e8d2b3793b11d47ec901943ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000',
version: 2,
vin: [Object],
vout: [Object],
lockTime: 0 } ] }
> h = b.header;
{ hex: undefined,
version: 536870912,
prevBlock: 'fc2e908909d912c83dc46811791aa9fb778ae9b1265fab6ca7a1a3ac3fab6a5b',
merkleRoot: '0d31dbf3b653d53812111a674d81450da34c4faa74f9ec37f0662eb2793a8778',
timestamp: 1483849377,
bits: '207fffff',
nonce: 7,
tx: [ '78873a79b22e66f037ecf974aa4f4ca30d45814d671a111238d553b6f3db310d' ] }
> hhex = h.encode();
'00000020fc2e908909d912c83dc46811791aa9fb778ae9b1265fab6ca7a1a3ac3fab6a5b0d31dbf3b653d53812111a674d81450da34c4faa74f9ec37f0662eb2793a8778a1be7158ffff7f2007000000'
> hbuf = h.toBuffer();
<Buffer 00 00 00 20 fc 2e 90 89 09 d9 12 c8 3d c4 68 11 79 1a a9 fb 77 8a e9 b1 26 5f ab 6c a7 a1 a3 ac 3f ab 6a 5b 0d 31 db f3 b6 53 d5 38 12 11 1a 67 4d 81 ... >
> tgt = Buffer.from('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000', 'hex');
<Buffer ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 00 00 00>
> pow = Block.performPoW(hbuf, tgt)
Starting time=1483849389, nonce=0
Timeout = 10 minutes
PoW with target = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Depending on the difficulty, this may take awhile...
Progress after 4 iterations:
- lowest value -> 34a983b21b1c3ab828d2bccde669ef7bfbf47ed70624760eb3a5300282e22311 [3]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 15 iterations:
- lowest value -> d1f3af517bf51c6cd4c3c41bec90b66e8f76f112be89114a0bbf05008e60c00b [18]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 9 iterations:
- lowest value -> ab02e7527866ebd29c496fc87da3e395a592604b0c4d97de7d127d02efe08a05 [27]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 12 iterations:
- lowest value -> 7f970e4db8357f5a244ffb15e45b950a04d2087da90d193aedf1eabd7e8adb01 [39]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 68 iterations:
- lowest value -> bde5796385b541b967eb0c81a8702cb1b55138e216581924bcc64a8ad00e6c00 [107]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 381 iterations:
- lowest value -> 6b85374e7df8c044e66e2a825ce3c7f214083536d5e606dfd80813841f390900 [488]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 597 iterations:
- lowest value -> 71d8f2676a04288d6de684fa32c53ceebe8ce34a85487ccdd2a04100da6b0700 [1085]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 18430 iterations:
- lowest value -> a060370a36d0cea1dbf62df4a7b507fdf8f28896383e90c448081fed4e090100 [19515]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 31667 iterations:
- lowest value -> fc5df1a8d939edec9c2849aeb532ff6ce87965faaff31d058b1d54bbc6f10000 [51182]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 35111 iterations:
- lowest value -> 03b62c5ee1dc8bf1d8f71c1f8c79209df8960171996320d7d5bf9a622d240000 [86293]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 247850 iterations:
- lowest value -> 84976f96b3fbb86fb4f88ecf6e4073986805d9e7045735609542822a7c030000 [334143]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
- 1000000 iters [1000000]
- 2000000 iters [2000000]
- 3000000 iters [3000000]
Progress after 3304439 iterations:
- lowest value -> 8790a4e4c9ecf33931f6e23c6beff6edfd52745948ecaaeb3b006c31eb010000 [3638582]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
- 4000000 iters [4000000]
- 5000000 iters [5000000]
- 6000000 iters [6000000]
- 7000000 iters [7000000]
- 8000000 iters [8000000]
- 9000000 iters [9000000]
- 10000000 iters [10000000]
Progress after 7356092 iterations:
- lowest value -> 6db9dd15aa509797d4aa04aa60cb12ca2de790758accc26c912b99bcdc010000 [10994674]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
- 11000000 iters [11000000]
- 12000000 iters [12000000]
- 13000000 iters [13000000]
- 14000000 iters [14000000]
- 15000000 iters [15000000]
- 16000000 iters [16000000]
- 17000000 iters [17000000]
- 18000000 iters [18000000]
- 19000000 iters [19000000]
- 20000000 iters [20000000]
Progress after 9340189 iterations:
- lowest value -> 68bafb5345e460a824384587f38a6f37878e94a0ecc6ccd0424132d030010000 [20334863]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
- 21000000 iters [21000000]
- 22000000 iters [22000000]
- 23000000 iters [23000000]
- 24000000 iters [24000000]
- 25000000 iters [25000000]
- 26000000 iters [26000000]
- 27000000 iters [27000000]
- 28000000 iters [28000000]
- 29000000 iters [29000000]
- 30000000 iters [30000000]
- 31000000 iters [31000000]
- 32000000 iters [32000000]
- 33000000 iters [33000000]
- 34000000 iters [34000000]
- 35000000 iters [35000000]
- 36000000 iters [36000000]
- 37000000 iters [37000000]
- 38000000 iters [38000000]
- 39000000 iters [39000000]
- 40000000 iters [40000000]
- 41000000 iters [41000000]
- 42000000 iters [42000000]
- 43000000 iters [43000000]
- 44000000 iters [44000000]
- 45000000 iters [45000000]
- 46000000 iters [46000000]
- 47000000 iters [47000000]
- 48000000 iters [48000000]
- 49000000 iters [49000000]
- 50000000 iters [50000000]
- 51000000 iters [51000000]
- 52000000 iters [52000000]
- 53000000 iters [53000000]
- 54000000 iters [54000000]
- 55000000 iters [55000000]
- 56000000 iters [56000000]
- 57000000 iters [57000000]
- 58000000 iters [58000000]
- 59000000 iters [59000000]
- 60000000 iters [60000000]
- 61000000 iters [61000000]
- 62000000 iters [62000000]
- 63000000 iters [63000000]
- 64000000 iters [64000000]
timed out trying to solve POW
{ hash: <Buffer 50 d3 76 ba 80 e0 31 3e fc bd f2 24 4e 3f 35 a0 19 8d 15 1b 3c dd 0a e5 16 b7 27 0e 5e 4a f5 f2>,
buf: <Buffer 00 00 00 20 fc 2e 90 89 09 d9 12 c8 3d c4 68 11 79 1a a9 fb 77 8a e9 b1 26 5f ab 6c a7 a1 a3 ac 3f ab 6a 5b 0d 31 db f3 b6 53 d5 38 12 11 1a 67 4d 81 ... >,
nonce: 64874122,
time: 1483849389 }
> pow = Block.performPoW(hbuf, tgt, 3600000)
Starting time=1483851605, nonce=0
Timeout = 60 minutes
PoW with target = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Depending on the difficulty, this may take awhile...
Progress after 4 iterations:
- lowest value -> f4e058fe15c82961f1e019bf309d7a0aa5ea7b4d00adb0e41d031504dcfffe43 [3]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 1 iterations:
- lowest value -> 3d40fca974aa316f110dd6691cfd7fbfcc6b98c03894852d7921ab334e49f603 [4]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 6 iterations:
- lowest value -> aa00f3d45188f287f3ce57ad9e2084f02c95a3598a20bbbd907a0c83d80dc803 [10]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 120 iterations:
- lowest value -> 4d17dbe8bc4b56dd27bb0738a0fd786b9c009e0bba00ba73224cf22adb837401 [130]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 197 iterations:
- lowest value -> 34edc2aa591e1b0b3b73bb81b886e51eafecffc8ff07aeb700f1d0c4926f8e00 [327]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 130 iterations:
- lowest value -> 5d50c3c077a03529d8a8cad713ec9c9103a98b9cee08a5ba08fa952ac0116900 [457]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 68 iterations:
- lowest value -> 4ac747074995d88dd54c1dd16bbeddd22a216c6dbb8911d65bbbabb39de20300 [525]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 25152 iterations:
- lowest value -> 5eb636f82e0be4f121b52b2cb9bbdca797b28fa1c3778045cad2eec1aa460000 [25677]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 243016 iterations:
- lowest value -> c7b718fc17b3646ebbda45c6076b4b6cc759a9917ed38b129d4bed21d20e0000 [268693]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 47843 iterations:
- lowest value -> a32e2eff6a08e95bb341164a562a8e01b1240f163d86d45d49f00bc96a0a0000 [316536]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
Progress after 592994 iterations:
- lowest value -> 4553da224fcf8453513df61ec46faf3c715af4cb5803e833c7ac77a5cd070000 [909530]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
- 1000000 iters [1000000]
Progress after 903422 iterations:
- lowest value -> ddae4aae831d982ad078ad37cc40e2ebf31e298606e07c1d4838d6950e050000 [1812952]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
- 2000000 iters [2000000]
Progress after 868783 iterations:
- lowest value -> 19c062c45e8c76be1450787dd45f23dab069d92cb4f2b9a59f1330c333040000 [2681735]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
- 3000000 iters [3000000]
Progress after 1161243 iterations:
- lowest value -> 894d185702d4cb23a18368400ab3e971b4afa133220f6da1e8d5b38334030000 [3842978]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
- 4000000 iters [4000000]
- 5000000 iters [5000000]
- 6000000 iters [6000000]
- 7000000 iters [7000000]
- 8000000 iters [8000000]
Progress after 4646711 iterations:
- lowest value -> 77cc24755b70c73697e9096f5728020d717bf7881ed7b677fd7e99670c020000 [8489689]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
- 9000000 iters [9000000]
- 10000000 iters [10000000]
- 11000000 iters [11000000]
- 12000000 iters [12000000]
- 13000000 iters [13000000]
- 14000000 iters [14000000]
- 15000000 iters [15000000]
- 16000000 iters [16000000]
- 17000000 iters [17000000]
- 18000000 iters [18000000]
- 19000000 iters [19000000]
- 20000000 iters [20000000]
- 21000000 iters [21000000]
- 22000000 iters [22000000]
- 23000000 iters [23000000]
Progress after 14851583 iterations:
- lowest value -> 86e1d052f9a4151966fa51ea1ad1fc4f4c25a75d5e73421ce49ae35cf6010000 [23341272]
- target value -> ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
- 24000000 iters [24000000]
- 25000000 iters [25000000]
- 26000000 iters [26000000]
- 27000000 iters [27000000]
- 28000000 iters [28000000]
- 29000000 iters [29000000]
- 30000000 iters [30000000]
- 31000000 iters [31000000]
- 32000000 iters [32000000]
- 33000000 iters [33000000]
- 34000000 iters [34000000]
- 35000000 iters [35000000]
- 36000000 iters [36000000]
- 37000000 iters [37000000]
- 38000000 iters [38000000]
- 39000000 iters [39000000]
- 40000000 iters [40000000]
- 41000000 iters [41000000]
- 42000000 iters [42000000]
- 43000000 iters [43000000]
- 44000000 iters [44000000]
*** solved POW with nonce=44240483, time=1483851605 -> hash=06b40f25b6603432aa8bc6bed2eba7d75f231593df5233793884b2a20b000000 ***
{ hash: <Buffer 06 b4 0f 25 b6 60 34 32 aa 8b c6 be d2 eb a7 d7 5f 23 15 93 df 52 33 79 38 84 b2 a2 0b 00 00 00>,
buf: <Buffer 00 00 00 20 fc 2e 90 89 09 d9 12 c8 3d c4 68 11 79 1a a9 fb 77 8a e9 b1 26 5f ab 6c a7 a1 a3 ac 3f ab 6a 5b 0d 31 db f3 b6 53 d5 38 12 11 1a 67 4d 81 ... >,
nonce: 44240483,
time: 1483851605 }
> resultingHeader = new BlockHeader(pow.buf.toString('hex'));
{ hex: '00000020fc2e908909d912c83dc46811791aa9fb778ae9b1265fab6ca7a1a3ac3fab6a5b0d31dbf3b653d53812111a674d81450da34c4faa74f9ec37f0662eb2793a877855c77158ffff7f20630ea302',
version: 536870912,
prevBlock: 'fc2e908909d912c83dc46811791aa9fb778ae9b1265fab6ca7a1a3ac3fab6a5b',
merkleRoot: '0d31dbf3b653d53812111a674d81450da34c4faa74f9ec37f0662eb2793a8778',
timestamp: 1483851605,
bits: 545259519,
nonce: 44240483 }
> graph.printBlockChainsS([n1,n2],[n3,n4])
0f9188f1
5b6aab3f
3d697a37
undefined
> resultingHash = Block.getHashForBuffer(pow.buf);
<Buffer 06 b4 0f 25 b6 60 34 32 aa 8b c6 be d2 eb a7 d7 5f 23 15 93 df 52 33 79 38 84 b2 a2 0b 00 00 00>
> resultingHash2 = Block.getHashForBuffer(resultingHeader.toBuffer());
<Buffer 06 b4 0f 25 b6 60 34 32 aa 8b c6 be d2 eb a7 d7 5f 23 15 93 df 52 33 79 38 84 b2 a2 0b 00 00 00>
> b.header = resultingHeader;
{ hex: '00000020fc2e908909d912c83dc46811791aa9fb778ae9b1265fab6ca7a1a3ac3fab6a5b0d31dbf3b653d53812111a674d81450da34c4faa74f9ec37f0662eb2793a877855c77158ffff7f20630ea302',
version: 536870912,
prevBlock: 'fc2e908909d912c83dc46811791aa9fb778ae9b1265fab6ca7a1a3ac3fab6a5b',
merkleRoot: '0d31dbf3b653d53812111a674d81450da34c4faa74f9ec37f0662eb2793a8778',
timestamp: 1483851605,
bits: 545259519,
nonce: 44240483 }
> newhex = b.encode()
'00000020fc2e908909d912c83dc46811791aa9fb778ae9b1265fab6ca7a1a3ac3fab6a5b0d31dbf3b653d53812111a674d81450da34c4faa74f9ec37f0662eb2793a877855c77158ffff7f20630ea3020102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03520101ffffffff0200f2052a010000002321021bf670c29b3674afe32616508a916093119826eb7e8d2b3793b11d47ec901943ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000'
> n3.client.submitBlock(newhex, f);
undefined
> e=null; i={"result":null,"error":null,"id":null}
> graph.printBlockChainsS([n1,n2],[n3,n4])
0f9188f1
5b6aab3f
3d697a37 0000000b
undefined
> n1.generateBlocksS(1)
[ '4ea2f338f36c7edc779e493dd58b77f20ec85c45ef1ffbfc99cf91b0095e1e90' ]
> graph.printBlockChainsS([n1,n2],[n3,n4])
0f9188f1
5b6aab3f
3d697a37 0000000b
4ea2f338
undefined
> net.mergeS(nodes)
[ undefined, undefined, null, null, null, null ]
> graph.printBlockChainsS([n1,n2],[n3,n4])
0f9188f1
5b6aab3f
3d697a37
4ea2f338
undefined
>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment