github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/consensus/clique/api.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2017 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package clique
    26  
    27  import (
    28  	"github.com/ethereum/go-ethereum/common"
    29  	"github.com/ethereum/go-ethereum/consensus"
    30  	"github.com/ethereum/go-ethereum/core/types"
    31  	"github.com/ethereum/go-ethereum/rpc"
    32  )
    33  
    34  //API是面向用户的RPC API,允许控制签名者和投票
    35  //权力证明计划的机制。
    36  type API struct {
    37  	chain  consensus.ChainReader
    38  	clique *Clique
    39  }
    40  
    41  //GetSnapshot检索给定块的状态快照。
    42  func (api *API) GetSnapshot(number *rpc.BlockNumber) (*Snapshot, error) {
    43  //
    44  	var header *types.Header
    45  	if number == nil || *number == rpc.LatestBlockNumber {
    46  		header = api.chain.CurrentHeader()
    47  	} else {
    48  		header = api.chain.GetHeaderByNumber(uint64(number.Int64()))
    49  	}
    50  //确保我们有一个实际有效的块并返回其快照
    51  	if header == nil {
    52  		return nil, errUnknownBlock
    53  	}
    54  	return api.clique.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil)
    55  }
    56  
    57  //GetSnapshotatHash检索给定块的状态快照。
    58  func (api *API) GetSnapshotAtHash(hash common.Hash) (*Snapshot, error) {
    59  	header := api.chain.GetHeaderByHash(hash)
    60  	if header == nil {
    61  		return nil, errUnknownBlock
    62  	}
    63  	return api.clique.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil)
    64  }
    65  
    66  //GetSigners检索指定块上的授权签名者列表。
    67  func (api *API) GetSigners(number *rpc.BlockNumber) ([]common.Address, error) {
    68  //检索请求的块号(如果未请求,则为当前块号)
    69  	var header *types.Header
    70  	if number == nil || *number == rpc.LatestBlockNumber {
    71  		header = api.chain.CurrentHeader()
    72  	} else {
    73  		header = api.chain.GetHeaderByNumber(uint64(number.Int64()))
    74  	}
    75  //确保我们有一个实际有效的块,并从其快照返回签名者
    76  	if header == nil {
    77  		return nil, errUnknownBlock
    78  	}
    79  	snap, err := api.clique.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil)
    80  	if err != nil {
    81  		return nil, err
    82  	}
    83  	return snap.signers(), nil
    84  }
    85  
    86  //getsignersathash检索指定块上的授权签名者列表。
    87  func (api *API) GetSignersAtHash(hash common.Hash) ([]common.Address, error) {
    88  	header := api.chain.GetHeaderByHash(hash)
    89  	if header == nil {
    90  		return nil, errUnknownBlock
    91  	}
    92  	snap, err := api.clique.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil)
    93  	if err != nil {
    94  		return nil, err
    95  	}
    96  	return snap.signers(), nil
    97  }
    98  
    99  //建议返回节点尝试维护和投票的当前建议。
   100  func (api *API) Proposals() map[common.Address]bool {
   101  	api.clique.lock.RLock()
   102  	defer api.clique.lock.RUnlock()
   103  
   104  	proposals := make(map[common.Address]bool)
   105  	for address, auth := range api.clique.proposals {
   106  		proposals[address] = auth
   107  	}
   108  	return proposals
   109  }
   110  
   111  //Propose注入一个新的授权建议,签名者将尝试
   112  //推开。
   113  func (api *API) Propose(address common.Address, auth bool) {
   114  	api.clique.lock.Lock()
   115  	defer api.clique.lock.Unlock()
   116  
   117  	api.clique.proposals[address] = auth
   118  }
   119  
   120  //Discard删除当前正在运行的建议,阻止签名者强制转换
   121  //进一步投票(赞成或反对)。
   122  func (api *API) Discard(address common.Address) {
   123  	api.clique.lock.Lock()
   124  	defer api.clique.lock.Unlock()
   125  
   126  	delete(api.clique.proposals, address)
   127  }