1
1
package mock
2
2
3
3
import (
4
- "sync "
4
+ "encoding/binary "
5
5
6
6
"github.com/celestiaorg/optimint/da"
7
7
"github.com/celestiaorg/optimint/log"
@@ -13,23 +13,16 @@ import (
13
13
// It does actually ensures DA - it stores data in-memory.
14
14
type MockDataAvailabilityLayerClient struct {
15
15
logger log.Logger
16
-
17
- Blocks map [[32 ]byte ]* types.Block
18
- BlockIndex map [uint64 ][32 ]byte
19
-
20
- mtx sync.Mutex
16
+ dalcKV store.KVStore
21
17
}
22
18
23
19
var _ da.DataAvailabilityLayerClient = & MockDataAvailabilityLayerClient {}
24
20
var _ da.BlockRetriever = & MockDataAvailabilityLayerClient {}
25
21
26
22
// Init is called once to allow DA client to read configuration and initialize resources.
27
- func (m * MockDataAvailabilityLayerClient ) Init (config []byte , kvStore store.KVStore , logger log.Logger ) error {
28
- m .mtx .Lock ()
29
- defer m .mtx .Unlock ()
23
+ func (m * MockDataAvailabilityLayerClient ) Init (config []byte , dalcKV store.KVStore , logger log.Logger ) error {
30
24
m .logger = logger
31
- m .Blocks = make (map [[32 ]byte ]* types.Block )
32
- m .BlockIndex = make (map [uint64 ][32 ]byte )
25
+ m .dalcKV = dalcKV
33
26
return nil
34
27
}
35
28
@@ -49,13 +42,22 @@ func (m *MockDataAvailabilityLayerClient) Stop() error {
49
42
// This should create a transaction which (potentially)
50
43
// triggers a state transition in the DA layer.
51
44
func (m * MockDataAvailabilityLayerClient ) SubmitBlock (block * types.Block ) da.ResultSubmitBlock {
52
- m .mtx .Lock ()
53
- defer m .mtx .Unlock ()
54
45
m .logger .Debug ("Submitting block to DA layer!" , "height" , block .Header .Height )
55
46
56
47
hash := block .Header .Hash ()
57
- m .Blocks [hash ] = block
58
- m .BlockIndex [block .Header .Height ] = hash
48
+ blob , err := block .MarshalBinary ()
49
+ if err != nil {
50
+ return da.ResultSubmitBlock {DAResult : da.DAResult {Code : da .StatusError , Message : err .Error ()}}
51
+ }
52
+
53
+ err = m .dalcKV .Set (getKey (block .Header .Height ), hash [:])
54
+ if err != nil {
55
+ return da.ResultSubmitBlock {DAResult : da.DAResult {Code : da .StatusError , Message : err .Error ()}}
56
+ }
57
+ err = m .dalcKV .Set (hash [:], blob )
58
+ if err != nil {
59
+ return da.ResultSubmitBlock {DAResult : da.DAResult {Code : da .StatusError , Message : err .Error ()}}
60
+ }
59
61
60
62
return da.ResultSubmitBlock {
61
63
DAResult : da.DAResult {
@@ -67,19 +69,36 @@ func (m *MockDataAvailabilityLayerClient) SubmitBlock(block *types.Block) da.Res
67
69
68
70
// CheckBlockAvailability queries DA layer to check data availability of block corresponding to given header.
69
71
func (m * MockDataAvailabilityLayerClient ) CheckBlockAvailability (header * types.Header ) da.ResultCheckBlock {
70
- m .mtx .Lock ()
71
- defer m .mtx .Unlock ()
72
- _ , ok := m .Blocks [header .Hash ()]
73
- return da.ResultCheckBlock {DAResult : da.DAResult {Code : da .StatusSuccess }, DataAvailable : ok }
72
+ hash := header .Hash ()
73
+ _ , err := m .dalcKV .Get (hash [:])
74
+ if err != nil {
75
+ return da.ResultCheckBlock {DAResult : da.DAResult {Code : da .StatusSuccess }, DataAvailable : false }
76
+ }
77
+ return da.ResultCheckBlock {DAResult : da.DAResult {Code : da .StatusSuccess }, DataAvailable : true }
74
78
}
75
79
76
80
// RetrieveBlock returns block at given height from data availability layer.
77
81
func (m * MockDataAvailabilityLayerClient ) RetrieveBlock (height uint64 ) da.ResultRetrieveBlock {
78
- m .mtx .Lock ()
79
- defer m .mtx .Unlock ()
80
- hash , ok := m .BlockIndex [height ]
81
- if ! ok {
82
- return da.ResultRetrieveBlock {DAResult : da.DAResult {Code : da .StatusError }}
82
+ hash , err := m .dalcKV .Get (getKey (height ))
83
+ if err != nil {
84
+ return da.ResultRetrieveBlock {DAResult : da.DAResult {Code : da .StatusError , Message : err .Error ()}}
83
85
}
84
- return da.ResultRetrieveBlock {DAResult : da.DAResult {Code : da .StatusSuccess }, Block : m .Blocks [hash ]}
86
+ blob , err := m .dalcKV .Get (hash )
87
+ if err != nil {
88
+ return da.ResultRetrieveBlock {DAResult : da.DAResult {Code : da .StatusError , Message : err .Error ()}}
89
+ }
90
+
91
+ block := & types.Block {}
92
+ err = block .UnmarshalBinary (blob )
93
+ if err != nil {
94
+ return da.ResultRetrieveBlock {DAResult : da.DAResult {Code : da .StatusError , Message : err .Error ()}}
95
+ }
96
+
97
+ return da.ResultRetrieveBlock {DAResult : da.DAResult {Code : da .StatusSuccess }, Block : block }
98
+ }
99
+
100
+ func getKey (height uint64 ) []byte {
101
+ b := make ([]byte , 8 )
102
+ binary .BigEndian .PutUint64 (b , height )
103
+ return b
85
104
}
0 commit comments