MCPcopy Create free account
hub / github.com/DNAProject/DNA / PersistBlock

Method PersistBlock

validator/db/store.go:177–231  ·  view source on GitHub ↗
(block *types.Block)

Source from the content-addressed store, hash-verified

175}
176
177func (self *Store) PersistBlock(block *types.Block) error {
178 height := block.Header.Height
179 if !((self.bestBlockHeader == nil && height == 0) || height == self.bestBlockHeader.Height+1) {
180 return errors.New("can't persist discontinuous block")
181 }
182
183 self.mutex.Lock()
184 defer self.mutex.Unlock()
185
186 self.db.NewBatch()
187 for _, txn := range block.Transactions {
188 err := self.saveTransaction(txn, height)
189 if err != nil {
190 return err
191 }
192 }
193
194 // is genesis block
195 if self.bestBlockHeader == nil {
196 key := GenGenesisBlockKey()
197 defer keyPool.Put(key)
198 value := valuePool.Get()
199 defer valuePool.Put(value)
200
201 sink := common.NewZeroCopySink(nil)
202 block.Serialization(sink)
203 value.Write(sink.Bytes())
204 self.db.BatchPut(key.Bytes(), value.Bytes())
205 }
206
207 key := GenBestBlockHeaderKey()
208 defer keyPool.Put(key)
209 value := valuePool.Get()
210 defer valuePool.Put(value)
211
212 header := block.Header
213
214 sink := common.NewZeroCopySink(nil)
215 header.Serialization(sink)
216 value.Write(sink.Bytes())
217 self.db.BatchPut(key.Bytes(), value.Bytes())
218
219 err := self.db.BatchCommit()
220
221 if err != nil {
222 return err
223 }
224
225 if self.bestBlockHeader == nil {
226 self.genesisBlock = block
227 }
228 self.bestBlockHeader = block.Header
229
230 return err
231}

Callers

nothing calls this directly

Calls 11

saveTransactionMethod · 0.95
BytesMethod · 0.95
GenGenesisBlockKeyFunction · 0.85
GenBestBlockHeaderKeyFunction · 0.85
WriteMethod · 0.80
NewBatchMethod · 0.65
PutMethod · 0.65
GetMethod · 0.65
SerializationMethod · 0.65
BatchPutMethod · 0.65
BatchCommitMethod · 0.65

Tested by

no test coverage detected