Skip to content

Commit 96cfcd6

Browse files
author
Vizeet Srivastava
committed
Added Jupyter notebook for elliptic curve
1 parent 680727e commit 96cfcd6

8 files changed

+525
-19
lines changed

BitcoinEllipticCurveCryptography.ipynb

+492
Large diffs are not rendered by default.

ChainstateDBParser.ipynb

Whitespace-only changes.

bitcoin_secp256k1.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,15 @@ def privkey2pubkey(self, k: int):
3333
if __name__ == '__main__':
3434

3535
bitcoin_sec256k1 = BitcoinSec256k1()
36-
pubkey = bitcoin_sec256k1.privkey2pubkey(0x18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725)
37-
print('pubkey = (%x, %x)' % (pubkey[0],pubkey[1]))
36+
while True:
37+
privkey_s = input('Enter Private Key: ')
38+
privkey_i = int(privkey_s, 16)
39+
# pubkey = bitcoin_sec256k1.privkey2pubkey(0x18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725)
40+
pubkey = bitcoin_sec256k1.privkey2pubkey(privkey_i)
41+
pubkey_c = '04%064x%064x' % (pubkey[0],pubkey[1])
42+
print('pubkey = %s' % pubkey_c)
43+
pubkey_a = input('verify = ')
44+
if pubkey_a == pubkey_c:
45+
print('Right')
46+
else:
47+
print('Wrong')

elliptic_curve_math.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def pointAddingOp(self, p, q):
4848
#rx = c2 - 2px
4949
#ry = c (px - rx) - py
5050
def pointDoublingOp(self, p):
51-
c = ((3 * (p[0] * p[0]) + self.a) * self.modinv(2 * p[1], self.P)) % self.P
51+
c = ((3 * (p[0] * p[0]) + self.a) * self.modinv(2 * p[1] % self.P, self.P)) % self.P
5252
rx = (c * c - 2 * p[0]) % self.P
5353
ry = (c * (p[0] - rx) - p[1]) % self.P
5454
r = (rx, ry)
@@ -86,5 +86,6 @@ def scalarMultiplicationOp(self, p, s: int):
8686

