根据下面的内容安装Tendermint:
https://github.com/tendermint/tendermint/blob/master/docs/introduction/install.md
Tendermint
什么是Tendermint?
Tendermint是具有拜占庭容错机制的可定制协议区块链。
Tendermint暴露了自身的abci(Application BlockChain Interface)接口,允许用户定制属于他们自己的协议。
两个Tendermint终端互相承认,如果他们的协议是一致的.这将使得开发者很容易完成一条可以在多台服务器上部署的符合实验需求的区块链.
Minimum Functional
获取一个能够启动的区块链,只需要实现一个接口abci, 自定义一个application,让它内联types.BaseApplication
,任意重载自己想重载的函数,就能启动。
State
先定义存储到database中的状态结构
type NSBState struct {
db dbm.DB
ActionRoot trie.MerkleHash `json:"action_root"`
MerkleProofRoot trie.MerkleHash `json:"merkle_proof_root"`
ActiveISCRoot trie.MerkleHash `json:"active_isc_root"`
Height int64 `json:"height"`
AppHash []byte `json:"app_hash"`
}
func loadState(db dbm.DB) NSBState {
stateBytes := db.Get(stateKey)
var state NSBState
if len(stateBytes) != 0 {
err := json.Unmarshal(stateBytes, &state)
if err != nil {
panic(err)
}
}
state.db = db
return state
}
func saveState(state NSBState) {
stateBytes, err := json.Marshal(state)
if err != nil {
panic(err)
}
state.db.Set(stateKey, stateBytes)
}
然后自定义application.
type NSBApplication struct {
types.BaseApplication
state NSBState
ValUpdates []types.ValidatorUpdate
logger log.Logger
}
func NewNSBApplication(dbDir string) (*NSBApplication, error) {
name := "nsb"
db, err := dbm.NewGoLevelDB(name, dbDir)
if err != nil {
return nil, err
}
state := loadState(db)
return &NSBApplication{
state: state,
logger: log.NewNopLogger(),
}, nil
}
实现abci接口,这里直接复制kvstore的内容,以后有需要可以再改。
func (nsb *NSBApplication) Info(req types