Commit f1d72950 authored by duanjinfei's avatar duanjinfei

init grpc project

parent 582d83bf
Pipeline #569 canceled with stages
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/ChainGrpcTest.iml" filepath="$PROJECT_DIR$/.idea/ChainGrpcTest.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="$PROJECT_DIR$/MetaTypes" vcs="Git" />
</component>
</project>
\ No newline at end of file
File added
{
"receiveAddr": "0x0Fb196385c8826e3806ebA2cA2cb78B26E08fEEe",
"count": 100,
"type": 1,
"rpcNode": "35.78.87.116:38002",
"amount": 10000000,
"chainId": 100,
"initAccountPrv": "FD5CC6F5E7E2805E920AC5DC83D5AF1106F9C92F0C04F9D5E1FD4261B4B4464A",
"batchTransferContract": "0x9F7777785060CAF169663D46380B756573bEEd2b",
"sleepTime": 0,
"storageAccFileName":"Address"
}
package eg
import (
"ChainGrpcTest/log"
"ChainGrpcTest/types"
"context"
"encoding/hex"
"flag"
basetype "github.com/CaduceusMetaverseProtocol/MetaProtocol/gen/proto/go/base/v1"
metanebula "github.com/CaduceusMetaverseProtocol/MetaProtocol/gen/proto/go/nebula/v1"
metatypes "github.com/CaduceusMetaverseProtocol/MetaTypes/types"
gogotypes "github.com/gogo/protobuf/types"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"math/big"
"strings"
)
func dumpHash(h *metatypes.Hash) string {
if h != nil {
return h.String()
} else {
return "nil"
}
}
func dumpBigInt(n *metatypes.BigInt) string {
if n == nil {
return "nil"
}
return types.ToBigInt(n).String()
}
func dumpBloom(b *basetype.Bloom) string {
if b == nil {
return "nil"
}
return hex.EncodeToString(b.Data)
}
func dumpLogs(txlogs []*basetype.MetaTxLog) string {
if txlogs == nil || len(txlogs) == 0 {
return "empty"
}
return "not empty"
}
func dumpAddress(a *metatypes.Address) string {
if a == nil {
return "nil"
}
return a.String()
}
func PrintReceipt(receipt *basetype.MetaReceipt) {
log.Info("receipt.type=", receipt.Type)
log.Info("receipt.txHash=", dumpHash(receipt.TxHash))
log.Info("receipt.blockNumber=", dumpBigInt(receipt.BlockNumber))
log.Info("receipt.blockHash=", dumpHash(receipt.BlockHash))
log.Info("receipt.Status=", receipt.Status)
log.Info("receipt.TxIndex=", receipt.TxIndex)
log.Info("receipt.ContractAddress=", dumpAddress(receipt.ContractAddress))
log.Info("receipt.Log=", dumpLogs(receipt.Logs))
log.Info("receipt.Root=", hex.EncodeToString(receipt.Root))
log.Info("receipt.CumulativeGasUsed=", receipt.CumulativeGasUsed)
log.Info("receipt.GasUsed=", receipt.GasUsed)
}
func PrintProofTx(tx *basetype.MetaProofTx) {
log.Info("tx.from=", dumpAddress(tx.Base.From))
log.Info("tx.to=", dumpAddress(tx.Base.To))
log.Info("tx.value=", dumpBigInt(tx.Base.Value))
log.Info("tx.hash=", dumpHash(tx.Base.TxHash))
log.Info("tx.type=", tx.Base.TxType)
log.Info("tx.nonce=", tx.Base.Nonce)
log.Info("tx.gasPrice=", dumpBigInt(tx.Base.GasPrice))
log.Info("tx.gasLimit=", tx.Base.Gas)
log.Info("tx.chainId=", dumpBigInt(tx.Base.ChainId))
log.Info("tx.expireBlock=", dumpBigInt(tx.Base.ExpiredBlock))
//log.Info("tx.receiveTime=", tx.Base.ReceiveTime)
log.Info("tx.data=", hex.EncodeToString(tx.Base.Data))
log.Info("tx.V=", dumpBigInt(tx.Base.V))
log.Info("tx.R=", dumpBigInt(tx.Base.R))
log.Info("tx.S=", dumpBigInt(tx.Base.S))
}
func PrintTransaction(transaction *basetype.MetaTransaction) {
prooftx := new(basetype.MetaProofTx)
if gogotypes.Is(transaction.Tx, prooftx) {
gogotypes.UnmarshalAny(transaction.Tx, prooftx)
} else {
log.Errorf("unknown block transaction type:%T\n", transaction.Tx)
}
PrintProofTx(prooftx)
}
func PrintBlock(block *basetype.MetaBlock) {
if block == nil {
log.Info("block is nil")
return
}
if block.Header == nil {
log.Info("block.header is nil")
} else {
h := block.GetHeader()
log.Info("block.BlockHash=", dumpHash(h.BlockHash))
log.Info("block.BlockNumber=", types.ToBigInt(block.Header.BlockNumber))
log.Info("block.TxsRoot=", dumpHash(h.TxsRoot))
log.Info("block.Timestamp=", h.Timestamp)
log.Info("block.ReceiptsRoot=", dumpHash(h.ReceiptsRoot))
log.Info("block.ParentHash=", dumpHash(h.ParentHash))
log.Info("block.Extra=", hex.EncodeToString(h.Extra))
log.Info("block.StateRoot=", dumpHash(h.StateRoot))
log.Info("block.BlockBloom=", dumpBloom(h.BlockBloom))
log.Info("block.GasLimit=", h.GasLimit)
log.Info("block.GasUsed=", h.GasUsed)
log.Info("block.Miner=", h.Miner)
}
if block.Txs == nil {
log.Info("block.txs is nil")
} else {
log.Info("block.txs count=", len(block.Txs))
for i, tx := range block.Txs {
log.Infof("block.txs[%d]:", i)
PrintTransaction(tx)
}
}
}
func featureBlock(client metanebula.NebulaServiceClient, number int64, hash string) {
if len(hash) > 0 {
req := new(metanebula.BlockByHashRequest)
req.BlockHash = (*metatypes.Hash)(types.HexToHash(hash).Bytes())
res, err := client.BlockByHash(context.Background(), req)
if err != nil {
log.Errorf("block by hash failed with err=%s", err)
return
}
PrintBlock(res.Block)
} else {
req := new(metanebula.BlockByNumberRequest)
req.BlockId = types.FromBigInt(big.NewInt(number))
res, err := client.BlockByNumber(context.Background(), req)
if err != nil {
log.Errorf("block by number failed with err=%s", err)
return
}
PrintBlock(res.Block)
}
}
func featureReceipt(client metanebula.NebulaServiceClient, hash string) {
req := new(metanebula.TransactionReceiptRequest)
req.TxHash = (*metatypes.Hash)(types.HexToHash(hash).Bytes())
res, err := client.TransactionReceipt(context.Background(), req)
if err != nil {
log.Errorf("receipt by hash failed with err=%s", err)
return
}
PrintReceipt(res.TxReceipt)
}
func featureTransaction(client metanebula.NebulaServiceClient, hash string) {
req := new(metanebula.TransactionByHashRequest)
req.TxHash = (*metatypes.Hash)(types.HexToHash(hash).Bytes())
res, err := client.TransactionByHash(context.Background(), req)
if err != nil {
log.Errorf("receipt by hash failed with err=%s", err)
return
}
PrintTransaction(res.TxData)
}
func featureTestSendTransaction(client metanebula.NebulaServiceClient) {
prooftx := &basetype.MetaProofTx{
Base: &basetype.MetaTxBase{
TxHash: (*metatypes.Hash)(types.HexToHash("0x7b66e1b27b55febba2407ee31e76245d3a0d4254dafbdaa4dcde36d9efd15226").Bytes()),
TxType: 2,
Value: metatypes.NewBigInt(122222),
},
}
anybase, err := gogotypes.MarshalAny(prooftx)
if err != nil {
log.Errorf("marshal any failed with err:%s", err)
return
}
mtx := &basetype.MetaTransaction{
Tx: anybase,
}
req := new(metanebula.TestSendTransactionRequest)
req.TxData = mtx
res, err := client.TestSendTransaction(context.Background(), req)
if err != nil {
log.Errorf("TestSendTransaction with err=%s", err)
return
}
log.Infof("TestSendTransaction succeed got res.TxHash:%s", res.TxHash)
}
func featureAccountInfo(client metanebula.NebulaServiceClient, address string) {
addr := metatypes.HexToAddress(address)
getbalance := new(metanebula.BalanceRequest)
getbalance.Address = &addr
res, err := client.Balance(context.Background(), getbalance)
if err != nil {
log.Errorf("get balance failed with err=%s", err)
return
}
log.Infof("get account(%s).balance=%s", addr.String(), res.Balance.Text(16))
getnonce := new(metanebula.NonceRequest)
getnonce.Address = &addr
nonceres, err := client.Nonce(context.Background(), getnonce)
if err != nil {
log.Errorf("get nonce failed with err=%s", err)
return
}
log.Infof("get account(%s).nonce=%v", addr.String(), nonceres.Nonce)
}
func featureNonceRepeated(client metanebula.NebulaServiceClient, addressList []string) {
addrs := make([]metatypes.Address, len(addressList))
for i, addr := range addressList {
addrs[i] = metatypes.HexToAddress(addr)
}
getnonces := new(metanebula.RepeatedNonceRequest)
getnonces.Address = addrs
nonceres, err := client.RepeatedNonce(context.Background(), getnonces)
if err != nil {
log.Errorf("get nonce failed with err=%s", err)
return
}
for i := 0; i < len(nonceres.Address); i++ {
log.Infof("get account(%s).nonce=%v", nonceres.Address[i].String(), nonceres.Nonce[i])
}
}
func main() {
node := flag.String("node", "127.0.0.1:38004", "nebula service address")
feature := flag.String("f", "block", "feature name, available value(block, receipt, tx, account)")
number := flag.Int64("n", 10, "block number")
hash := flag.String("hash", "", "request hash value, block/tx/receipt hash")
acc := flag.String("addr", "", "get account info")
flag.Parse()
client, err := grpc.Dial(*node, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Error("dial nebula failed", "err", err)
return
}
nebula := metanebula.NewNebulaServiceClient(client)
switch *feature {
case "block":
featureBlock(nebula, *number, *hash)
case "receipt":
featureReceipt(nebula, *hash)
case "send":
featureTestSendTransaction(nebula)
case "tx":
featureTransaction(nebula, *hash)
case "account":
featureAccountInfo(nebula, *acc)
case "repeatnonce":
addresslist := strings.Split(*acc, ",")
featureNonceRepeated(nebula, addresslist)
}
return
}
module ChainGrpcTest
go 1.19
require (
github.com/CaduceusMetaverseProtocol/MetaTypes v1.0.0
github.com/ethereum/go-ethereum v1.11.2
github.com/gogo/protobuf v1.3.2
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
github.com/sirupsen/logrus v1.9.0
github.com/spf13/cobra v1.6.1
github.com/xuri/excelize/v2 v2.7.0
)
require (
github.com/deckarep/golang-set/v2 v2.2.0 // indirect
github.com/jonboulle/clockwork v0.3.0 // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
golang.org/x/crypto v0.5.0 // indirect
)
require (
github.com/CaduceusMetaverseProtocol/MetaProtocol v0.0.1
github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-stack/stack v1.8.1 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/lestrrat-go/strftime v1.0.6 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/richardlehane/mscfb v1.0.4 // indirect
github.com/richardlehane/msoleps v1.0.3 // indirect
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/tklauser/go-sysconf v0.3.11 // indirect
github.com/tklauser/numcpus v0.6.0 // indirect
github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect
github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect
golang.org/x/net v0.8.0 // indirect
golang.org/x/sys v0.6.0 // indirect
golang.org/x/text v0.8.0 // indirect
google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect
google.golang.org/grpc v1.53.0
google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect
)
replace (
github.com/CaduceusMetaverseProtocol/MetaCryptor => ../MetaCryptor-main
github.com/CaduceusMetaverseProtocol/MetaProtocol => ../MetaProtocol-main
github.com/CaduceusMetaverseProtocol/MetaTypes => ../MetaTypes-main
)
github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8=
github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U=
github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04=
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8=
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk=
github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ=
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/deckarep/golang-set/v2 v2.2.0 h1:2pMQd3Soi6qfw7E5MMKaEh5W5ES18bW3AbFFnGl6LgQ=
github.com/deckarep/golang-set/v2 v2.2.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc=
github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=
github.com/ethereum/go-ethereum v1.11.2 h1:z/luyejbevDCAMUUiu0rc80dxJxOnpoG58k5o0tSawc=
github.com/ethereum/go-ethereum v1.11.2/go.mod h1:DuefStAgaxoaYGLR0FueVcVbehmn5n9QUcVrMCuOvuc=
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI=
github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE=
github.com/holiman/big v0.0.0-20221017200358-a027dc42d04e h1:pIYdhNkDh+YENVNi3gto8n9hAmRxKxoar0iE6BLucjw=
github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM=
github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ=
github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg=
github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8=
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is=
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4=
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA=
github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ=
github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI=
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM=
github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo=
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=
github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI=
github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms=
github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4=
github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8=
github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa h1:5SqCsI/2Qya2bCzK15ozrqo2sZxkh0FHynJZOTVoV6Q=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c=
github.com/xuri/efp v0.0.0-20220603152613-6918739fd470/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
github.com/xuri/excelize/v2 v2.7.0 h1:Hri/czwyRCW6f6zrCDWXcXKshlq4xAZNpNOpdfnFhEw=
github.com/xuri/excelize/v2 v2.7.0/go.mod h1:ebKlRoS+rGyLMyUx3ErBECXs/HNYqyj+PbkkKRK5vSI=
github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 h1:OAmKAfT06//esDdpi/DZ8Qsdt4+M5+ltca05dA5bG2M=
github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg=
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 h1:Lj6HJGCSn5AjxRAH2+r35Mir4icalbqku+CLUtjnvXY=
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA=
google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s=
google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc=
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU=
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
package logging
import (
"sync"
"github.com/sirupsen/logrus"
)
// Logger is the interface to our internal logger.
type Logger interface {
Debug(msg string, kvpairs ...interface{})
Info(msg string, kvpairs ...interface{})
Error(msg string, kvpairs ...interface{})
SetField(key string, val interface{})
PushFields()
PopFields()
}
// LogrusLogger is a thread-safe logger whose properties persist and can be modified.
type LogrusLogger struct {
mtx sync.Mutex
logger *logrus.Entry
ctx string
fields map[string]interface{}
pushedFieldSets []map[string]interface{}
}
// NoopLogger implements Logger, but does nothing.
type NoopLogger struct{}
// LogrusLogger implements Logger
var _ Logger = (*LogrusLogger)(nil)
var _ Logger = (*NoopLogger)(nil)
//
// LogrusLogger
//
// NewLogrusLogger will instantiate a logger with the given context.
func NewLogrusLogger(ctx string, kvpairs ...interface{}) Logger {
var logger *logrus.Entry
if len(ctx) > 0 {
logger = logrus.WithField("ctx", ctx)
} else {
logger = logrus.NewEntry(logrus.New())
}
return &LogrusLogger{
logger: logger,
ctx: ctx,
fields: serializeKVPairs(kvpairs),
pushedFieldSets: []map[string]interface{}{},
}
}
func (l *LogrusLogger) withFields() *logrus.Entry {
if len(l.fields) > 0 {
return l.logger.WithFields(l.fields)
}
return l.logger
}
func serializeKVPairs(kvpairs ...interface{}) map[string]interface{} {
res := make(map[string]interface{})
if (len(kvpairs) % 2) == 0 {
for i := 0; i < len(kvpairs); i += 2 {
res[kvpairs[i].(string)] = kvpairs[i+1]
}
}
return res
}
func (l *LogrusLogger) withKVPairs(kvpairs ...interface{}) *logrus.Entry {
fields := serializeKVPairs(kvpairs...)
if len(fields) > 0 {
return l.withFields().WithFields(fields)
}
return l.withFields()
}
func (l *LogrusLogger) Debug(msg string, kvpairs ...interface{}) {
l.mtx.Lock()
defer l.mtx.Unlock()
l.withKVPairs(kvpairs...).Debugln(msg)
}
func (l *LogrusLogger) Info(msg string, kvpairs ...interface{}) {
l.mtx.Lock()
defer l.mtx.Unlock()
l.withKVPairs(kvpairs...).Infoln(msg)
}
func (l *LogrusLogger) Error(msg string, kvpairs ...interface{}) {
l.mtx.Lock()
defer l.mtx.Unlock()
l.withKVPairs(kvpairs...).Errorln(msg)
}
func (l *LogrusLogger) SetField(key string, val interface{}) {
l.mtx.Lock()
defer l.mtx.Unlock()
l.fields[key] = val
}
func (l *LogrusLogger) PushFields() {
l.mtx.Lock()
defer l.mtx.Unlock()
l.pushedFieldSets = append(l.pushedFieldSets, l.fields)
}
func (l *LogrusLogger) PopFields() {
l.mtx.Lock()
defer l.mtx.Unlock()
pfsLen := len(l.pushedFieldSets)
if pfsLen > 0 {
l.fields = l.pushedFieldSets[pfsLen-1]
l.pushedFieldSets = l.pushedFieldSets[:pfsLen-1]
}
}
//
// NoopLogger
//
// NewNoopLogger will instantiate a logger that does nothing when called.
func NewNoopLogger() Logger {
return &NoopLogger{}
}
func (l *NoopLogger) Debug(msg string, kvpairs ...interface{}) {}
func (l *NoopLogger) Info(msg string, kvpairs ...interface{}) {}
func (l *NoopLogger) Error(msg string, kvpairs ...interface{}) {}
func (l *NoopLogger) SetField(key string, val interface{}) {}
func (l *NoopLogger) PushFields() {}
func (l *NoopLogger) PopFields() {}
package logging
import (
"reflect"
"testing"
)
func TestKVPairSerialization(t *testing.T) {
testCases := []struct {
kvpairs []interface{}
expected map[string]interface{}
}{
{
[]interface{}{"a", 1, "b", "v"},
map[string]interface{}{
"a": 1,
"b": "v",
},
},
{
[]interface{}{"a"},
map[string]interface{}{},
},
{
[]interface{}{"a", 1, "b"},
map[string]interface{}{},
},
}
for i, tc := range testCases {
actual := serializeKVPairs(tc.kvpairs...)
if !reflect.DeepEqual(actual, tc.expected) {
t.Errorf("Test case %d: Expected result %v, but got %v", i, tc.expected, actual)
}
}
}
package log
import (
"context"
"github.com/lestrrat-go/file-rotatelogs"
"github.com/rifflock/lfshook"
"github.com/sirupsen/logrus"
"os"
"path"
"time"
)
var (
mlog = logrus.New()
)
type LogConfig struct {
Save uint `json:"save"`
Path string `json:"path"`
Level string `json:"level"`
}
func InitLog(logConfig LogConfig) {
mlog.Out = os.Stdout
var loglevel logrus.Level
err := loglevel.UnmarshalText([]byte(logConfig.Level))
if err != nil {
mlog.Panicf("set log level failed: %v", err)
}
mlog.SetLevel(loglevel)
mlog.Formatter = &logrus.TextFormatter{FullTimestamp: true, TimestampFormat: "2006-01-2 15:04:05.000"}
localFilesystemLogger(mlog, logConfig.Path, logConfig.Save)
}
func logWriter(logPath string, level string, save uint) *rotatelogs.RotateLogs {
logFullPath := path.Join(logPath, level)
logwriter, err := rotatelogs.New(
logFullPath+".%Y%m%d",
rotatelogs.WithLinkName(logFullPath),
rotatelogs.WithRotationCount(save),
rotatelogs.WithRotationTime(24*time.Hour),
)
if err != nil {
panic(err)
}
return logwriter
}
func localFilesystemLogger(log *logrus.Logger, logPath string, save uint) {
lfHook := lfshook.NewHook(lfshook.WriterMap{
logrus.DebugLevel: logWriter(logPath, "debug", save), // 为不同级别设置不同的输出目的
logrus.InfoLevel: logWriter(logPath, "info", save),
logrus.WarnLevel: logWriter(logPath, "warn", save),
logrus.ErrorLevel: logWriter(logPath, "error", save),
logrus.FatalLevel: logWriter(logPath, "fatal", save),
logrus.PanicLevel: logWriter(logPath, "panic", save),
}, &logrus.TextFormatter{FullTimestamp: true, TimestampFormat: "2006-01-2 15:04:05.000"})
log.AddHook(lfHook)
}
// WithField allocates a new entry and adds a field to it.
// Debug, Print, Info, Warn, Error, Fatal or Panic must be then applied to
// this new returned entry.
// If you want multiple fields, use `WithFields`.
func WithField(key string, value interface{}) *logrus.Entry {
return mlog.WithField(key, value)
}
// Adds a struct of fields to the log entry. All it does is call `WithField` for
// each `Field`.
func WithFields(fields logrus.Fields) *logrus.Entry {
return mlog.WithFields(fields)
}
// Add an error as single field to the log entry. All it does is call
// `WithError` for the given `error`.
func WithError(err error) *logrus.Entry {
return mlog.WithError(err)
}
// Add a context to the log entry.
func WithContext(ctx context.Context) *logrus.Entry {
return mlog.WithContext(ctx)
}
// Overrides the time of the log entry.
func WithTime(t time.Time) *logrus.Entry {
return mlog.WithTime(t)
}
func Logf(level logrus.Level, format string, args ...interface{}) {
mlog.Logf(level, format, args...)
}
func Tracef(format string, args ...interface{}) {
mlog.Tracef(format, args...)
}
func Debugf(format string, args ...interface{}) {
mlog.Debugf(format, args...)
}
func Infof(format string, args ...interface{}) {
mlog.Infof(format, args...)
}
func Printf(format string, args ...interface{}) {
mlog.Printf(format, args...)
}
func Warnf(format string, args ...interface{}) {
mlog.Warnf(format, args...)
}
func Warningf(format string, args ...interface{}) {
mlog.Warningf(format, args...)
}
func Errorf(format string, args ...interface{}) {
mlog.Errorf(format, args)
}
func Fatalf(format string, args ...interface{}) {
mlog.Fatalf(format, args...)
}
func Panicf(format string, args ...interface{}) {
mlog.Panicf(format, args...)
}
func Log(level logrus.Level, args ...interface{}) {
mlog.Log(level, args...)
}
func LogFn(level logrus.Level, fn logrus.LogFunction) {
mlog.LogFn(level, fn)
}
func Trace(args ...interface{}) {
mlog.Trace(args...)
}
func Debug(args ...interface{}) {
mlog.Debug(args...)
}
func Info(args ...interface{}) {
mlog.Info(args...)
}
func Print(args ...interface{}) {
mlog.Print(args...)
}
func Warn(args ...interface{}) {
mlog.Warn(args...)
}
func Warning(args ...interface{}) {
mlog.Warning(args...)
}
func Error(args ...interface{}) {
mlog.Error(args...)
}
func Fatal(args ...interface{}) {
mlog.Fatal(args...)
}
func Panic(args ...interface{}) {
mlog.Panic(args...)
}
func TraceFn(fn logrus.LogFunction) {
mlog.TraceFn(fn)
}
func DebugFn(fn logrus.LogFunction) {
mlog.DebugFn(fn)
}
func InfoFn(fn logrus.LogFunction) {
mlog.InfoFn(fn)
}
func PrintFn(fn logrus.LogFunction) {
mlog.PrintFn(fn)
}
func WarnFn(fn logrus.LogFunction) {
mlog.WarnFn(fn)
}
func WarningFn(fn logrus.LogFunction) {
mlog.WarningFn(fn)
}
func ErrorFn(fn logrus.LogFunction) {
mlog.ErrorFn(fn)
}
func FatalFn(fn logrus.LogFunction) {
mlog.FatalFn(fn)
}
func PanicFn(fn logrus.LogFunction) {
mlog.PanicFn(fn)
}
func Logln(level logrus.Level, args ...interface{}) {
mlog.Logln(level, args...)
}
func Traceln(args ...interface{}) {
mlog.Traceln(args...)
}
func Debugln(args ...interface{}) {
mlog.Debugln(args...)
}
func Infoln(args ...interface{}) {
mlog.Infoln(args...)
}
func Println(args ...interface{}) {
mlog.Println(args...)
}
func Warnln(args ...interface{}) {
mlog.Warnln(args...)
}
func Warningln(args ...interface{}) {
mlog.Warningln(args...)
}
func Errorln(args ...interface{}) {
mlog.Errorln(args...)
}
func Fatalln(args ...interface{}) {
mlog.Fatalln(args...)
}
func Panicln(args ...interface{}) {
mlog.Panicln(args...)
}
error.20230308
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
time="2023-03-8 10:09:42.523" level=error msg="Program execute error: [unknown command \"start\" for \"start\"]"
time="2023-03-8 10:10:25.007" level=error msg="Program execute error: [unknown flag: --bathSign]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.701" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
time="2023-03-8 10:11:26.702" level=error msg="SendTranErr: [rpc error: code = Unavailable desc = error reading from server: read tcp 192.168.1.103:51555->35.78.87.116:38002: read: connection reset by peer]"
info.20230308
\ No newline at end of file
time="2023-03-7 18:31:02.351" level=info msg="<nil>"
time="2023-03-7 18:32:56.905" level=info msg="<nil>"
time="2023-03-7 18:35:06.217" level=info msg="Program start initAccCount:100 tranCount"
time="2023-03-7 18:35:35.040" level=info msg="Program start initAccCount:100 tranCount"
time="2023-03-7 18:36:50.433" level=info msg="Program start initAccCount:100 tranCount"
time="2023-03-7 18:36:50.434" level=info msg="Send tran count: 0"
time="2023-03-7 18:36:50.434" level=info msg="Since time: 0 ms"
time="2023-03-7 18:37:42.637" level=info msg="Program start initAccCount:100 tranCount"
time="2023-03-7 18:41:11.551" level=info msg="Program start initAccCount:100 tranCount"
time="2023-03-7 18:41:36.827" level=info msg="Program start initAccCount:100 tranCount"
time="2023-03-7 18:43:28.094" level=info msg="Program start initAccCount:100 tranCount"
time="2023-03-7 18:45:21.726" level=info msg="Program start initAccCount:100 tranCount"
time="2023-03-8 10:10:44.976" level=info msg="Program start initAccCount:100 tranCount"
package main
import (
"ChainGrpcTest/log"
"ChainGrpcTest/tool"
"github.com/spf13/cobra"
"os"
"runtime/pprof"
)
var (
initAcc, initCmp, batchSign, batchRecover, batchRecoverTx, batchVerify bool
txCount, goRoutineCount, cmpAmount int
cpuProfile string
cfg *tool.Config
)
func init() {
initCmd.PersistentFlags().IntVar(&cmpAmount, "cmp", 1, "Transfer amount,default: 1CMP")
initCmd.PersistentFlags().BoolVar(&initAcc, "initAcc", false, "Start after initializing the account")
initCmd.PersistentFlags().BoolVar(&initCmp, "initCmp", false, "Start after initializing the account cmp balance")
startCmd.PersistentFlags().StringVar(&cpuProfile, "cpuProfile", "cpuProfile.prof", "Statistics cpu profile")
startCmd.PersistentFlags().BoolVar(&batchSign, "batchSign", false, "test grpc interface -> batchSign")
startCmd.PersistentFlags().BoolVar(&batchRecover, "batchRecover", false, "test grpc interface -> batchRecover")
startCmd.PersistentFlags().BoolVar(&batchRecoverTx, "batchRecoverTx", false, "test grpc interface -> batchRecoverTx")
startCmd.PersistentFlags().BoolVar(&batchVerify, "batchVerify", false, "test grpc interface -> batchVerify")
startCmd.PersistentFlags().IntVar(&txCount, "txCount", 1000, "send tran count")
startCmd.PersistentFlags().IntVar(&goRoutineCount, "goRoutineCount", 100, "send tran engagement count")
startCmd.AddCommand(initCmd)
}
func main() {
log.InitLog(log.LogConfig{Path: "logs", Level: "debug", Save: 3})
// 执行初始化账户操作
Execute()
}
func Execute() {
if err := startCmd.Execute(); err != nil {
log.Errorf("Program execute error: %s", err)
os.Exit(1)
}
}
var initCmd = &cobra.Command{
Use: "init",
Short: "Init your account command and transfer coin",
Run: func(cmd *cobra.Command, args []string) {
if initAcc {
tool.InitAccount(cfg, cfg.Count)
}
if initCmp {
tool.TransferAccount(cfg, int64(cfg.Count))
}
},
}
var startCmd = &cobra.Command{
Use: "start",
Short: "Start the stress test project",
Run: func(cmd *cobra.Command, args []string) {
f, err := os.Create(cpuProfile)
if err != nil {
log.Fatal(err)
}
err = pprof.StartCPUProfile(f)
if err != nil {
log.Error("Start cpu profile err:", err)
return
}
startTest()
defer pprof.StopCPUProfile()
},
}
File added
package main
import (
"ChainGrpcTest/log"
"ChainGrpcTest/tool"
"ChainGrpcTest/transaction"
)
var (
SendTxAccountArr [][]string
)
func init() {
var err error
cfg, err = tool.ParseConfig("./config/app.json")
if err != nil {
log.Errorf("Parse config error:%s", err)
return
}
cfg.StorageAccFileName += ".xlsx"
cfg.GoRoutineCount = goRoutineCount
cfg.SignCount = txCount / 100
SendTxAccountArr = tool.ReadExcel(cfg.Count, cfg.StorageAccFileName)
}
func startTest() {
log.Infof("Program start initAccCount:%d tranCount", cfg.Count)
arr := transaction.SignedTxArr(SendTxAccountArr, cfg)
if batchSign {
if err := transaction.BatchSignHandler(arr, cfg); err != nil {
log.Errorf("Bath Send Tran error: %s", err)
return
}
}
if batchRecover {
if err := transaction.BatchRecoverHandler(arr, cfg); err != nil {
log.Errorf("Bath Send Tran error: %s", err)
return
}
}
if batchRecoverTx {
if err := transaction.BatchRecoverTxHandler(arr, cfg); err != nil {
log.Errorf("Bath Send Tran error: %s", err)
return
}
}
if batchVerify {
if err := transaction.BatchVerifyHandler(arr, cfg); err != nil {
log.Errorf("Bath Send Tran error: %s", err)
return
}
}
}
package tool
import (
"ChainGrpcTest/log"
"context"
"fmt"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/common/math"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/xuri/excelize/v2"
"math/big"
"sync/atomic"
"time"
)
func InitAccount(cfg *Config, createAccCount int) {
if createAccCount <= 0 {
return
}
excelFile := excelize.NewFile()
index, _ := excelFile.NewSheet("Sheet1")
// 设置工作簿的默认工作表
excelFile.SetActiveSheet(index)
for i := 1; i <= createAccCount; i++ {
toPrivateKey, err := crypto.GenerateKey()
if err != nil {
log.Error("Gen wallet Err:%r", err)
break
}
toPrivateKeyEncode := hexutil.Encode(crypto.FromECDSA(toPrivateKey))[2:]
toAddress := crypto.PubkeyToAddress(toPrivateKey.PublicKey)
// 设置单元格的值
titleSlice := []interface{}{toAddress, toPrivateKeyEncode}
axis := fmt.Sprintf("A%d", i)
excelFile.SetSheetRow("Sheet1", axis, &titleSlice)
log.Infof("Gen count: %d", i)
}
//根据指定路径保存文件
if err := excelFile.SaveAs(cfg.StorageAccFileName); err != nil {
log.Error("Save address file error: %s", err)
} else {
log.Info("Save address file successful")
}
}
func BathSendTran(cfg *Config, signedTxArr []*types.Transaction, client *ethclient.Client) {
tranTxCh := make(chan *types.Transaction, 1000000)
var bathHandleSendCount int64
startTime := time.Now()
log.Info("start time:", startTime.String())
for count := 0; count < cfg.GoRoutineCount; count++ {
go func() {
for {
select {
case signedTx := <-tranTxCh:
timeout, cancelFunc := context.WithTimeout(context.Background(), time.Second*3)
defer cancelFunc()
err := client.SendTransaction(timeout, signedTx)
log.Info("Send tx:", signedTx.Hash())
atomic.AddInt64(&bathHandleSendCount, 1)
if err != nil {
log.Error("sendTranErr:", err)
continue
}
}
}
}()
}
for _, sign := range signedTxArr {
tranTxCh <- sign
}
for {
if bathHandleSendCount == int64(len(signedTxArr)) {
log.Infof("Send tran count: %d", bathHandleSendCount)
log.Info("end time:", time.Now().String())
log.Info("since time:", time.Since(startTime).Milliseconds())
break
}
}
}
func signTxArr(cfg *Config, amount int64) ([]*types.Transaction, *ethclient.Client) {
accounts := ReadExcel(cfg.Count, cfg.StorageAccFileName)
log.Info("Read file successful")
client, err := ethclient.Dial(cfg.RpcNode)
if err != nil {
log.Error("Connect chain error", err)
}
log.Info("Connect client successful")
defer func() {
client.Close()
}()
signerKey, err := crypto.HexToECDSA(cfg.InitAccountPrv)
fromAddress := crypto.PubkeyToAddress(signerKey.PublicKey)
nonce, err := client.NonceAt(context.Background(), fromAddress, nil)
chNonce := big.NewInt(int64(nonce))
signedTxArr := make([]*types.Transaction, 0)
for _, rows := range accounts {
decode, err := hexutil.Decode(rows[0])
if err != nil {
continue
}
address := common.BytesToAddress(decode)
txData := types.LegacyTx{
Nonce: chNonce.Uint64(),
To: &address,
Value: math.BigPow(amount*10, 18),
Gas: 100000,
GasPrice: big.NewInt(1000000001),
Data: nil,
}
newtx := types.NewTx(&txData)
signedTx, err := types.SignTx(newtx, types.NewEIP155Signer(big.NewInt(100)), signerKey)
if err != nil {
log.Error("Signed Error", err)
}
signedTxArr = append(signedTxArr, signedTx)
chNonce = chNonce.Add(chNonce, big.NewInt(1))
}
return signedTxArr, client
}
// TransferAccount : Perform local currency transfer transactions directly through account signatures
func TransferAccount(cfg *Config, amount int64) {
signedTxArr, client := signTxArr(cfg, amount)
BathSendTran(cfg, signedTxArr, client)
}
func ReadExcelOfStartEnd(start int, end int, fileName string) [][]string {
file, err := excelize.OpenFile(fileName)
if err != nil {
log.Error("Open excel err", err.Error())
return nil
}
rows, err := file.GetRows("Sheet1")
if err != nil {
log.Error("Read excel failed: " + err.Error())
return nil
}
res := make([][]string, 0)
for i := start; i <= end; i++ {
res = append(res, rows[i])
}
return res
}
func ReadExcel(count int, fileName string) [][]string {
file, err := excelize.OpenFile(fileName)
if err != nil {
log.Error("Open excel err", err.Error())
return nil
}
rows, err := file.GetRows("Sheet1")
if err != nil {
log.Error("Read excel failed: " + err.Error())
return nil
}
res := make([][]string, 0)
for _, row := range rows {
if len(res) == count {
break
}
res = append(res, row)
}
return res
}
package tool
import (
"ChainGrpcTest/log"
"bufio"
"encoding/json"
"os"
)
type Config struct {
ReceiveAddr string `json:"receiveAddr"`
Count int `json:"count"`
SignCount int `json:"signCount"`
GoRoutineCount int `json:"goRoutineCount"`
Type int `json:"type"`
RpcNode string `json:"rpcNode"`
Amount int64 `json:"amount"`
ChainId int64 `json:"chainId"`
InitAccountPrv string `json:"initAccountPrv"`
BatchTransferContract string `json:"batchTransferContract"`
SleepTime int `json:"sleepTime"`
StorageAccFileName string `json:"storageAccFileName"`
}
var _cfg *Config = nil
func ParseConfig(path string) (*Config, error) {
file, err := os.Open(path)
if err != nil {
panic(err)
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
log.Error("read file close failed:", err)
}
}(file)
reader := bufio.NewReader(file)
decoder := json.NewDecoder(reader)
if err := decoder.Decode(&_cfg); err != nil {
return nil, err
}
return _cfg, nil
}
package transaction
import (
"ChainGrpcTest/log"
"ChainGrpcTest/tool"
"context"
crypterv1 "github.com/CaduceusMetaverseProtocol/MetaProtocol/gen/proto/go/crypter/v1"
"github.com/ethereum/go-ethereum/core/types"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"sync/atomic"
"time"
)
var (
batchSignRequest chan *crypterv1.BatchSignRequest
clientMap map[int]crypterv1.CrypterServiceClient
bathHandleSendCount, allSignedTxCount, totalSendTime int64
)
func init() {
batchSignRequest = make(chan *crypterv1.BatchSignRequest, 1000000)
clientMap = make(map[int]crypterv1.CrypterServiceClient)
}
// batchSign 发送的签名交易
func batchSign(client crypterv1.CrypterServiceClient, sleepTime int) {
var beforeSendTxTime time.Time
for {
select {
case batchSign := <-batchSignRequest:
if sleepTime != 0 {
time.Sleep(time.Millisecond * time.Duration(sleepTime))
}
sendTranStartTime := time.Now()
if beforeSendTxTime.UnixMilli() > 0 && time.Since(beforeSendTxTime).Milliseconds() < 1 {
time.Sleep(time.Millisecond * time.Duration(1))
}
sign, err := client.BatchSign(context.Background(), batchSign, grpc.CallContentSubtype(""))
if err != nil {
log.Errorf("SendTranErr: %s", err)
sign, err = client.BatchSign(context.Background(), batchSign, grpc.CallContentSubtype(""))
if err != nil {
log.Errorf("Send tran twice err: %s", err)
continue
}
}
beforeSendTxTime = time.Now()
atomic.AddInt64(&bathHandleSendCount, 1)
sinceTime := time.Since(sendTranStartTime).Milliseconds()
atomic.AddInt64(&totalSendTime, sinceTime)
log.Infof("Send transaction time: %d ms, sign: %s ", sinceTime, sign.String())
}
}
}
// BatchSignHandler 处理批量发送的签名交易
func BatchSignHandler(tranArr []*types.Transaction, cfg *tool.Config) error {
client, err := grpc.Dial(cfg.RpcNode, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Error("dial nebula failed", "err", err)
}
for i := 0; i < cfg.GoRoutineCount; i++ {
go batchSign(crypterv1.NewCrypterServiceClient(client), cfg.SleepTime)
}
allSignedTxCount = int64(len(tranArr))
startTime := time.Now()
for i := 0; i < int(allSignedTxCount); i++ {
req := crypterv1.BatchSignRequest{}
batchSignRequest <- &req
}
for {
if bathHandleSendCount == allSignedTxCount {
log.Infof("Send tran count: %d", bathHandleSendCount)
log.Infof("Since time: %d ms", time.Since(startTime).Milliseconds())
break
}
}
return nil
}
// BatchRecover 发送的签名交易
func batchRecover(client crypterv1.CrypterServiceClient, sleepTime int) {
var beforeSendTxTime time.Time
for {
select {
case batchRecover := <-batchSignRequest:
if sleepTime != 0 {
time.Sleep(time.Millisecond * time.Duration(sleepTime))
}
sendTranStartTime := time.Now()
if beforeSendTxTime.UnixMilli() > 0 && time.Since(beforeSendTxTime).Milliseconds() < 1 {
time.Sleep(time.Millisecond * time.Duration(1))
}
sign, err := client.BatchSign(context.Background(), batchRecover, grpc.CallContentSubtype(""))
if err != nil {
log.Errorf("SendTranErr: %s", err)
sign, err = client.BatchSign(context.Background(), batchRecover, grpc.CallContentSubtype(""))
if err != nil {
log.Errorf("Send tran twice err: %s", err)
continue
}
}
beforeSendTxTime = time.Now()
atomic.AddInt64(&bathHandleSendCount, 1)
sinceTime := time.Since(sendTranStartTime).Milliseconds()
atomic.AddInt64(&totalSendTime, sinceTime)
log.Infof("Send transaction time: %d ms, sign: %s ", sinceTime, sign.String())
}
}
}
// BatchRecoverHandler 处理批量发送的签名交易
func BatchRecoverHandler(tranArr []*types.Transaction, cfg *tool.Config) error {
grpcClient, err := grpc.Dial(cfg.RpcNode, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Error("dial nebula failed", "err", err)
}
serviceClient := crypterv1.NewCrypterServiceClient(grpcClient)
go batchRecover(serviceClient, cfg.SleepTime)
allSignedTxCount = int64(len(tranArr))
startTime := time.Now()
for i := 0; i < int(allSignedTxCount); i++ {
req := crypterv1.BatchSignRequest{}
batchSignRequest <- &req
}
for {
if bathHandleSendCount == allSignedTxCount {
log.Infof("Send tran count: %d", bathHandleSendCount)
log.Infof("Since time: %d ms", time.Since(startTime).Milliseconds())
break
}
}
return nil
}
// BatchVerify 发送的签名交易
func batchVerify(client crypterv1.CrypterServiceClient, sleepTime int) {
var beforeSendTxTime time.Time
for {
select {
case batchVerify := <-batchSignRequest:
if sleepTime != 0 {
time.Sleep(time.Millisecond * time.Duration(sleepTime))
}
sendTranStartTime := time.Now()
if beforeSendTxTime.UnixMilli() > 0 && time.Since(beforeSendTxTime).Milliseconds() < 1 {
time.Sleep(time.Millisecond * time.Duration(1))
}
sign, err := client.BatchSign(context.Background(), batchVerify, grpc.CallContentSubtype(""))
if err != nil {
log.Errorf("SendTranErr: %s", err)
sign, err = client.BatchSign(context.Background(), batchVerify, grpc.CallContentSubtype(""))
if err != nil {
log.Errorf("Send tran twice err: %s", err)
continue
}
}
beforeSendTxTime = time.Now()
atomic.AddInt64(&bathHandleSendCount, 1)
sinceTime := time.Since(sendTranStartTime).Milliseconds()
atomic.AddInt64(&totalSendTime, sinceTime)
log.Infof("Send transaction time: %d ms, sign: %s ", sinceTime, sign.String())
}
}
}
// BatchVerifyHandler 处理批量发送的签名交易
func BatchVerifyHandler(tranArr []*types.Transaction, cfg *tool.Config) error {
client, err := grpc.Dial(cfg.RpcNode, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Error("dial nebula failed", "err", err)
}
go batchVerify(crypterv1.NewCrypterServiceClient(client), cfg.SleepTime)
allSignedTxCount = int64(len(tranArr))
startTime := time.Now()
for i := 0; i < int(allSignedTxCount); i++ {
req := crypterv1.BatchSignRequest{}
batchSignRequest <- &req
}
for {
if bathHandleSendCount == allSignedTxCount {
log.Infof("Send tran count: %d", bathHandleSendCount)
log.Infof("Since time: %d ms", time.Since(startTime).Milliseconds())
break
}
}
return nil
}
// batchRecoverTx 发送的签名交易
func batchRecoverTx(client crypterv1.CrypterServiceClient, sleepTime int) {
var beforeSendTxTime time.Time
for {
select {
case batchRecoverTx := <-batchSignRequest:
if sleepTime != 0 {
time.Sleep(time.Millisecond * time.Duration(sleepTime))
}
sendTranStartTime := time.Now()
if beforeSendTxTime.UnixMilli() > 0 && time.Since(beforeSendTxTime).Milliseconds() < 1 {
time.Sleep(time.Millisecond * time.Duration(1))
}
sign, err := client.BatchSign(context.Background(), batchRecoverTx, grpc.CallContentSubtype(""))
if err != nil {
log.Errorf("SendTranErr: %s", err)
sign, err = client.BatchSign(context.Background(), batchRecoverTx, grpc.CallContentSubtype(""))
if err != nil {
log.Errorf("Send tran twice err: %s", err)
continue
}
}
beforeSendTxTime = time.Now()
atomic.AddInt64(&bathHandleSendCount, 1)
sinceTime := time.Since(sendTranStartTime).Milliseconds()
atomic.AddInt64(&totalSendTime, sinceTime)
log.Infof("Send transaction time: %d ms, sign: %s ", sinceTime, sign.String())
}
}
}
// BatchRecoverTxHandler 处理批量发送的签名交易
func BatchRecoverTxHandler(tranArr []*types.Transaction, cfg *tool.Config) error {
client, err := grpc.Dial(cfg.RpcNode, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Error("dial nebula failed", "err", err)
}
go batchRecoverTx(crypterv1.NewCrypterServiceClient(client), cfg.SleepTime)
allSignedTxCount = int64(len(tranArr))
startTime := time.Now()
for i := 0; i < int(allSignedTxCount); i++ {
req := crypterv1.BatchSignRequest{}
batchSignRequest <- &req
}
for {
if bathHandleSendCount == allSignedTxCount {
log.Infof("Send tran count: %d", bathHandleSendCount)
log.Infof("Since time: %d ms", time.Since(startTime).Milliseconds())
break
}
}
return nil
}
package transaction
import (
"ChainGrpcTest/log"
"ChainGrpcTest/tool"
"crypto/ecdsa"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"math/big"
"time"
)
type TranConfig struct {
Amount int64
GoRoutineCount int
ChainId int64
PrivateKey, ReceivedAddr string
Nonce *big.Int
}
type Transactor struct {
config TranConfig
signerKey *ecdsa.PrivateKey
sender common.Address
receivedAddr common.Address
}
func newTransactor(cfg TranConfig) (*Transactor, error) {
signerKey, err := crypto.HexToECDSA(cfg.PrivateKey)
if err != nil {
log.Error("Error crypto HexToECDSA")
return nil, err
}
// through privateKey get account address
publicKey := signerKey.Public()
publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
if !ok {
log.Error("Error casting public key to ECDSA")
}
address := crypto.PubkeyToAddress(*publicKeyECDSA)
res := Transactor{
signerKey: signerKey,
receivedAddr: common.HexToAddress(cfg.ReceivedAddr),
config: cfg,
sender: address,
}
return &res, nil
}
// SignedTxArr 获取全部签名数据
func SignedTxArr(sendTxAccountArr [][]string, cfg *tool.Config) []*types.Transaction {
tranArr := make([]*types.Transaction, 0)
var signedTx *types.Transaction
for _, rows := range sendTxAccountArr {
privateKey := rows[1]
nonce := big.NewInt(1)
for signCount := 0; signCount < cfg.SignCount; signCount++ {
tranCfg := TranConfig{
Amount: cfg.Amount,
ChainId: cfg.ChainId,
PrivateKey: privateKey,
ReceivedAddr: cfg.ReceiveAddr,
GoRoutineCount: cfg.GoRoutineCount,
Nonce: nonce,
}
t, err := newTransactor(tranCfg)
signedTx, err = t.signedTx()
nonce = big.NewInt(1).Add(nonce, big.NewInt(1))
if err != nil || signedTx == nil {
log.Errorf("signed tx error %s ", err)
continue
}
tranArr = append(tranArr, signedTx)
}
}
return tranArr
}
// signedTx 签名本币转账交易
func (t *Transactor) signedTx() (*types.Transaction, error) {
txData := types.LegacyTx{
Nonce: t.config.Nonce.Uint64(),
To: &t.receivedAddr,
Value: big.NewInt(t.config.Amount),
Gas: 300000,
GasPrice: big.NewInt(1000000001),
Data: nil,
}
newtx := types.NewTx(&txData)
signedTx, err := types.SignTx(newtx, types.NewEIP155Signer(big.NewInt(t.config.ChainId)), t.signerKey)
if err != nil {
log.Errorf("Send tx nonce: %d , From: %s , to: %s , error: %s", t.config.Nonce, crypto.PubkeyToAddress(t.signerKey.PublicKey), t.receivedAddr, err.Error())
time.Sleep(time.Second)
return nil, err
}
return signedTx, nil
}
package types
import (
metatypes "github.com/CaduceusMetaverseProtocol/MetaTypes/types"
"math/big"
)
func ToBigInt(n *metatypes.BigInt) *big.Int {
return big.NewInt(n.Int64())
}
func HexToHash(hash string) metatypes.Hash {
return metatypes.HexToHash(hash)
}
func FromBigInt(num *big.Int) *metatypes.BigInt {
return metatypes.NewBigInt(num.Int64())
}
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