forked from yinchengtsinghua/golang-bitcoin-chinese
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrpcadapters.go
287 lines (254 loc) · 8.63 KB
/
rpcadapters.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
//此源码被清华学神尹成大魔王专业翻译分析并修改
//尹成QQ77025077
//尹成微信18510341407
//尹成所在QQ群721929980
//尹成邮箱 [email protected]
//尹成毕业于清华大学,微软区块链领域全球最有价值专家
//https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
//版权所有(c)2017 BTCSuite开发者
//此源代码的使用由ISC控制
//可以在许可文件中找到的许可证。
package main
import (
"sync/atomic"
"github.com/btcsuite/btcd/blockchain"
"github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/mempool"
"github.com/btcsuite/btcd/netsync"
"github.com/btcsuite/btcd/peer"
"github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcutil"
)
//rpc peer提供与rpc服务器一起使用的对等机,并实现
//rpcserverPeer interface.
type rpcPeer serverPeer
//确保rpcpeer实现rpcserverpeer接口。
var _ rpcserverPeer = (*rpcPeer)(nil)
//topeer返回基础对等实例。
//
//此函数对于并发访问是安全的,并且是rpcserverpeer的一部分
//接口实现。
func (p *rpcPeer) ToPeer() *peer.Peer {
if p == nil {
return nil
}
return (*serverPeer)(p).Peer
}
//ISTXRelayDisabled返回对等方是否已禁用事务
//继电器。
//
//此函数对于并发访问是安全的,并且是rpcserverpeer的一部分
//接口实现。
func (p *rpcPeer) IsTxRelayDisabled() bool {
return (*serverPeer)(p).disableRelayTx
}
//BanScore返回当前整数值,该整数值表示对等端的距离
//就是被禁止。
//
//此函数对于并发访问是安全的,并且是rpcserverpeer的一部分
//接口实现。
func (p *rpcPeer) BanScore() uint32 {
return (*serverPeer)(p).banScore.Int()
}
//feefilter返回请求的当前最低费率,其中
//交易应当公布。
//
//此函数对于并发访问是安全的,并且是rpcserverpeer的一部分
//接口实现。
func (p *rpcPeer) FeeFilter() int64 {
return atomic.LoadInt64(&(*serverPeer)(p).feeFilter)
}
//rpcconnmanager提供一个连接管理器,用于RPC服务器和
//实现rpcserverconmanager接口。
type rpcConnManager struct {
server *server
}
//确保rpcconnmanager实现rpcserverconmanager接口。
var _ rpcserverConnManager = &rpcConnManager{}
//Connect将提供的地址添加为新的出站对等机。永久的旗帜
//指示是否使对等机持久化,如果
//连接丢失。尝试连接到已存在的对等计算机将
//返回一个错误。
//
//This function is safe for concurrent access and is part of the
//rpcserverconmanager接口实现。
func (cm *rpcConnManager) Connect(addr string, permanent bool) error {
replyChan := make(chan error)
cm.server.query <- connectNodeMsg{
addr: addr,
permanent: permanent,
reply: replyChan,
}
return <-replyChan
}
//removeByID从以下列表中删除与提供的ID关联的对等方
//坚持不懈的同龄人。尝试删除不存在的ID将返回
//一个错误。
//
//此函数对于并发访问是安全的,并且是
//rpcserverconmanager接口实现。
func (cm *rpcConnManager) RemoveByID(id int32) error {
replyChan := make(chan error)
cm.server.query <- removeNodeMsg{
cmp: func(sp *serverPeer) bool { return sp.ID() == id },
reply: replyChan,
}
return <-replyChan
}
//removebyaddr从
//持久对等体列表。试图删除不存在的地址
//exist将返回一个错误。
//
//此函数对于并发访问是安全的,并且是
//rpcserverconmanager接口实现。
func (cm *rpcConnManager) RemoveByAddr(addr string) error {
replyChan := make(chan error)
cm.server.query <- removeNodeMsg{
cmp: func(sp *serverPeer) bool { return sp.Addr() == addr },
reply: replyChan,
}
return <-replyChan
}
//disconnectByID断开与提供的ID关联的对等机。此
//适用于入站和出站对等机。正在尝试删除
//不存在将返回错误。
//
//此函数对于并发访问是安全的,并且是
//rpcserverconmanager接口实现。
func (cm *rpcConnManager) DisconnectByID(id int32) error {
replyChan := make(chan error)
cm.server.query <- disconnectNodeMsg{
cmp: func(sp *serverPeer) bool { return sp.ID() == id },
reply: replyChan,
}
return <-replyChan
}
//DisconnectByAddr disconnects the peer associated with the provided address.
//这适用于入站和出站对等机。正在尝试删除
//不存在的地址将返回错误。
//
//此函数对于并发访问是安全的,并且是
//rpcserverconmanager接口实现。
func (cm *rpcConnManager) DisconnectByAddr(addr string) error {
replyChan := make(chan error)
cm.server.query <- disconnectNodeMsg{
cmp: func(sp *serverPeer) bool { return sp.Addr() == addr },
reply: replyChan,
}
return <-replyChan
}
//ConnectedCount返回当前连接的对等数。
//
//此函数对于并发访问是安全的,并且是
//rpcserverconmanager接口实现。
func (cm *rpcConnManager) ConnectedCount() int32 {
return cm.server.ConnectedCount()
}
//nettotals返回通过网络接收和发送的所有字节的总和
//对于所有的同龄人。
//
//此函数对于并发访问是安全的,并且是
//rpcserverconmanager接口实现。
func (cm *rpcConnManager) NetTotals() (uint64, uint64) {
return cm.server.NetTotals()
}
//ConnectedPeers返回一个由所有连接的对等方组成的数组。
//
//此函数对于并发访问是安全的,并且是
//rpcserverconmanager接口实现。
func (cm *rpcConnManager) ConnectedPeers() []rpcserverPeer {
replyChan := make(chan []*serverPeer)
cm.server.query <- getPeersMsg{reply: replyChan}
serverPeers := <-replyChan
//Convert to RPC server peers.
peers := make([]rpcserverPeer, 0, len(serverPeers))
for _, sp := range serverPeers {
peers = append(peers, (*rpcPeer)(sp))
}
return peers
}
//PersistentPeers返回一个由所有添加的Persistent组成的数组
//同龄人。
//
//此函数对于并发访问是安全的,并且是
//rpcserverconmanager接口实现。
func (cm *rpcConnManager) PersistentPeers() []rpcserverPeer {
replyChan := make(chan []*serverPeer)
cm.server.query <- getAddedNodesMsg{reply: replyChan}
serverPeers := <-replyChan
//转换为通用对等端。
peers := make([]rpcserverPeer, 0, len(serverPeers))
for _, sp := range serverPeers {
peers = append(peers, (*rpcPeer)(sp))
}
return peers
}
//BroadcastMessage sends the provided message to all currently connected peers.
//
//此函数对于并发访问是安全的,并且是
//rpcserverconmanager接口实现。
func (cm *rpcConnManager) BroadcastMessage(msg wire.Message) {
cm.server.BroadcastMessage(msg)
}
//addrebroadcastinventory将提供的清单添加到
//在库存出现在
//块。
//
//此函数对于并发访问是安全的,并且是
//rpcserverconmanager接口实现。
func (cm *rpcConnManager) AddRebroadcastInventory(iv *wire.InvVect, data interface{}) {
cm.server.AddRebroadcastInventory(iv, data)
}
//RelayTransactions为所有
//已将事务传递给所有连接的对等方。
func (cm *rpcConnManager) RelayTransactions(txns []*mempool.TxDesc) {
cm.server.relayTransactions(txns)
}
//rpcSyncMgr provides a block manager for use with the RPC server and
//实现RpcServerSyncManager接口。
type rpcSyncMgr struct {
server *server
syncMgr *netsync.SyncManager
}
//确保rpcsyncmgr实现rpcserversyncmanager接口。
var _ rpcserverSyncManager = (*rpcSyncMgr)(nil)
//iscurrent返回同步管理器是否相信链
//与网络其他部分相比的电流。
//
//此函数对于并发访问是安全的,并且是
//RpcServerSyncManager接口实现。
func (b *rpcSyncMgr) IsCurrent() bool {
return b.syncMgr.IsCurrent()
}
//SubmitBlock处理后将提供的块提交给网络
//局部地。
//
//此函数对于并发访问是安全的,并且是
//RpcServerSyncManager接口实现。
func (b *rpcSyncMgr) SubmitBlock(block *btcutil.Block, flags blockchain.BehaviorFlags) (bool, error) {
return b.syncMgr.ProcessBlock(block, flags)
}
//暂停暂停同步管理器,直到返回的通道关闭。
//
//此函数对于并发访问是安全的,并且是
//RpcServerSyncManager接口实现。
func (b *rpcSyncMgr) Pause() chan<- struct{} {
return b.syncMgr.Pause()
}
//syncpeerid返回当前用于同步的对等机
//从…
//
//此函数对于并发访问是安全的,并且是
//RpcServerSyncManager接口实现。
func (b *rpcSyncMgr) SyncPeerID() int32 {
return b.syncMgr.SyncPeerID()
}
//locateBlocks返回块在中第一个已知块之后的哈希值。
//提供的定位器,直到提供的停止哈希或当前提示
//已达到Wire.MaxBlockHeadersPermsg哈希的最大值。
//
//此函数对于并发访问是安全的,并且是
//RpcServerSyncManager接口实现。
func (b *rpcSyncMgr) LocateHeaders(locators []*chainhash.Hash, hashStop *chainhash.Hash) []wire.BlockHeader {
return b.server.chain.LocateHeaders(locators, hashStop)
}