github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/core/tx_cacher.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  //版权所有2018 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 core
    26  
    27  import (
    28  	"runtime"
    29  
    30  	"github.com/ethereum/go-ethereum/core/types"
    31  )
    32  
    33  //sender cacher是一个并发事务发送方恢复器和缓存器。
    34  var senderCacher = newTxSenderCacher(runtime.NumCPU())
    35  
    36  //txsendercacherRequest是一个用于恢复事务发送方的请求,
    37  //特定的签名方案并将其缓存到事务本身中。
    38  //
    39  //inc字段定义每次恢复后要跳过的事务数,
    40  //它用于向不同的线程提供相同的基础输入数组,但
    41  //确保他们快速处理早期事务。
    42  type txSenderCacherRequest struct {
    43  	signer types.Signer
    44  	txs    []*types.Transaction
    45  	inc    int
    46  }
    47  
    48  //txsendercacher是用于并发ecrecover事务的辅助结构
    49  //来自后台线程上数字签名的发件人。
    50  type txSenderCacher struct {
    51  	threads int
    52  	tasks   chan *txSenderCacherRequest
    53  }
    54  
    55  //newtxsendercacher创建一个新的事务发送方后台缓存并启动
    56  //gomaxprocs在构建时允许的处理goroutine的数量。
    57  func newTxSenderCacher(threads int) *txSenderCacher {
    58  	cacher := &txSenderCacher{
    59  		tasks:   make(chan *txSenderCacherRequest, threads),
    60  		threads: threads,
    61  	}
    62  	for i := 0; i < threads; i++ {
    63  		go cacher.cache()
    64  	}
    65  	return cacher
    66  }
    67  
    68  //缓存是一个无限循环,缓存来自各种形式的事务发送者
    69  //数据结构。
    70  func (cacher *txSenderCacher) cache() {
    71  	for task := range cacher.tasks {
    72  		for i := 0; i < len(task.txs); i += task.inc {
    73  			types.Sender(task.signer, task.txs[i])
    74  		}
    75  	}
    76  }
    77  
    78  //recover从一批事务中恢复发送方并缓存它们
    79  //回到相同的数据结构中。没有进行验证,也没有
    80  //对无效签名的任何反应。这取决于以后调用代码。
    81  func (cacher *txSenderCacher) recover(signer types.Signer, txs []*types.Transaction) {
    82  //如果没有什么可恢复的,中止
    83  	if len(txs) == 0 {
    84  		return
    85  	}
    86  //确保我们拥有有意义的任务规模并计划恢复
    87  	tasks := cacher.threads
    88  	if len(txs) < tasks*4 {
    89  		tasks = (len(txs) + 3) / 4
    90  	}
    91  	for i := 0; i < tasks; i++ {
    92  		cacher.tasks <- &txSenderCacherRequest{
    93  			signer: signer,
    94  			txs:    txs[i:],
    95  			inc:    tasks,
    96  		}
    97  	}
    98  }
    99  
   100  //恢复器块从批处理中恢复发件人并缓存它们。
   101  //回到相同的数据结构中。没有进行验证,也没有
   102  //对无效签名的任何反应。这取决于以后调用代码。
   103  func (cacher *txSenderCacher) recoverFromBlocks(signer types.Signer, blocks []*types.Block) {
   104  	count := 0
   105  	for _, block := range blocks {
   106  		count += len(block.Transactions())
   107  	}
   108  	txs := make([]*types.Transaction, 0, count)
   109  	for _, block := range blocks {
   110  		txs = append(txs, block.Transactions()...)
   111  	}
   112  	cacher.recover(signer, txs)
   113  }