Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Config.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,9 @@ type Config struct {
PoolSession uint `json:"pool_session"`
MinerSession uint `json:"miner_session"`
} `json:"message_queue_size"`

// 比特币的默认version mask(最开始发给矿机的version mask,连上矿池后值会被覆盖)
BitcoinDefaultVersionMask uint32 `json:"bitcoin_default_version_mask"`
} `json:"advanced"`

sessionFactory SessionFactory
Expand All @@ -114,6 +117,8 @@ func NewConfig() (config *Config) {
config.Advanced.MessageQueueSize.PoolSession = UpSessionChannelCache
config.Advanced.MessageQueueSize.MinerSession = DownSessionChannelCache

config.Advanced.BitcoinDefaultVersionMask = BitcoinDefaultVersionMask

return
}

Expand Down
3 changes: 3 additions & 0 deletions Const.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ const (
CapSubmitResponse = "subres" // Send response of mining.submit
)

// BitcoinDefaultVersionMask 比特币的默认version mask
const BitcoinDefaultVersionMask uint32 = 0x1fffe000

const DownSessionDisconnectWhenLostAsicboost = true
const UpSessionTLSInsecureSkipVerify = true

Expand Down
31 changes: 26 additions & 5 deletions DownSessionBTC.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,17 @@ func (down *DownSessionBTC) close() {
down.manager.sessionIDManager.FreeSessionID(down.sessionID)
}

func (down *DownSessionBTC) writeJSONRequest(jsonData *JSONRPCRequest) (int, error) {
bytes, err := jsonData.ToJSONBytesLine()
if err != nil {
return 0, err
}
if glog.V(12) {
glog.Info(down.id, "writeJSONRequest: ", string(bytes))
}
return down.clientConn.Write(bytes)
}

func (down *DownSessionBTC) writeJSONResponse(jsonData *JSONRPCResponse) (int, error) {
bytes, err := jsonData.ToJSONBytesLine()
if err != nil {
Expand Down Expand Up @@ -384,18 +395,14 @@ func (down *DownSessionBTC) parseConfigureRequest(request *JSONRPCLineBTC) (resu
// 更新为真实的版本掩码。
result = JSONRPCObj{
"version-rolling": true,
"version-rolling.mask": down.versionMaskStr()}
"version-rolling.mask": VersionMaskStr(down.manager.config.Advanced.BitcoinDefaultVersionMask & down.versionMask)}
return
}

// 未知配置内容,不响应
return
}

func (down *DownSessionBTC) versionMaskStr() string {
return fmt.Sprintf("%08x", down.versionMask)
}

func (down *DownSessionBTC) setUpSession(e EventSetUpSession) {
down.upSession = e.Session
down.upSession.SendEvent(EventAddDownSession{down})
Expand Down Expand Up @@ -483,6 +490,18 @@ func (down *DownSessionBTC) submitResponse(e EventSubmitResponse) {
}
}

func (down *DownSessionBTC) setVersionMask(e EventSetVersionMask) {
var request JSONRPCRequest
request.Method = "mining.set_version_mask"
request.SetParams(VersionMaskStr(e.VersionMask & down.versionMask))

_, err := down.writeJSONRequest(&request)
if err != nil {
glog.Error(down.id, "failed to send set_version_mask to miner: ", err.Error())
down.close()
}
}

func (down *DownSessionBTC) exit() {
down.stat = StatExit
down.close()
Expand All @@ -507,6 +526,8 @@ func (down *DownSessionBTC) handleEvent() {
down.sendBytes(e)
case EventSubmitResponse:
down.submitResponse(e)
case EventSetVersionMask:
down.setVersionMask(e)
case EventConnBroken:
down.close()
case EventExit:
Expand Down
4 changes: 4 additions & 0 deletions Event.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,3 +120,7 @@ type EventSetExtraNonce struct {
type EventStratumJobETH struct {
Job *StratumJobETH
}

type EventSetVersionMask struct {
VersionMask uint32
}
20 changes: 11 additions & 9 deletions UpSessionBTC.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,8 @@ type UpSessionBTC struct {
eventLoopRunning bool
eventChannel chan interface{}

lastJob *StratumJobBTC
rpcSetVersionMask []byte
rpcSetDifficulty []byte
lastJob *StratumJobBTC
rpcSetDifficulty []byte

submitIDs map[uint16]SubmitID
submitIndex uint16
Expand Down Expand Up @@ -349,8 +348,6 @@ func (up *UpSessionBTC) Init() {
}

func (up *UpSessionBTC) handleSetVersionMask(rpcData *JSONRPCLineBTC, jsonBytes []byte) {
up.rpcSetVersionMask = jsonBytes

if len(rpcData.Params) > 0 {
if up.serverCapVersionRolling {
versionMaskHex, ok := rpcData.Params[0].(string)
Expand All @@ -368,14 +365,19 @@ func (up *UpSessionBTC) handleSetVersionMask(rpcData *JSONRPCLineBTC, jsonBytes
if glog.V(1) {
glog.Info(up.id, "AsicBoost via BTCAgent enabled, allowed version mask: ", versionMaskHex)
}

if up.config.Advanced.BitcoinDefaultVersionMask != up.versionMask {
glog.Info(up.id, "Update default version mask: ", VersionMaskStr(up.config.Advanced.BitcoinDefaultVersionMask), " -> ", versionMaskHex)
up.config.Advanced.BitcoinDefaultVersionMask = up.versionMask
}

} else {
// server doesn't support version rolling via BTCAgent
up.versionMask = 0
rpcData.Params[0] = "00000000"
}
}

e := EventSendBytes{up.rpcSetVersionMask}
e := EventSetVersionMask{up.versionMask}
for _, down := range up.downSessions {
if down.versionMask != 0 {
go down.SendEvent(e)
Expand Down Expand Up @@ -599,8 +601,8 @@ func (up *UpSessionBTC) addDownSession(e EventAddDownSession) {
up.downSessions[down.sessionID] = down
up.registerWorker(down)

if up.rpcSetVersionMask != nil && down.versionMask != 0 {
down.SendEvent(EventSendBytes{up.rpcSetVersionMask})
if down.versionMask != 0 {
down.SendEvent(EventSetVersionMask{up.versionMask})
}

if up.rpcSetDifficulty != nil {
Expand Down
6 changes: 6 additions & 0 deletions Utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"encoding/binary"
"encoding/hex"
"fmt"
"io"
"net"
"regexp"
Expand Down Expand Up @@ -234,3 +235,8 @@ func BinReverse(bin []byte) {
j--
}
}

// VersionMaskStr 获取version mask的字符串表示
func VersionMaskStr(mask uint32) string {
return fmt.Sprintf("%08x", mask)
}
3 changes: 2 additions & 1 deletion agent_conf.default.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
"pool_session_manager": 64,
"pool_session": 512,
"miner_session": 64
}
},
"bitcoin_default_version_mask": 536862720
}
}