11package mock
22
33import (
4- "sync "
4+ "encoding/binary "
55
66 "github.com/celestiaorg/optimint/da"
77 "github.com/celestiaorg/optimint/log"
@@ -13,23 +13,16 @@ import (
1313// It does actually ensures DA - it stores data in-memory.
1414type MockDataAvailabilityLayerClient struct {
1515 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
2117}
2218
2319var _ da.DataAvailabilityLayerClient = & MockDataAvailabilityLayerClient {}
2420var _ da.BlockRetriever = & MockDataAvailabilityLayerClient {}
2521
2622// 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 {
3024 m .logger = logger
31- m .Blocks = make (map [[32 ]byte ]* types.Block )
32- m .BlockIndex = make (map [uint64 ][32 ]byte )
25+ m .dalcKV = dalcKV
3326 return nil
3427}
3528
@@ -49,13 +42,22 @@ func (m *MockDataAvailabilityLayerClient) Stop() error {
4942// This should create a transaction which (potentially)
5043// triggers a state transition in the DA layer.
5144func (m * MockDataAvailabilityLayerClient ) SubmitBlock (block * types.Block ) da.ResultSubmitBlock {
52- m .mtx .Lock ()
53- defer m .mtx .Unlock ()
5445 m .logger .Debug ("Submitting block to DA layer!" , "height" , block .Header .Height )
5546
5647 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+ }
5961
6062 return da.ResultSubmitBlock {
6163 DAResult : da.DAResult {
@@ -67,19 +69,36 @@ func (m *MockDataAvailabilityLayerClient) SubmitBlock(block *types.Block) da.Res
6769
6870// CheckBlockAvailability queries DA layer to check data availability of block corresponding to given header.
6971func (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 }
7478}
7579
7680// RetrieveBlock returns block at given height from data availability layer.
7781func (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 ()}}
8385 }
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
85104}
0 commit comments