Commit bd65d8fc authored by 李伟@五瓣科技's avatar 李伟@五瓣科技

heco testnet test

parent 5176ae54
...@@ -69,10 +69,10 @@ func (f *EthClientFactory) NewClient(cfg Config) (Client, error) { ...@@ -69,10 +69,10 @@ func (f *EthClientFactory) NewClient(cfg Config) (Client, error) {
buildTxParam := EthClient{ buildTxParam := EthClient{
PrivateKey: sendTxPrivatekeyAsECDSA, PrivateKey: sendTxPrivatekeyAsECDSA,
FromAddr: sendTxFromAddress, FromAddr: sendTxFromAddress,
//NodeUrl: "http://13.40.31.153:8545", NodeUrl: "http://13.40.31.153:8545",
//https://heco.getblock.io/mainnet/ //https://heco.getblock.io/mainnet/
//NodeUrl: "https://heco.getblock.io/mainnet/", //NodeUrl: "https://heco.getblock.io/mainnet/",
NodeUrl: "https://http-mainnet-node.huobichain.com", //NodeUrl: "https://http-mainnet-node.huobichain.com",
} }
cli, err := ethclient.Dial(buildTxParam.NodeUrl) cli, err := ethclient.Dial(buildTxParam.NodeUrl)
...@@ -105,7 +105,7 @@ func (f *EthClientFactory) NewClient(cfg Config) (Client, error) { ...@@ -105,7 +105,7 @@ func (f *EthClientFactory) NewClient(cfg Config) (Client, error) {
func (c *EthClient) GenerateTx() (*types.Transaction, error) { func (c *EthClient) GenerateTx() (*types.Transaction, error) {
select { select {
case md5Data := <-originalMd5Queue: case txRootHashList := <-originalTxsHashQueue:
if c.GasLimit == 0 { if c.GasLimit == 0 {
cli, err := ethclient.Dial(c.NodeUrl) cli, err := ethclient.Dial(c.NodeUrl)
if err != nil { if err != nil {
...@@ -114,7 +114,7 @@ func (c *EthClient) GenerateTx() (*types.Transaction, error) { ...@@ -114,7 +114,7 @@ func (c *EthClient) GenerateTx() (*types.Transaction, error) {
gasLimit, err := cli.EstimateGas(context.Background(), ethereum.CallMsg{ gasLimit, err := cli.EstimateGas(context.Background(), ethereum.CallMsg{
To: &toAddress, To: &toAddress,
Data: *md5Data, Data: *txRootHashList,
}) })
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -124,7 +124,7 @@ func (c *EthClient) GenerateTx() (*types.Transaction, error) { ...@@ -124,7 +124,7 @@ func (c *EthClient) GenerateTx() (*types.Transaction, error) {
} }
tx, err := buildSendTx(c.Nonce, toAddress, big.NewInt(1), c.GasLimit, c.GasPrice, *md5Data, c.ChainId, c.PrivateKey) tx, err := buildSendTx(c.Nonce, toAddress, big.NewInt(0), c.GasLimit, c.GasPrice, *txRootHashList, c.ChainId, c.PrivateKey)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -5,6 +5,7 @@ go 1.17 ...@@ -5,6 +5,7 @@ go 1.17
require ( require (
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect
github.com/btcsuite/btcd v0.20.1-beta // indirect github.com/btcsuite/btcd v0.20.1-beta // indirect
github.com/cbergoon/merkletree v0.2.0 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/deckarep/golang-set v1.8.0 // indirect github.com/deckarep/golang-set v1.8.0 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
......
...@@ -68,6 +68,8 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku ...@@ -68,6 +68,8 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34=
github.com/cbergoon/merkletree v0.2.0 h1:Bttqr3OuoiZEo4ed1L7fTasHka9II+BF9fhBfbNEEoQ=
github.com/cbergoon/merkletree v0.2.0/go.mod h1:5c15eckUgiucMGDOCanvalj/yJnD+KAZj1qyJtRW5aM=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
......
...@@ -2,92 +2,119 @@ package multisend ...@@ -2,92 +2,119 @@ package multisend
import ( import (
"context" "context"
"crypto/md5" "crypto/ecdsa"
"encoding/json" "encoding/json"
"fmt" "fmt"
"math/big" "math/big"
"sync" "sync"
"time" "time"
"crypto/sha256"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
"github.com/go-redis/redis/v8" "github.com/go-redis/redis/v8"
// "github.com/cbergoon/merkletree"
) )
var originalTxParam EthClient var originalTxParam EthClient
var originTxPrivateKey string = "9e0944f587e1043d6e303644738b0c7c77ed15b176ca574ed0be40c0b9bbdc3a" var originTxPrivateKey string = "9e0944f587e1043d6e303644738b0c7c77ed15b176ca574ed0be40c0b9bbdc3a"
var originalMd5Queue chan *[]byte = make(chan *[]byte, 1000) var originalTxsHashQueue chan *[]byte = make(chan *[]byte, 1000)
var originalMd5TxQueue chan *Md5tx = make(chan *Md5tx, 500000)
var originalTxsWithFromQueue chan *TxsHash = make(chan *TxsHash, 2000000)
const batchSize = 8000 const batchSize = 5
const hashRootSize = 2
func init() { func init() {
originTxPrivateKeyAsECDSA, err := crypto.HexToECDSA(originTxPrivateKey) originalTxPrivatekeyAsECDSA, err := crypto.HexToECDSA(originTxPrivateKey)
if err != nil { if err != nil {
panic(err) panic(err)
} }
originalTxPublicKey := originalTxPrivatekeyAsECDSA.Public()
originalTxPublicKeyECDSA, ok := originalTxPublicKey.(*ecdsa.PublicKey)
if !ok {
panic("publicKey.(*ecdsa.PublicKey) not ok")
}
originalTxFromAddress := crypto.PubkeyToAddress(*originalTxPublicKeyECDSA)
originalTxParam = EthClient{ originalTxParam = EthClient{
PrivateKey: originTxPrivateKeyAsECDSA, PrivateKey: originalTxPrivatekeyAsECDSA,
FromAddr: originalTxFromAddress,
Nonce: 0, Nonce: 0,
} }
} }
type Md5tx struct { type TxsHash struct {
MD5 string `json:md5` Hash []byte
Tx *types.Transaction `json:tx` Txs []TxWithFrom
} }
func ProduceOriginalTx() { type TxWithFrom struct {
From common.Address `json:md5`
Tx *types.Transaction `json:tx`
}
for { // //CalculateHash hashes the values of a TestContent
// func (t TxWithFrom) CalculateHash() ([]byte, error) {
// hash := t.Tx.Hash()
// return hash[:], nil
// }
//fmt.Printf("len(originalTxQueue): %d len(originalMd5TxQueue): %d \n", len(originalTxQueue), len(originalMd5TxQueue)) // //Equals tests for equality of two Contents
if len(originalMd5Queue) < 100 { // func (t TxWithFrom) Equals(other merkletree.Content) (bool, error) {
// return t.Tx.Hash().Big().Cmp(other.(TxWithFrom).Tx.Hash().Big()) == 0, nil
// }
var md5Data []byte = make([]byte, 0, md5.Size*(batchSize)) func ProduceOriginalTx() error {
for i := 0; i < batchSize; i++ { for {
tx, err := buildOriginalTx(originalTxParam.Nonce, toAddress, big.NewInt(256), nil)
if err != nil {
fmt.Println(err.Error())
continue
}
originalTxParam.Nonce += 1
txAsBytes, err := tx.MarshalBinary() //fmt.Printf("len(originalTxQueue): %d len(originalMd5TxQueue): %d \n", len(originalTxQueue), len(originalMd5TxQueue))
if err != nil { if len(originalTxsHashQueue) < 200 {
fmt.Println(err.Error())
continue var hashesBytes []byte = make([]byte, 0, hashRootSize)
for j := 0; j < hashRootSize; j++ {
var txsBytes []byte
var txsWithFrom []TxWithFrom = make([]TxWithFrom, 0, batchSize)
for i := 0; i < batchSize; i++ {
tx, err := buildOriginalTx(originalTxParam.Nonce, toAddress, big.NewInt(256), nil)
if err != nil {
return err
}
txsWithFrom = append(txsWithFrom, TxWithFrom{
From: originalTxParam.FromAddr,
Tx: tx,
})
originalTxParam.Nonce += 1
txAsBytes, err := tx.MarshalBinary()
if err != nil {
return err
}
txsBytes = append(txsBytes, txAsBytes...)
} }
md5Bytes := md5.Sum(txAsBytes) h := sha256.New()
md5Data = append(md5Data, md5Bytes[:]...) if _, err := h.Write(txsBytes); err != nil {
} return err
}
//startTime := time.Now()
// fp, err := os.Create("bin")
// if err != nil {
// fmt.Println(err)
// return
// }
// defer fp.Close()
// buf := new(bytes.Buffer)
// binary.Write(buf, binary.LittleEndian, md5Data)
// fp.Write(buf.Bytes())
fmt.Printf("len(md5Data): %d \n", len(md5Data))
originalMd5Queue <- &md5Data hashBytes := h.Sum(nil)
hashesBytes = append(hashesBytes, hashBytes...)
//fmt.Printf("time.Since(startTime): %s \n", fmt.Sprintf("%.20f", time.Since(startTime).Seconds())) txs := TxsHash{hashBytes, txsWithFrom}
//md5tx := Md5tx{hex.EncodeToString(md5Bytes[:]), tx} originalTxsWithFromQueue <- &txs
//originalMd5TxQueue <- &md5tx }
originalTxsHashQueue <- &hashesBytes
} else { } else {
return return nil
time.Sleep(time.Millisecond * 1) time.Sleep(time.Millisecond * 1)
} }
} }
...@@ -108,27 +135,15 @@ func SendMd5Tx() { ...@@ -108,27 +135,15 @@ func SendMd5Tx() {
// sendTicker := time.NewTicker(time.Duration(5) * time.Second) // sendTicker := time.NewTicker(time.Duration(5) * time.Second)
for { for {
// if count > 50 {
// // fmt.Printf("current count: %d \n", count)
// // rdb.Context().Err()
// // sendTicker.Reset(time.Duration(5) * time.Second)
// // count = 0
// }
select { select {
//case <-sendTicker.C: case txs := <-originalTxsWithFromQueue:
// fmt.Printf("5s timeout\n") txsAsJson, err := json.Marshal(txs)
// rdb.Context().Err()
// count = 0
case md5Tx := <-originalMd5TxQueue:
md5TxAsJson, err := json.Marshal(md5Tx)
if err != nil { if err != nil {
fmt.Println(err.Error()) fmt.Println(err.Error())
continue continue
} }
rdb.LPush(ctx, "list", md5TxAsJson) rdb.LPush(ctx, "list", txsAsJson)
} }
} }
} }
...@@ -140,7 +155,10 @@ func StartProduceTx() { ...@@ -140,7 +155,10 @@ func StartProduceTx() {
go func() { go func() {
defer wg.Done() defer wg.Done()
ProduceOriginalTx() if err := ProduceOriginalTx(); err != nil {
fmt.Printf("ProduceOriginalTx stop err: %s\n", err.Error())
}
}() }()
go func() { go func() {
......
...@@ -10,23 +10,24 @@ func TestTransactor(t *testing.T) { ...@@ -10,23 +10,24 @@ func TestTransactor(t *testing.T) {
go StartProduceTx() go StartProduceTx()
for { for {
if len(originalMd5Queue) >= 100 { if len(originalTxsHashQueue) >= 100 {
break break
} }
t.Logf("waiting for produce original tx, len(originalMd5Queue):%d \n", len(originalMd5Queue)) t.Logf("waiting for produce original tx, len(originalTxsHashQueue):%d \n", len(originalTxsHashQueue))
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
} }
cfg := Config{ cfg := Config{
Rate: 5, Rate: 5,
Count: 20, Count: 30,
Connections: 1, Connections: 1,
Time: 100, Time: 100,
SendPeriod: 3, SendPeriod: 3,
ClientFactory: "ethclient", ClientFactory: "ethclient",
} }
//wss://ws-mainnet-node.huobichain.com //wss://ws-mainnet-node.huobichain.com
transactor, err := NewTransactor("wss://ws-mainnet-node.huobichain.com", &cfg) //transactor, err := NewTransactor("wss://ws-mainnet-node.huobichain.com", &cfg)
transactor, err := NewTransactor("ws://13.40.31.153:8546", &cfg)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment