103 lines
1.9 KiB
Go
103 lines
1.9 KiB
Go
package proxy
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/tls"
|
|
"encoding/hex"
|
|
"encoding/json"
|
|
"fmt"
|
|
"math/rand"
|
|
"net/url"
|
|
"time"
|
|
|
|
"github.com/deroproject/derohe/block"
|
|
"github.com/deroproject/derohe/rpc"
|
|
"github.com/gorilla/websocket"
|
|
)
|
|
|
|
var connection *websocket.Conn
|
|
|
|
// proxy-client
|
|
func Start_client(v string, w string) {
|
|
var err error
|
|
var rand_nonce []byte
|
|
|
|
rand.Seed(time.Now().UnixMilli())
|
|
|
|
for {
|
|
|
|
u := url.URL{Scheme: "wss", Host: v, Path: "/ws/" + w}
|
|
|
|
dialer := websocket.DefaultDialer
|
|
dialer.TLSClientConfig = &tls.Config{
|
|
InsecureSkipVerify: true,
|
|
}
|
|
|
|
fmt.Println("Connect to node", v, "using wallet address", w)
|
|
connection, _, err = websocket.DefaultDialer.Dial(u.String(), nil)
|
|
if err != nil {
|
|
time.Sleep(5 * time.Second)
|
|
fmt.Println(err)
|
|
continue
|
|
}
|
|
|
|
for {
|
|
msg_type, recv_data, err := connection.ReadMessage()
|
|
if err != nil {
|
|
break
|
|
}
|
|
|
|
if msg_type != websocket.TextMessage {
|
|
continue
|
|
} else {
|
|
if rand_nonce = edit_blob(recv_data); rand_nonce != nil {
|
|
go SendTemplatesToNode(rand_nonce)
|
|
} else {
|
|
go SendTemplatesToNode(recv_data)
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
func SendToDaemon(buffer []byte) {
|
|
connection.SetWriteDeadline(time.Now().Add(100 * time.Millisecond))
|
|
connection.WriteMessage(websocket.TextMessage, buffer)
|
|
}
|
|
|
|
func edit_blob(input []byte) (output []byte) {
|
|
var err error
|
|
var params rpc.GetBlockTemplate_Result
|
|
var mbl block.MiniBlock
|
|
var raw_hex []byte
|
|
var out bytes.Buffer
|
|
|
|
if err = json.Unmarshal(input, ¶ms); err != nil {
|
|
return
|
|
}
|
|
|
|
if raw_hex, err = hex.DecodeString(params.Blockhashing_blob); err != nil {
|
|
return
|
|
}
|
|
|
|
if mbl.Deserialize(raw_hex); err != nil {
|
|
return
|
|
}
|
|
|
|
for i := range mbl.Nonce {
|
|
mbl.Nonce[i] = rand.Uint32()
|
|
}
|
|
|
|
params.Blockhashing_blob = fmt.Sprintf("%x", mbl.Serialize())
|
|
|
|
encoder := json.NewEncoder(&out)
|
|
if err = encoder.Encode(params); err != nil {
|
|
return
|
|
}
|
|
|
|
output = out.Bytes()
|
|
|
|
return
|
|
}
|