path.gno
4.44 Kb · 158 lines
1package types
2
3import "bytes"
4
5var (
6 // Slot constants (Ethereum-style storage layout)
7 CLIENT_STATE [32]byte = [32]byte{
8 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12 }
13 CONSENSUS_STATE [32]byte = [32]byte{
14 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
15 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
16 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
17 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
18 }
19 CONNECTIONS [32]byte = [32]byte{
20 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
21 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
22 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
23 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
24 }
25 CHANNELS [32]byte = [32]byte{
26 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
27 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
29 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
30 }
31 PACKETS [32]byte = [32]byte{
32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
33 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
34 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
35 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
36 }
37 PACKET_ACKS [32]byte = [32]byte{
38 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
39 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
41 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
42 }
43 MEMBERSHIP_PROOF [32]byte = [32]byte{
44 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
45 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
48 }
49 NON_MEMBERSHIP_PROOF [32]byte = [32]byte{
50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
51 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
52 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
54 }
55 // Sentinel values stored for commitments
56 COMMITMENT_MAGIC H256 = [32]byte{
57 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
58 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
61 }
62 COMMITMENT_MAGIC_ACK H256 = [32]byte{
63 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
66 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
67 }
68 NON_MEMBERSHIP_COMMITMENT_VALUE H256 = [32]byte{
69 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
70 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
73 }
74)
75
76func ClientStatePath(clientId ClientId) H256 {
77 return Keccak(bytes.Join([][]byte{
78 CLIENT_STATE[:],
79 u32ToH256(uint32(clientId)),
80 }, nil))
81}
82
83func ConsensusStatePath(clientId ClientId, height Height) H256 {
84 return Keccak(bytes.Join([][]byte{
85 CONSENSUS_STATE[:],
86 u32ToH256(uint32(clientId)),
87 u64ToH256(height.RevisionHeight),
88 }, nil))
89}
90
91func ConnectionPath(connectionId ConnectionId) H256 {
92 return Keccak(bytes.Join([][]byte{
93 CONNECTIONS[:],
94 u32ToH256(uint32(connectionId)),
95 }, nil))
96}
97
98func ChannelPath(channelId ChannelId) H256 {
99 return Keccak(bytes.Join([][]byte{
100 CHANNELS[:],
101 u32ToH256(uint32(channelId)),
102 }, nil))
103}
104
105func mergeAck(ack H256) H256 {
106 ack[0] = COMMITMENT_MAGIC[0]
107 return ack
108}
109
110func PacketCommitmentPath(packet Packet) (H256, error) {
111 hash, err := CommitPacket(packet)
112 if err != nil {
113 return H256{}, err
114 }
115
116 return BatchPacketsPath(hash), nil
117}
118
119func PacketAcknowledgementPath(packet Packet) (H256, error) {
120 hash, err := CommitPacket(packet)
121 if err != nil {
122 return H256{}, err
123 }
124
125 return BatchReceiptsPath(hash), nil
126}
127
128func BatchPacketsPath(batchHash H256) H256 {
129 return Keccak(bytes.Join([][]byte{
130 PACKETS[:],
131 batchHash[:],
132 }, nil))
133}
134
135func BatchReceiptsPath(batchHash H256) H256 {
136 return Keccak(bytes.Join([][]byte{
137 PACKET_ACKS[:],
138 batchHash[:],
139 }, nil))
140}
141
142func MembershipProofPath(clientId ClientId, proofHeight uint64, path []byte) H256 {
143 return Keccak(bytes.Join([][]byte{
144 MEMBERSHIP_PROOF[:],
145 u32ToH256(uint32(clientId)),
146 u64ToH256(proofHeight),
147 path,
148 }, nil))
149}
150
151func NonMembershipProofPath(clientId ClientId, proofHeight uint64, path []byte) H256 {
152 return Keccak(bytes.Join([][]byte{
153 NON_MEMBERSHIP_PROOF[:],
154 u32ToH256(uint32(clientId)),
155 u64ToH256(proofHeight),
156 path,
157 }, nil))
158}