-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathtx-encdec.html
128 lines (118 loc) · 2.89 KB
/
tx-encdec.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<html>
<head>
<style>
body {
display: flex;
flex-direction: column;
}
textarea {
flex-grow: 2
}
</style>
</head>
<body>
<script>
var buf, last; // ugh
function decode() {
buf = encoded.value;
if (buf == '') {
return;
}
encoded.value = '';
var r = '';
var version = read_chars(8);
r += version + " // version\n";
var segwit = false;
var n_inputs = read_varint();
if (n_inputs == 0) {
// SegWit
segwit = true;
r += last + " // segwit marker\n";
var flag = read_varint();
r += last + " // segwit flag\n";
n_inputs = read_varint();
}
r += last + " // n_inputs\n";
for (var i=0; i<n_inputs; i++) {
var prev_hash = read_chars(64);
r += " " + prev_hash + " // prev_hash\n";
var index = read_chars(8);
r += " " + index + " // index\n";
var script_len = read_varint();
r += " " + last + " ";
var script = read_chars(script_len * 2);
r += script + " // script\n";
var sequence = read_chars(8);
r += " " + sequence + " // sequence\n";
r += "\n";
}
var n_outputs = read_varint();
r += last + " // n_outputs\n";
for (var i=0; i<n_outputs; i++) {
var amount = read_chars(16);
r += " " + amount + " // amount\n";
var script_len = read_varint();
r += " " + last + " ";
var script = read_chars(script_len * 2);
r += script + " // script\n";
r += "\n";
}
if (segwit) {
var n_witness = read_varint();
r += last + " // witness\n";
for (var i=0; i<n_witness; i++) {
var witness_len = read_varint();
r += " " + last + " ";
var witness = read_chars(witness_len * 2);
r += witness + " // witness\n";
}
}
var timelock = read_chars(8);
r += timelock + " // timelock\n";
if (buf != "") {
alert("non-empty buffer!");
console.warn(buf);
}
decoded.value = r;
}
function read_chars(len) {
var t = buf.substr(0, len);
buf = buf.substr(len);
return t;
}
function read_varint() {
last = buf.substr(0, 18);
var t = parseInt(read_chars(2), 16);
if (t == 0xfd) {
last = last.substr(0, 6);
return parseInt(read_chars(4), 16); // 16 bits
}
if (t == 0xfe) {
last = last.substr(0, 10);
return parseInt(read_chars(8), 16); // 32 bits
}
if (t == 0xff) {
alert("64bit value might lose precision in JS!");
console.warn(last);
return parseInt(read_chars(16), 16); // 64 bits.
}
last = last.substr(0, 2);
return t; // 8 bits
}
function encode() {
var t = decoded.value;
if (t == '') {
return;
}
decoded.value = '';
t = t.replace(/\/\/.*?\n/g, '')
t = t.replace(/\s/g, '')
encoded.value = t;
}
</script>
<p>Very simple tool to decode/encode Bitcoin transactions (note: doesn't decode scripts).</p>
<input type="text" id="encoded" placeholder="01000000...">
<textarea id="decoded"></textarea>
<div><button onclick="decode()">decode</button> <button onclick="encode()">encode</button> </div>
</body>
</html>