-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzkzkrollup.py
125 lines (85 loc) · 2.96 KB
/
zkzkrollup.py
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
class FiniteField(int):
class EllipticCurvePoints:
x: int
y: int
class EncryptedBalance:
right: EllipticCurvePoints
left: EllipticCurvePoints
class Signature((FiniteField, FiniteField)):
class Proof((EllipticCurvePoints, EllipticCurvePoints, EllipticCurvePoints)):
class PublicParams:
generator: EllipticCurvePoints
class UserData:
encrypted_balance: EncryptedBalance
nonce: FiniteField
address: FiniteField
# generate hash leaf
def hash() -> FiniteField:
class TransactionProof:
sender_raw_transfer_amount: FiniteField # private
sender_private_key: FiniteField # private
sender_after_balance: FiniteField # private
randomness: FiniteField # private
sender_public_key: EllipticCurvePoints
recipient_public_key: EllipticCurvePoints
sender_encrypted_balance: EncryptedBalance
sender_transfer_amount: EncryptedBalance
recipient_transfer_amount: EllipticCurvePoints
class MerkleProof:
merkle_path: FiniteField
nonce: FiniteField
address: FiniteField
signature: Signature
class PublicInputs:
sender_public_key: EllipticCurvePoints
recipient_public_key: EllipticCurvePoints
sender_encrypted_balance: EncryptedBalance
sender_transfer_amount: EncryptedBalance
recipient_transfer_amount: EllipticCurvePoints
merkle_path: FiniteField
nonce: FiniteField
address: FiniteField
signature: Signature
class MerkleTree:
leaves: [UserData]
class Layer2State:
# merkle tree
merkle: MerkleTree
root: FiniteField
# return user data by address
def get(address: FiniteField) -> UserData:
# geberate proof for batch transaction
def prove(proofs: [Proof], public_inputs: [PublicInputs]) -> Proof:
# sync with main chain
def sync(proof: Proof, merkle_root: FiniteField):
class User:
private_key: FiniteField
public_key: EllipticCurvePoints
# encrypt raw number
def encrypt(num: int, randomness: int) -> EncryptedBalance:
# sign transaction
def sign(self, data: UserData) -> Signature:
# generate proof for confidential transfer
def prove(transfer: TransactionProof, merkle: MerkleProof) -> Proof:
class MainChainContract:
merkle_root: FiniteField
# verify proof
# TODO: needs user data and to generate hash?
def verify(proof: Proof, public_inputs: MerkleTree)
def confidential_transfer():
# sender inputs
transfer_amount = 1
sender_private_key = 2
sender_public_key = 3
recipient_public_key = 4
# addresses
sender_address = sender_public_key.hash()
recipient_address = recipient_public_key.hash()
# get user data
sender_data = Layer2State.get(sender_address)
recipient_data = Layer2State.get(recipient_address)
# encrypt
sender_transfer_amount = User(sender_private_key, sender_public_key).encrypt(transfer_amount)
recipient_transfer_amount = User(sender_public_key).encrypt(transfer_amount)
# transfer inputs
transfer_randomness = 5