make SPVCon version agnostic
This commit is contained in:
parent
26d9ae7f2b
commit
229e34b326
@ -18,12 +18,9 @@ const (
|
|||||||
headerFileName = "headers.bin"
|
headerFileName = "headers.bin"
|
||||||
// Except hash-160s, those aren't backwards. But anything that's 32 bytes is.
|
// Except hash-160s, those aren't backwards. But anything that's 32 bytes is.
|
||||||
// because, cmon, 32? Gotta reverse that. But 20? 20 is OK.
|
// because, cmon, 32? Gotta reverse that. But 20? 20 is OK.
|
||||||
NETVERSION = wire.TestNet3
|
|
||||||
VERSION = 70011
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
// version hardcoded for now, probably ok...?
|
||||||
params = &chaincfg.TestNet3Params
|
VERSION = 70011
|
||||||
)
|
)
|
||||||
|
|
||||||
type SPVCon struct {
|
type SPVCon struct {
|
||||||
@ -33,7 +30,6 @@ type SPVCon struct {
|
|||||||
localVersion uint32 // version we report
|
localVersion uint32 // version we report
|
||||||
remoteVersion uint32 // version remote node
|
remoteVersion uint32 // version remote node
|
||||||
remoteHeight int32 // block height they're on
|
remoteHeight int32 // block height they're on
|
||||||
netType wire.BitcoinNet
|
|
||||||
|
|
||||||
// what's the point of the input queue? remove? leave for now...
|
// what's the point of the input queue? remove? leave for now...
|
||||||
inMsgQueue chan wire.Message // Messages coming in from remote node
|
inMsgQueue chan wire.Message // Messages coming in from remote node
|
||||||
@ -42,50 +38,59 @@ type SPVCon struct {
|
|||||||
WBytes uint64 // total bytes written
|
WBytes uint64 // total bytes written
|
||||||
RBytes uint64 // total bytes read
|
RBytes uint64 // total bytes read
|
||||||
|
|
||||||
TS *TxStore
|
TS *TxStore
|
||||||
|
param *chaincfg.Params
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SPVCon) Open(remoteNode string, hfn string, inTs *TxStore) error {
|
func OpenSPV(remoteNode string, hfn string,
|
||||||
|
inTs *TxStore, p *chaincfg.Params) (SPVCon, error) {
|
||||||
|
// create new SPVCon
|
||||||
|
var s SPVCon
|
||||||
|
|
||||||
|
// assign network parameters to SPVCon
|
||||||
|
s.param = p
|
||||||
|
|
||||||
// open header file
|
// open header file
|
||||||
err := s.openHeaderFile(headerFileName)
|
err := s.openHeaderFile(headerFileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return s, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// open TCP connection
|
// open TCP connection
|
||||||
s.con, err = net.Dial("tcp", remoteNode)
|
s.con, err = net.Dial("tcp", remoteNode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return s, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// assign version bits for local node
|
||||||
s.localVersion = VERSION
|
s.localVersion = VERSION
|
||||||
s.netType = NETVERSION
|
|
||||||
|
|
||||||
|
// transaction store for this SPV connection
|
||||||
s.TS = inTs
|
s.TS = inTs
|
||||||
|
|
||||||
myMsgVer, err := wire.NewMsgVersionFromConn(s.con, 0, 0)
|
myMsgVer, err := wire.NewMsgVersionFromConn(s.con, 0, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return s, err
|
||||||
}
|
}
|
||||||
err = myMsgVer.AddUserAgent("test", "zero")
|
err = myMsgVer.AddUserAgent("test", "zero")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return s, err
|
||||||
}
|
}
|
||||||
// must set this to enable SPV stuff
|
// must set this to enable SPV stuff
|
||||||
myMsgVer.AddService(wire.SFNodeBloom)
|
myMsgVer.AddService(wire.SFNodeBloom)
|
||||||
|
|
||||||
// this actually sends
|
// this actually sends
|
||||||
n, err := wire.WriteMessageN(s.con, myMsgVer, s.localVersion, s.netType)
|
n, err := wire.WriteMessageN(s.con, myMsgVer, s.localVersion, s.param.Net)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return s, err
|
||||||
}
|
}
|
||||||
s.WBytes += uint64(n)
|
s.WBytes += uint64(n)
|
||||||
log.Printf("wrote %d byte version message to %s\n",
|
log.Printf("wrote %d byte version message to %s\n",
|
||||||
n, s.con.RemoteAddr().String())
|
n, s.con.RemoteAddr().String())
|
||||||
|
|
||||||
n, m, b, err := wire.ReadMessageN(s.con, s.localVersion, s.netType)
|
n, m, b, err := wire.ReadMessageN(s.con, s.localVersion, s.param.Net)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return s, err
|
||||||
}
|
}
|
||||||
s.RBytes += uint64(n)
|
s.RBytes += uint64(n)
|
||||||
log.Printf("got %d byte response %x\n command: %s\n", n, b, m.Command())
|
log.Printf("got %d byte response %x\n command: %s\n", n, b, m.Command())
|
||||||
@ -99,9 +104,9 @@ func (s *SPVCon) Open(remoteNode string, hfn string, inTs *TxStore) error {
|
|||||||
mv.ProtocolVersion, mv.ProtocolVersion)
|
mv.ProtocolVersion, mv.ProtocolVersion)
|
||||||
|
|
||||||
mva := wire.NewMsgVerAck()
|
mva := wire.NewMsgVerAck()
|
||||||
n, err = wire.WriteMessageN(s.con, mva, s.localVersion, s.netType)
|
n, err = wire.WriteMessageN(s.con, mva, s.localVersion, s.param.Net)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return s, err
|
||||||
}
|
}
|
||||||
s.WBytes += uint64(n)
|
s.WBytes += uint64(n)
|
||||||
|
|
||||||
@ -110,7 +115,7 @@ func (s *SPVCon) Open(remoteNode string, hfn string, inTs *TxStore) error {
|
|||||||
s.outMsgQueue = make(chan wire.Message)
|
s.outMsgQueue = make(chan wire.Message)
|
||||||
go s.outgoingMessageHandler()
|
go s.outgoingMessageHandler()
|
||||||
|
|
||||||
return nil
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SPVCon) openHeaderFile(hfn string) error {
|
func (s *SPVCon) openHeaderFile(hfn string) error {
|
||||||
@ -118,7 +123,7 @@ func (s *SPVCon) openHeaderFile(hfn string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
var b bytes.Buffer
|
var b bytes.Buffer
|
||||||
err = params.GenesisBlock.Header.Serialize(&b)
|
err = s.param.GenesisBlock.Header.Serialize(&b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -252,7 +257,7 @@ func (s *SPVCon) IngestHeaders(m *wire.MsgHeaders) (bool, error) {
|
|||||||
// advance chain tip
|
// advance chain tip
|
||||||
tip++
|
tip++
|
||||||
// check last header
|
// check last header
|
||||||
worked := CheckHeader(s.headerFile, tip, params)
|
worked := CheckHeader(s.headerFile, tip, s.param)
|
||||||
if !worked {
|
if !worked {
|
||||||
if endPos < 8080 {
|
if endPos < 8080 {
|
||||||
// jeez I give up, back to genesis
|
// jeez I give up, back to genesis
|
||||||
@ -299,15 +304,3 @@ func (s *SPVCon) AskForMerkBlocks(current, last uint32) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendMBReq(cn net.Conn, blkhash wire.ShaHash) error {
|
|
||||||
iv1 := wire.NewInvVect(wire.InvTypeFilteredBlock, &blkhash)
|
|
||||||
gdataB := wire.NewMsgGetData()
|
|
||||||
_ = gdataB.AddInvVect(iv1)
|
|
||||||
n, err := wire.WriteMessageN(cn, gdataB, VERSION, NETVERSION)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
log.Printf("sent %d byte block request\n", n)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
@ -9,7 +9,7 @@ import (
|
|||||||
|
|
||||||
func (s *SPVCon) incomingMessageHandler() {
|
func (s *SPVCon) incomingMessageHandler() {
|
||||||
for {
|
for {
|
||||||
n, xm, _, err := wire.ReadMessageN(s.con, s.localVersion, s.netType)
|
n, xm, _, err := wire.ReadMessageN(s.con, s.localVersion, s.param.Net)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("ReadMessageN error. Disconnecting: %s\n", err.Error())
|
log.Printf("ReadMessageN error. Disconnecting: %s\n", err.Error())
|
||||||
return
|
return
|
||||||
@ -79,7 +79,7 @@ func (s *SPVCon) incomingMessageHandler() {
|
|||||||
func (s *SPVCon) outgoingMessageHandler() {
|
func (s *SPVCon) outgoingMessageHandler() {
|
||||||
for {
|
for {
|
||||||
msg := <-s.outMsgQueue
|
msg := <-s.outMsgQueue
|
||||||
n, err := wire.WriteMessageN(s.con, msg, s.localVersion, s.netType)
|
n, err := wire.WriteMessageN(s.con, msg, s.localVersion, s.param.Net)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Write message error: %s", err.Error())
|
log.Printf("Write message error: %s", err.Error())
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user