github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/merkler/forking.go (about) 1 // Copyright 2020 Insolar Network Ltd. 2 // All rights reserved. 3 // This material is licensed under the Insolar License version 1.0, 4 // available at https://github.com/insolar/assured-ledger/blob/master/LICENSE.md. 5 6 package merkler 7 8 import ( 9 "github.com/insolar/vanilla/cryptkit" 10 "github.com/insolar/vanilla/throw" 11 ) 12 13 var _ cryptkit.ForkingDigester = &ForkingCalculator{} 14 15 func NewForkingCalculator(digester cryptkit.PairDigester, unbalancedStub cryptkit.Digest) ForkingCalculator { 16 if digester == nil { 17 panic("illegal value") 18 } 19 return ForkingCalculator{NewStackedCalculator(digester, unbalancedStub, nil)} 20 } 21 22 type ForkingCalculator struct { 23 StackedCalculator 24 } 25 26 func (p *ForkingCalculator) ForkSequence() cryptkit.ForkingDigester { 27 cp := p.ForkCalculator() 28 return &cp 29 } 30 31 func (p *ForkingCalculator) ForkCalculator() ForkingCalculator { 32 if p.finished || p.digester == nil || p.traceFn != nil { 33 panic(throw.IllegalState()) 34 } 35 cp := *p 36 cp.treeLevels = append(make([]treeLevel, 0, cap(p.treeLevels)), p.treeLevels...) 37 return cp 38 }