8787
if __name__ == '__main__':
8888
elliptic = EllipticCurveMath((0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141, 0, 7)
89-
m = elliptic.scalarMultiplicationOp((0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8), 0x18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725)
89+
#m = elliptic.scalarMultiplicationOp((0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8), 0x18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725)
90+
m = elliptic.scalarMultiplicationOp((0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8), 0x3063CACEAF954F63145E4A23A5A467D9C2CC044421E4412C50CBE04CF9D3700E)
9091
print('04 %x %x' % (m[0], m[1]))

hd_wallet.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,14 @@ def generatePrivkeyPubkeyPair(keypath: str, seed: bytes, compressed: bool):
119119

120120
# for hardened
121121
child_privkey, child_chaincode = generateChildAtIndex(master_privkey, master_chaincode, 1<<31)
122-
print('child private key = %x, child chaincode = %s' % (child_privkey, bytes.decode(binascii.hexlify(child_chaincode))))
122+
print('m/0\': child private key = %x, child chaincode = %s' % (child_privkey, bytes.decode(binascii.hexlify(child_chaincode))))
123123

124124
# for normal
125125
child_privkey, child_chaincode = generateChildAtIndex(master_privkey, master_chaincode, 0)
126-
print('child private key = %x, child chaincode = %s' % (child_privkey, bytes.decode(binascii.hexlify(child_chaincode))))
126+
print('m/0: child private key = %x, child chaincode = %s' % (child_privkey, bytes.decode(binascii.hexlify(child_chaincode))))
127127

128128
privkey, chaincode = generatePrivkeyPubkeyPair('m / 5\'/ 6', seed, True)
129129
print('keys at m / 5\'/6: private key = %x, public key = %s' % (privkey, bytes.decode(binascii.hexlify(chaincode))))
130+
131+
privkey, chaincode = generatePrivkeyPubkeyPair('m / 1', seed, True)
132+
print('keys at m / 1: private key = %x, public key = %s' % (privkey, bytes.decode(binascii.hexlify(chaincode))))

img/add-points.png

20.4 KB
Loading

leveldb_parser.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ def b128_varint_encode(n: int):
6565
"""
6666
l = 0
6767
tmp = []
68-
data = ""
69-
ret = bytes(0)
68+
#data = ""
69+
#ret = bytes(0)
7070
while True:
7171
tmp.insert(0, n & 0x7F)
7272
if l != 0:
@@ -100,35 +100,31 @@ def amount_compress(n: int):
100100
return 0
101101
e = 0
102102
while ((n % 10) == 0) and e < 9:
103-
n = int(n / 10)
103+
n = n // 10
104104
e += 1
105105
if e < 9:
106106
d = n % 10
107107
assert(d >= 1 and d <= 9)
108-
n = int(n / 10)
108+
n = n // 10
109109
return 1 + (n*9 + d - 1)*10 + e
110110
else:
111111
return 1 + (n - 1)*10 + 9
112112

113113
def amount_decompress(x: int):
114114
print('1 x = %d' % x)
115-
# x = 0 OR x = 1+10*(9*n + d - 1) + e OR x = 1+10*(n - 1) + 9
116115
if x == 0:
117116
return 0
118117
x -=1
119-
# x = 10*(9*n + d - 1) + e
120118
e = x % 10
121119
print('e = %d' % e)
122-
x = int(x / 10)
120+
x = x // 10
123121
print('2 x = %d' % x)
124122
n = 0
125123
if e < 9:
126-
# x = 9*n + d - 1
127124
d = (x % 9) + 1
128125
print('1 d = %d' % d)
129-
x = int(x / 9)
126+
x = x // 9
130127
print('3 x = %f' % x)
131-
# x = n
132128
n = x*10 + d
133129
print('1 n = %d' % n)
134130
else:
@@ -363,3 +359,7 @@ def getRecentBlockHash():
363359
print('....txn_id = %s' % bytes.decode(binascii.hexlify(binascii.unhexlify('0060c16adcf98e70c1d9e8c971ad9f27d3363394993156691ec9f3a46c4c4a4d')[::-1])))
364360
jsonobj = getChainstateData(binascii.unhexlify('0060c16adcf98e70c1d9e8c971ad9f27d3363394993156691ec9f3a46c4c4a4d'), 1822)
365361
print(jsonobj)
362+
amount = 53263
363+
compressed_amount = amount_compress(amount)
364+
uncompressed_amount = amount_decompress(compressed_amount)
365+
print('amount = %d, compressed = %d, uncompressed = %d' % (amount, compressed_amount, uncompressed_amount))

script_parser.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#txn_hash = '7f48d5fd4c993305d5fe027c5ddc23b95a0757657f91de75cf1cd2dc732f284c' #P2SH-P2WPKH
2626
#txn_hash = '714e0aac85acd5748094c1a9b792ee847cbe2e9544e5d4f73bdbd0437550cda4'
2727
#block_hash = '0000000000000000009a8aa7b36b0e37a28bf98956097b7b844e172692e604e1' # Pre-Segwit
28-
block_hash = '0000000000000000000e377cd4083945678ad30c533a8729198bf3b12a8e9315' # Segwit block
28+
#block_hash = '0000000000000000000e377cd4083945678ad30c533a8729198bf3b12a8e9315' # Segwit block
2929

3030
g_multisig_counter = 0
3131

@@ -1137,5 +1137,5 @@ def bareP2WSH():
11371137
# scriptCode='210321a1b4858bb05350c68190a2b4517aeac6b4ec72e9a9a059e543083c63915423'
11381138
# print('scriptCode = %s' % scriptCode)
11391139

1140-
block_hash_bigendian_b = binascii.unhexlify(block_hash)[::-1]
1141-
validate_all_transactions_of_block(block_hash_bigendian_b)
1140+
# block_hash_bigendian_b = binascii.unhexlify(block_hash)[::-1]
1141+
# validate_all_transactions_of_block(block_hash_bigendian_b)

0 commit comments

Comments
 (0)