replaced share explorer with javascript page
[p2pool.git] / web-static / share.html
diff --git a/web-static/share.html b/web-static/share.html
new file mode 100644 (file)
index 0000000..d0f678a
--- /dev/null
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+    <head>
+        <title>P2Pool Share Explorer</title>
+        <script type="text/javascript" src="d3.v2.min.js"></script>
+    </head>
+    <body>
+        <p>Loading...</p>
+        <script type="text/javascript">
+            function hex2a(hex) {
+                var str = '';
+                for (var i = 0; i < hex.length; i += 2) {
+                    var code = parseInt(hex.substr(i, 2), 16);
+                    str += code >= 32 && code <= 126 ? String.fromCharCode(code) : '?';
+                }
+                return str;
+            }
+            
+            function target_to_difficulty(target) { return (0xffff0000 * Math.pow(2, 256-64) + 1)/(target + 1); }
+            
+            var current_hash = null;
+            function reload() {
+                var share_hash = document.location.hash.substr(1);
+                if(share_hash == current_hash) return;
+                d3.json('/web/share/' + share_hash, function(share) {
+                    current_hash = share_hash;
+                    var b = d3.select('body');
+                    b.selectAll('*').remove();
+                    if(share == null) {
+                        b.append('p').text('share not found');
+                        return;
+                    }
+                    var h1 = b.append('h1');
+                        h1.append('span').text('Share ');
+                        h1.append('a').attr('href', '#' + share_hash).text(share_hash.substr(-8));
+                    var parent = b.append('p')
+                        parent.append('span').text('Parent: ');
+                        parent.append('a').attr('href', '#' + share.parent).text(share.parent.substr(-8));
+                    var children = b.append('p');
+                        children.append('span').text('Children: ');
+                        children.data(share.children).append('a').attr('href', function(c){return '#' + c}).text(function(c){return c.substr(-8)});
+                    b.append('h2').text('Local data');
+                    b.append('p').text('Verified: ' + share.local.verified);
+                    b.append('p').text('Time first seen: ' + new Date(1000*share.local.time_first_seen) + ' (' + share.local.time_first_seen + ')');
+                    b.append('p').text('Peer first received from: ' + share.local.peer_first_received_from);
+                    b.append('h2').text('Share data');
+                    b.append('p').text('Timestamp: ' + new Date(1000*share.share_data.timestamp) + ' (' + share.share_data.timestamp + ')');
+                    b.append('p').text('Difficulty: ' + target_to_difficulty(share.share_data.target));
+                    b.append('p').text('Minimum difficulty: ' + target_to_difficulty(share.share_data.max_target));
+                    b.append('p').text('Payout address: ' + share.share_data.payout_address);
+                    b.append('p').text('Donation amount: ' + d3.format('.3p')(share.share_data.donation));
+                    b.append('p').text('Stale info: ' + (share.share_data.stale_info == 0 ? 'none' : share.share_data.stale_info == 253 ? 'had an orphan' : share.share_data.stale_info == 254 ? 'had a dead' : 'unknown'));
+                    b.append('p').text('Nonce: ' + share.share_data.nonce);
+                    b.append('h2').text('Block');
+                    var block = b.append('p')
+                        block.append('span').text('Hash: ')
+                        block.append('a').attr('href', 'http://blockexplorer.com/block/' + share.block.hash).text(share.block.hash);
+                    b.append('p').text('Transaction count: ' + share.block.txn_count_range);
+                    b.append('h2').text('Header');
+                    b.append('p').text('Version: ' + share.block.header.version);
+                    var prevblock = b.append('p')
+                        prevblock.append('span').text('Previous block: ');
+                        prevblock.append('a').attr('href', 'http://blockexplorer.com/block/' + share.block.header.previous_block).text(share.block.header.previous_block);
+                    b.append('p').text('Merkle root: ' + share.block.header.merkle_root);
+                    b.append('p').text('Timestamp: ' + share.block.header.timestamp);
+                    b.append('p').text('Difficulty: ' + target_to_difficulty(share.block.header.target));
+                    b.append('p').text('Nonce: ' + share.block.header.nonce);
+                    b.append('h2').text('Generation transaction');
+                    b.append('p').text('Hash: ' + share.block.gentx.hash);
+                    b.append('p').text('Coinbase: ' + share.block.gentx.coinbase + ' ' + hex2a(share.block.gentx.coinbase));
+                    b.append('p').text('Value: ' + share.block.gentx.value + ' BTC');
+                    return true;
+                });
+            }
+            reload();
+            setInterval(reload, 100);
+        </script>
+    </body>
+</html>