-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsecp256k1.html
335 lines (281 loc) · 21.5 KB
/
secp256k1.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>secp256k1 - </title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<base href="">
<link rel="stylesheet" href="book.css">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css">
<link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:500" rel="stylesheet" type="text/css">
<link rel="shortcut icon" href="favicon.png">
<!-- Font Awesome -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
<link rel="stylesheet" href="highlight.css">
<link rel="stylesheet" href="tomorrow-night.css">
<link rel="stylesheet" href="ayu-highlight.css">
<!-- Custom theme -->
<!-- MathJax -->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<!-- Fetch Clipboard.js from CDN but have a local fallback -->
<script src="https://cdn.jsdelivr.net/clipboard.js/1.6.1/clipboard.min.js"></script>
<script>
if (typeof Clipboard == 'undefined') {
document.write(unescape("%3Cscript src='clipboard.min.js'%3E%3C/script%3E"));
}
</script>
<!-- Fetch JQuery from CDN but have a local fallback -->
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script>
if (typeof jQuery == 'undefined') {
document.write(unescape("%3Cscript src='jquery.js'%3E%3C/script%3E"));
}
</script>
<!-- Fetch store.js from local - TODO add CDN when 2.x.x is available on cdnjs -->
<script src="store.js"></script>
</head>
<body class="light">
<!-- Set the theme before any content is loaded, prevents flash -->
<script type="text/javascript">
var theme = store.get('mdbook-theme');
if (theme === null || theme === undefined) { theme = 'light'; }
$('body').removeClass().addClass(theme);
</script>
<!-- Hide / unhide sidebar before it is displayed -->
<script type="text/javascript">
var sidebar = store.get('mdbook-sidebar');
if (sidebar === "hidden") { $("html").addClass("sidebar-hidden") }
else if (sidebar === "visible") { $("html").addClass("sidebar-visible") }
</script>
<div id="sidebar" class="sidebar">
<ul class="chapter"><li><a href="./Intro.html"><strong>1.</strong> Intro</a></li><li><a href="./DagHistory.html"><strong>2.</strong> History</a></li><li><a href="./Wallet.html"><strong>3.</strong> Wallet</a></li><li><ul class="section"><li><a href="./Deterministic_wallet.html"><strong>3.1.</strong> Deterministic Wallet</a></li><li><a href="./Mnemonic.html"><strong>3.2.</strong> Mnemonic</a></li></ul></li><li><a href="./Testnet.html"><strong>4.</strong> Testnet & faucet</a></li><li><ul class="section"><li><a href="./BTC_testnet.html"><strong>4.1.</strong> Bitcoin Testnet</a></li><li><a href="./ETH_testnet.html"><strong>4.2.</strong> Ethereum Testnet</a></li><li><a href="./GByte_testnet.html"><strong>4.3.</strong> Byteball Testnet</a></li></ul></li><li><a href="./Address.html"><strong>5.</strong> Address</a></li><li><ul class="section"><li><a href="./btc_addr.html"><strong>5.1.</strong> Bitcoin Address</a></li></ul></li><li><a href="./Data_Structure.html"><strong>6.</strong> Data Structure</a></li><li><ul class="section"><li><a href="./Transcation.html"><strong>6.1.</strong> Transcation</a></li><li><a href="./btc_tx.html"><strong>6.2.</strong> Bitcoin Transaction</a></li><li><a href="./MerkleTree.html"><strong>6.3.</strong> MerkleTree</a></li><li><a href="./PatriciaTree.html"><strong>6.4.</strong> PatriciaTree</a></li><li><a href="./IAVL_Tree.html"><strong>6.5.</strong> Merkleized IAVL+ Tree</a></li><li><a href="./MerkleDAG.html"><strong>6.6.</strong> MerkleDAG</a></li></ul></li><li><a href="./Data_Storage.html"><strong>7.</strong> Data Storage</a></li><li><ul class="section"><li><a href="./btc_datastore.html"><strong>7.1.</strong> Bitcoin</a></li></ul></li><li><a href="./Consensus.html"><strong>8.</strong> Consensus algorithm</a></li><li><ul class="section"><li><a href="./Consensus_POS_Ouroboros.html"><strong>8.1.</strong> IOHK/Ouroboros</a></li><li><a href="./DFINITY.html"><strong>8.2.</strong> DFINITY</a></li><li><a href="./Stellar.html"><strong>8.3.</strong> Stellar(SCP)</a></li><li><a href="./Matrix.html"><strong>8.4.</strong> Matrix</a></li><li><a href="./Ripple.html"><strong>8.5.</strong> Ripple</a></li><li><a href="./Casper.html"><strong>8.6.</strong> Casper</a></li><li><a href="./PoA.html"><strong>8.7.</strong> POA(Parity)</a></li><li><a href="./Terndermint.html"><strong>8.8.</strong> Tendermint</a></li><li><a href="./Delegated_Consensus.html"><strong>8.9.</strong> dBFT(NEO/Antshare)/dPOS(BTS/Steem/EOS/Lisk)</a></li><li><a href="./Algorand.html"><strong>8.10.</strong> Algorand</a></li></ul></li><li><a href="./Scalability.html"><strong>9.</strong> Scalability</a></li><li><ul class="section"><li><a href="./Ouroboros_Praos.html"><strong>9.1.</strong> Ouroboros Praos</a></li><li><a href="./EOS.html"><strong>9.2.</strong> EOS</a></li><li><a href="./eth_parallelizability.html"><strong>9.3.</strong> Ethereum Parallelizability</a></li></ul></li><li><a href="./Validation.html"><strong>10.</strong> Validation</a></li><li><ul class="section"><li><a href="./Segwit.html"><strong>10.1.</strong> Segwit</a></li><li><a href="./Multisignature.html"><strong>10.2.</strong> Multisignature</a></li><li><a href="./Tx_Malleability.html"><strong>10.3.</strong> Transaction Malleability</a></li><li><a href="./Double_Spend.html"><strong>10.4.</strong> Double Spend</a></li><li><a href="./Peplay_Protect.html"><strong>10.5.</strong> Replay Protection</a></li><li><a href="./TrueBit.html"><strong>10.6.</strong> Truebit</a></li></ul></li><li><a href="./Money_Denomiation_Token.html"><strong>11.</strong> Money & Token</a></li><li><ul class="section"><li><a href="./TxFee_BTC.html"><strong>11.1.</strong> Bitcoin TxFee</a></li><li><a href="./RBF.html"><strong>11.2.</strong> Bitcoin Replace by fee</a></li><li><a href="./TxFee_ETH.html"><strong>11.3.</strong> Ethereum TxFee</a></li><li><a href="./ERC20.html"><strong>11.4.</strong> ERC20/ERC223/ERC721</a></li></ul></li><li><a href="./Crypto.html"><strong>12.</strong> Crypto Algorithm</a></li><li><ul class="section"><li><a href="./secp256k1.html" class="active"><strong>12.1.</strong> secp256k1</a></li><li><a href="./ZK-SNARKs.html"><strong>12.2.</strong> ZKP/ZK-SNARKs</a></li><li><a href="./CoinJoin.html"><strong>12.3.</strong> CoinJoin</a></li><li><a href="./RingSig.html"><strong>12.4.</strong> RingSig</a></li><li><a href="./Crypto_SM.html"><strong>12.5.</strong> SMx</a></li><li><a href="./PQC.html"><strong>12.6.</strong> Post-Quantum Cryptography</a></li></ul></li><li><a href="./Messaging.html"><strong>13.</strong> Messaging</a></li><li><a href="./Node_Discovery.html"><strong>14.</strong> Node discovery</a></li><li><ul class="section"><li><a href="./Gossip_Protocol.html"><strong>14.1.</strong> Gossip Protocol</a></li><li><a href="./DHT_Protocol.html"><strong>14.2.</strong> DHT Protocol</a></li></ul></li><li><a href="./Sync.html"><strong>15.</strong> Synchronization</a></li><li><ul class="section"><li><a href="./btc_sync.html"><strong>15.1.</strong> Bitcoin Header frist</a></li></ul></li><li><a href="./Interconnecting.html"><strong>16.</strong> Interconnect & Cross-chain</a></li><li><ul class="section"><li><a href="./ILP.html"><strong>16.1.</strong> Interledger Protocol (ILP)</a></li><li><a href="./DID.html"><strong>16.2.</strong> Decentralized Identifiers (DIDs)</a></li><li><a href="./0xProtocol.html"><strong>16.3.</strong> 0x Protocol</a></li><li><a href="./Polkadot.html"><strong>16.4.</strong> Polkadot</a></li><li><a href="./Cosmos.html"><strong>16.5.</strong> Cosmos</a></li><li><a href="./OmiseGO.html"><strong>16.6.</strong> OmiseGO</a></li></ul></li><li><a href="./Oracle.html"><strong>17.</strong> Oracle</a></li><li><ul class="section"><li><a href="./Gnosis.html"><strong>17.1.</strong> Gnosis</a></li><li><a href="./Augur.html"><strong>17.2.</strong> Augur</a></li><li><a href="./Amoveo.html"><strong>17.3.</strong> Amoveo</a></li><li><a href="./ZenProtocol.html"><strong>17.4.</strong> Zen Protocal</a></li></ul></li><li><a href="./SmartContract.html"><strong>18.</strong> SmartContract</a></li><li><ul class="section"><li><a href="./Asset_Contract.html"><strong>18.1.</strong> Asset</a></li><li><a href="./Loan_Contract.html"><strong>18.2.</strong> Loan</a></li></ul></li><li><a href="./VM.html"><strong>19.</strong> VM</a></li></ul>
</div>
<div id="page-wrapper" class="page-wrapper">
<div class="page" tabindex="-1">
<div id="menu-bar" class="menu-bar">
<div class="left-buttons">
<i id="sidebar-toggle" class="fa fa-bars" title="Toggle sidebar"></i>
<i id="theme-toggle" class="fa fa-paint-brush" title="Change theme"></i>
</div>
<h1 class="menu-title"></h1>
<div class="right-buttons">
<a href="print.html">
<i id="print-button" class="fa fa-print" title="Print this book"></i>
</a>
</div>
</div>
<div id="content" class="content">
<a class="header" href="./secp256k1.html#signatures" id="signatures"><h2>signatures</h2></a>
<p>https://bitcoin.stackexchange.com/a/12556</p>
<p>There are two different encodings used. <strong>DER</strong> and <strong>compact</strong></p>
<p>Everything in the Bitcoin protocol, including <strong>transaction signatures</strong> and <strong>alert signatures</strong>, uses DER encoding. This results in 71 bytes signatures (on average), as there are several header bytes, and the R and S valued are variable length.</p>
<p>For <strong>message signatures</strong>, a custom encoding is used which is more compact (and more recent) and supports public key recovery (given a message and a signature, find which public key would have created it). The code you're referring to in the question is for creating such signatures.</p>
<p>A correct DER-encoded signature has the following form:</p>
<ul>
<li>0x30: a header byte indicating a compound structure.
A 1-byte length descriptor for all what follows.</li>
<li>0x02: a header byte indicating an integer.
A 1-byte length descriptor for the R value
The R coordinate, as a big-endian integer.</li>
<li>0x02: a header byte indicating an integer.
A 1-byte length descriptor for the S value.
The S coordinate, as a big-endian integer.</li>
</ul>
<p>Where initial 0x00 bytes for R and S are not allowed, except when their first byte would otherwise be above 0x7F (in which case a single 0x00 in front is required). Also note that inside transaction signatures, an extra hashtype byte follows the actual signature data.</p>
<a class="header" href="./secp256k1.html#ri" id="ri"><h2>RI</h2></a>
<a class="header" href="./secp256k1.html#cc" id="cc"><h3>C/C++</h3></a>
<ul>
<li>https://github.com/bitcoin-core/secp256k1</li>
<li>by Peter Wuille</li>
<li>又名 libsecp256k1</li>
</ul>
<a class="header" href="./secp256k1.html#how-bitcoin-using-secp256k1" id="how-bitcoin-using-secp256k1"><h4>How bitcoin using secp256k1</h4></a>
<ul>
<li>https://github.com/bitcoin/bitcoin/blob/v0.15.1/src/wallet/rpcwallet.cpp#L163-L171
<ul>
<li>https://github.com/bitcoin/bitcoin/blob/v0.15.1/src/wallet/wallet.cpp#L3437 (pubkey from pool)
<ul>
<li>https://github.com/bitcoin/bitcoin/blob/v0.15.1/src/wallet/wallet.cpp#L125-L158 (how pubkey gen)
<ul>
<li>https://github.com/bitcoin/bitcoin/blob/v0.15.1/src/key.cpp#L152 (<strong>use secp256k1 to create pubkey</strong>)</li>
</ul>
</li>
</ul>
</li>
<li>https://github.com/bitcoin/bitcoin/blob/v0.15.1/src/pubkey.h#L144 (hash160)</li>
<li>https://github.com/bitcoin/bitcoin/blob/v0.15.1/src/base58.cpp#L197 ( <code>CBitcoinAddress(keyID).ToString()</code> -> base58check)</li>
</ul>
</li>
</ul>
<pre><code>$ src/bitcoin-cli getnewaddress
1Fop9P6BvWX5PdYcnABur6vXYbRVK2zjXp
$ src/bitcoin-cli dumpprivkey 1Fop9P6BvWX5PdYcnABur6vXYbRVK2zjXp
L3o684tsf6E4ZKwHXWwLd3pzjRksG7e9eeknqQP8XBytjTv8utje
$ echo L3o684tsf6E4ZKwHXWwLd3pzjRksG7e9eeknqQP8XBytjTv8utje|bx wif-to-public|bx ec-to-address
1Fop9P6BvWX5PdYcnABur6vXYbRVK2zjXp
</code></pre>
<a class="header" href="./secp256k1.html#how-ex-using-secp256k1" id="how-ex-using-secp256k1"><h4>How ex using secp256k1</h4></a>
<ul>
<li>https://github.com/libbitcoin/secp256k1 (is fork of bitcoin-core/secp256k1)
<ul>
<li>https://github.com/libbitcoin/libbitcoin/blob/v3.3.0/src/math/elliptic_curve.cpp</li>
<li>https://github.com/libbitcoin/libbitcoin/blob/v3.3.0/src/math/elliptic_curve.cpp#L85</li>
<li>https://github.com/libbitcoin/libbitcoin/blob/v3.3.0/src/wallet/ec_private.cpp#L201</li>
<li>https://github.com/libbitcoin/libbitcoin-explorer/blob/v3.3.0/src/commands/ec-new.cpp#L53</li>
</ul>
</li>
</ul>
<pre><code>$ echo 000000000000000000000000000000000000000000000000 |bx ec-new
f00ccc9dae46346963a579b2ffb3deb67a1cb0da158aef9c7b839ac05640d190
$ echo 000000000000000000000000000000000000000000000000 |bx ec-new |bx ec-to-public
03dc8335336fe1ea6936f2c13c5ac06b5ab585e5c72434f8bc74829349c9d14054
$ echo 000000000000000000000000000000000000000000000000 |bx ec-new |bx ec-to-public |bx ec-to-address
12KWaMA14HonuGKvEruKwe7rAFPbUzpwVM
$ echo 000000000000000000000000000000000000000000000000 |bx ec-new |bx ec-to-wif
L5GLUwKZA1VLu1u85n4ZqViWcDFrvh7nDzENesWwsk1Ed4wCHBXe
$ echo 000000000000000000000000000000000000000000000000 |bx ec-new |bx ec-to-wif |bx wif-to-ec
f00ccc9dae46346963a579b2ffb3deb67a1cb0da158aef9c7b839ac05640d190
$ echo 000000000000000000000000000000000000000000000000 |bx ec-new |bx ec-to-wif |bx wif-to-ec|bx ec-to-public
03dc8335336fe1ea6936f2c13c5ac06b5ab585e5c72434f8bc74829349c9d14054
$ echo 000000000000000000000000000000000000000000000000 |bx ec-new |bx ec-to-wif |bx wif-to-ec|bx ec-to-public|bx ec-to-address
12KWaMA14HonuGKvEruKwe7rAFPbUzpwVM
</code></pre>
<a class="header" href="./secp256k1.html#how-picocoin-works-with-secp256k1" id="how-picocoin-works-with-secp256k1"><h4>How picocoin works with secp256k1</h4></a>
<ul>
<li>picocoin is C light lib by Jeff Garzik ( Gavin Andresen的朋友,<a href="https://github.com/btc1/bitcoin">segwit2x</a>的主要开发)</li>
<li>https://github.com/jgarzik/picocoin/blob/v0.5/lib/key.c#L57-L73</li>
</ul>
<a class="header" href="./secp256k1.html#how-rust-bitcoin-works-with-libsecp256k1" id="how-rust-bitcoin-works-with-libsecp256k1"><h4>how rust-bitcoin works with libsecp256k1</h4></a>
<ul>
<li>https://github.com/apoelstra/rust-bitcoin/blob/master/src/util/address.rs#L55-L64</li>
<li>https://github.com/apoelstra/rust-secp256k1/blob/master/src/key.rs#L146-L160</li>
<li>https://github.com/apoelstra/rust-secp256k1 is a wrapper around libsecp256k1,</li>
</ul>
<a class="header" href="./secp256k1.html#how-bitcoinj-works-with-libsecp256k1" id="how-bitcoinj-works-with-libsecp256k1"><h4>how bitcoinj works with libsecp256k1</h4></a>
<ul>
<li>Using JNI (which provided by <code>libsecp256k1</code> officially)
<ul>
<li>https://github.com/bitcoin-core/secp256k1/tree/master/src/java/</li>
</ul>
</li>
<li>https://github.com/bitcoinj/bitcoinj/blob/v0.14.5/core/src/main/java/org/bitcoin/NativeSecp256k1.java</li>
<li>Note: <a href="https://github.com/bitcoinj">bitcoinj</a> looks maintained by <a href="https://github.com/greenaddress">greenaddress</a></li>
</ul>
<a class="header" href="./secp256k1.html#python" id="python"><h3>Python</h3></a>
<ul>
<li>https://github.com/vbuterin/pybitcointools By VB</li>
</ul>
<pre><code>>>> sha256('some big long brainwallet password')
'57c617d9b4e1f7af6ec97ca2ff57e94a28279a7eedd4d12a99fa11170e94f5a4'
>>> decoded_private_key = bitcoin.decode_privkey(sha256('some big long brainwallet password'), 'hex')
>>> public_key = bitcoin.fast_multiply(bitcoin.G, decoded_private_key)
>>> hex_encoded_public_key = bitcoin.encode_pubkey(public_key, 'hex')
>>> bitcoin.pubkey_to_address(public_key)
'1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6'
>>> (public_key_x, public_key_y) = public_key
>>> compressed_prefix = '02' if (public_key_y % 2) == 0 else '03'
>>> hex_compressed_public_key = compressed_prefix + bitcoin.encode(public_key_x, 16)
>>> bitcoin.pubkey_to_address(hex_compressed_public_key)
'1EHw4jytKnzMSX8szNrXJ9FQiahKYnuuji'
</code></pre>
<pre><code>$ echo 57c617d9b4e1f7af6ec97ca2ff57e94a28279a7eedd4d12a99fa11170e94f5a4|bx ec-to-public|bx ec-to-address
1EHw4jytKnzMSX8szNrXJ9FQiahKYnuuji
</code></pre>
<a class="header" href="./secp256k1.html#javascript" id="javascript"><h3>Javascript</h3></a>
<ul>
<li>https://github.com/cryptocoinjs/secp256k1-node</li>
</ul>
<a class="header" href="./secp256k1.html#go" id="go"><h3>Go</h3></a>
<ul>
<li>Package btcec implements elliptic curve cryptography needed for working with Bitcoin (secp256k1 only for now).</li>
<li>https://github.com/btcsuite/btcd/tree/master/btcec
<ul>
<li>https://github.com/btcsuite/btcd/blob/master/btcec/pubkey.go#L69-L122</li>
</ul>
</li>
</ul>
<a class="header" href="./secp256k1.html#how-ethereum-works-with-secp256k1" id="how-ethereum-works-with-secp256k1"><h4>How Ethereum works with secp256k1</h4></a>
<ul>
<li>Ethereum use the hybrid solution
<ul>
<li>公钥生成使用标准go api (<code>crypto/ecdsa</code>)
<ul>
<li>https://github.com/ethereum/go-ethereum/blob/v1.7.2/accounts/keystore/key.go#L161-L167</li>
</ul>
</li>
<li>签名使用cgo来调用libsecp256k1的c代码 (性能考虑)
<ul>
<li>https://github.com/ethereum/go-ethereum/blob/v1.7.2/crypto/secp256k1/secp256.go#L68-L97</li>
</ul>
</li>
<li>同时集成了btcec包, 当使用non-cgo模式时候,则使用这种方式(https://github.com/ethereum/go-ethereum/pull/3680 non-cgo fallback implementation of secp256k1
operations. The fallback implementation is not used when cgo is available. )
<ul>
<li>https://github.com/ethereum/go-ethereum/blob/v1.7.2/crypto/signature_nocgo.go#L48-L72</li>
</ul>
</li>
</ul>
</li>
</ul>
<a class="header" href="./secp256k1.html#c" id="c"><h3>C#</h3></a>
<ul>
<li>https://github.com/MetacoSA/NBitcoin/blob/v4.0.0.42/NBitcoin/Crypto/ECKey.cs#L98</li>
<li>https://github.com/MetacoSA/NBitcoin/blob/v4.0.0.42/NBitcoin/BouncyCastle/math/ec/custom/sec/SecP256K1Curve.cs</li>
</ul>
<a class="header" href="./secp256k1.html#object-c" id="object-c"><h3>Object-C</h3></a>
<ul>
<li>https://github.com/oleganza/CoreBitcoin/blob/0.6.8.1/openssl/include/openssl/obj_mac.h#L384-L386</li>
<li>https://github.com/oleganza/CoreBitcoin/blob/0.6.8.1/CoreBitcoin/BTCKey.h</li>
<li>https://github.com/oleganza/CoreBitcoin/blob/0.6.8.1/CoreBitcoin/BTCKey.m</li>
<li>https://github.com/oleganza/CoreBitcoin/blob/0.6.8.1/CoreBitcoin/BTCCurvePoint.h</li>
<li>https://github.com/oleganza/CoreBitcoin/blob/0.6.8.1/CoreBitcoin/BTCCurvePoint.m</li>
</ul>
<a class="header" href="./secp256k1.html#reference" id="reference"><h2>Reference</h2></a>
<ul>
<li>https://en.bitcoin.it/wiki/Secp256k1</li>
<li>https://bitcoin.stackexchange.com/a/21911</li>
<li>https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04.asciidoc</li>
<li>https://github.com/bitcoinbook/bitcoinbook/blob/develop/code/key-to-address-ecc-example.py</li>
</ul>
</div>
<!-- Mobile navigation buttons -->
<a rel="prev" href="./Crypto.html" class="mobile-nav-chapters previous" title="Previous chapter">
<i class="fa fa-angle-left"></i>
</a>
<a rel="next" href="./ZK-SNARKs.html" class="mobile-nav-chapters next" title="Next chapter">
<i class="fa fa-angle-right"></i>
</a>
</div>
<a href="./Crypto.html" class="nav-chapters previous" title="You can navigate through the chapters using the arrow keys">
<i class="fa fa-angle-left"></i>
</a>
<a href="./ZK-SNARKs.html" class="nav-chapters next" title="You can navigate through the chapters using the arrow keys">
<i class="fa fa-angle-right"></i>
</a>
</div>
<!-- Local fallback for Font Awesome -->
<script>
if ($(".fa").css("font-family") !== "FontAwesome") {
$('<link rel="stylesheet" type="text/css" href="_FontAwesome/css/font-awesome.css">').prependTo('head');
}
</script>
<!-- Livereload script (if served using the cli tool) -->
<script type="text/javascript">
var socket = new WebSocket("ws://localhost:3001");
socket.onmessage = function (event) {
if (event.data === "reload") {
socket.close();
location.reload(true); // force reload from server (not from cache)
}
};
window.onbeforeunload = function() {
socket.close();
}
</script>
<script src="highlight.js"></script>
<script src="book.js"></script>
<!-- Custom JS script -->
</body>
</html>