github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/consensus/clique/api.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:34</date> 10 //</624450074457411584> 11 12 13 package clique 14 15 import ( 16 "github.com/ethereum/go-ethereum/common" 17 "github.com/ethereum/go-ethereum/consensus" 18 "github.com/ethereum/go-ethereum/core/types" 19 "github.com/ethereum/go-ethereum/rpc" 20 ) 21 22 //API是面向用户的RPC API,允许控制签名者和投票 23 //权力证明计划的机制。 24 type API struct { 25 chain consensus.ChainReader 26 clique *Clique 27 } 28 29 //GetSnapshot检索给定块的状态快照。 30 func (api *API) GetSnapshot(number *rpc.BlockNumber) (*Snapshot, error) { 31 //检索请求的块号(如果未请求,则为当前块号) 32 var header *types.Header 33 if number == nil || *number == rpc.LatestBlockNumber { 34 header = api.chain.CurrentHeader() 35 } else { 36 header = api.chain.GetHeaderByNumber(uint64(number.Int64())) 37 } 38 //确保我们有一个实际有效的块并返回其快照 39 if header == nil { 40 return nil, errUnknownBlock 41 } 42 return api.clique.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil) 43 } 44 45 //GetSnapshotatHash检索给定块的状态快照。 46 func (api *API) GetSnapshotAtHash(hash common.Hash) (*Snapshot, error) { 47 header := api.chain.GetHeaderByHash(hash) 48 if header == nil { 49 return nil, errUnknownBlock 50 } 51 return api.clique.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil) 52 } 53 54 //GetSigners检索指定块上的授权签名者列表。 55 func (api *API) GetSigners(number *rpc.BlockNumber) ([]common.Address, error) { 56 //检索请求的块号(如果未请求,则为当前块号) 57 var header *types.Header 58 if number == nil || *number == rpc.LatestBlockNumber { 59 header = api.chain.CurrentHeader() 60 } else { 61 header = api.chain.GetHeaderByNumber(uint64(number.Int64())) 62 } 63 //确保我们有一个实际有效的块,并从其快照返回签名者 64 if header == nil { 65 return nil, errUnknownBlock 66 } 67 snap, err := api.clique.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil) 68 if err != nil { 69 return nil, err 70 } 71 return snap.signers(), nil 72 } 73 74 //getsignersathash检索指定块上的授权签名者列表。 75 func (api *API) GetSignersAtHash(hash common.Hash) ([]common.Address, error) { 76 header := api.chain.GetHeaderByHash(hash) 77 if header == nil { 78 return nil, errUnknownBlock 79 } 80 snap, err := api.clique.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil) 81 if err != nil { 82 return nil, err 83 } 84 return snap.signers(), nil 85 } 86 87 //建议返回节点尝试维护和投票的当前建议。 88 func (api *API) Proposals() map[common.Address]bool { 89 api.clique.lock.RLock() 90 defer api.clique.lock.RUnlock() 91 92 proposals := make(map[common.Address]bool) 93 for address, auth := range api.clique.proposals { 94 proposals[address] = auth 95 } 96 return proposals 97 } 98 99 //Propose注入一个新的授权建议,签名者将尝试 100 //推开。 101 func (api *API) Propose(address common.Address, auth bool) { 102 api.clique.lock.Lock() 103 defer api.clique.lock.Unlock() 104 105 api.clique.proposals[address] = auth 106 } 107 108 //Discard删除当前正在运行的建议,阻止签名者强制转换 109 //进一步投票(赞成或反对)。 110 func (api *API) Discard(address common.Address) { 111 api.clique.lock.Lock() 112 defer api.clique.lock.Unlock() 113 114 delete(api.clique.proposals, address) 115 } 116