github.com/evdatsion/aphelion-dpos-bft@v0.32.1/lite/proxy/verifier.go (about)

     1  package proxy
     2  
     3  import (
     4  	cmn "github.com/evdatsion/aphelion-dpos-bft/libs/common"
     5  	dbm "github.com/evdatsion/aphelion-dpos-bft/libs/db"
     6  	log "github.com/evdatsion/aphelion-dpos-bft/libs/log"
     7  	"github.com/evdatsion/aphelion-dpos-bft/lite"
     8  	lclient "github.com/evdatsion/aphelion-dpos-bft/lite/client"
     9  )
    10  
    11  func NewVerifier(chainID, rootDir string, client lclient.SignStatusClient, logger log.Logger, cacheSize int) (*lite.DynamicVerifier, error) {
    12  
    13  	logger = logger.With("module", "lite/proxy")
    14  	logger.Info("lite/proxy/NewVerifier()...", "chainID", chainID, "rootDir", rootDir, "client", client)
    15  
    16  	memProvider := lite.NewDBProvider("trusted.mem", dbm.NewMemDB()).SetLimit(cacheSize)
    17  	lvlProvider := lite.NewDBProvider("trusted.lvl", dbm.NewDB("trust-base", dbm.GoLevelDBBackend, rootDir))
    18  	trust := lite.NewMultiProvider(
    19  		memProvider,
    20  		lvlProvider,
    21  	)
    22  	source := lclient.NewProvider(chainID, client)
    23  	cert := lite.NewDynamicVerifier(chainID, trust, source)
    24  	cert.SetLogger(logger) // Sets logger recursively.
    25  
    26  	// TODO: Make this more secure, e.g. make it interactive in the console?
    27  	_, err := trust.LatestFullCommit(chainID, 1, 1<<63-1)
    28  	if err != nil {
    29  		logger.Info("lite/proxy/NewVerifier found no trusted full commit, initializing from source from height 1...")
    30  		fc, err := source.LatestFullCommit(chainID, 1, 1)
    31  		if err != nil {
    32  			return nil, cmn.ErrorWrap(err, "fetching source full commit @ height 1")
    33  		}
    34  		err = trust.SaveFullCommit(fc)
    35  		if err != nil {
    36  			return nil, cmn.ErrorWrap(err, "saving full commit to trusted")
    37  		}
    38  	}
    39  
    40  	return cert, nil
    41  }