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  }