forked from FISCO-BCOS/go-sdk
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
a97bbd7
commit 3bc58e5
Showing
5 changed files
with
516 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
package main | ||
|
||
import ( | ||
"context" | ||
"encoding/hex" | ||
"fmt" | ||
"log" | ||
"math/big" | ||
"os" | ||
"strconv" | ||
"sync" | ||
|
||
"github.com/FISCO-BCOS/go-sdk/v3/client" | ||
"github.com/FISCO-BCOS/go-sdk/v3/types" | ||
"github.com/schollz/progressbar/v3" | ||
) | ||
|
||
func main() { | ||
privateKey, _ := hex.DecodeString("145e247e170ba3afd6ae97e88f00dbc976c2345d511b0f6713355d19d8b80b58") | ||
// disable ssl of node rpc | ||
config := &client.Config{IsSMCrypto: false, GroupID: "group0", DisableSsl: false, | ||
PrivateKey: privateKey, Host: "127.0.0.1", Port: 20200, TLSCaFile: "./conf/ca.crt", TLSKeyFile: "./conf/sdk.key", TLSCertFile: "./conf/sdk.crt"} | ||
client, err := client.DialContext(context.Background(), config) | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
fmt.Println("=================DeployTransfer===============") | ||
address, receipt, instance, err := DeployTransfer(client.GetTransactOpts(), client) | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
fmt.Println("contract address: ", address.Hex()) // the address should be saved, will use in next example | ||
fmt.Println("transaction hash: ", receipt.TransactionHash) | ||
|
||
// load the contract | ||
// contractAddress := common.HexToAddress("contract address in hex String") | ||
// instance, err := NewStore(contractAddress, client) | ||
// if err != nil { | ||
// log.Fatal(err) | ||
// } | ||
groupID := os.Args[1] | ||
userCount, err := strconv.Atoi(os.Args[2]) | ||
if err != nil { | ||
fmt.Println("parse userCount error", err) | ||
return | ||
} | ||
total, err := strconv.Atoi(os.Args[3]) | ||
if err != nil { | ||
fmt.Println("parse total error", err) | ||
return | ||
} | ||
qps, err := strconv.Atoi(os.Args[4]) | ||
if err != nil { | ||
fmt.Println("parse qps error", err) | ||
return | ||
} | ||
fmt.Println("start perf groupID:", groupID, "userCount:", userCount, "total:", total, "qps:", qps) | ||
transfer := &TransferSession{Contract: instance, CallOpts: *client.GetCallOpts(), TransactOpts: *client.GetTransactOpts()} | ||
fmt.Println("add user") | ||
var wg sync.WaitGroup | ||
// balance := make(map[int]int64, userCount) | ||
balance := sync.Map{} | ||
failedCount := 0 | ||
for i := 0; i < userCount; i++ { | ||
_, err = transfer.AsyncSet(func(receipt *types.Receipt, err error) { | ||
if err != nil { | ||
fmt.Println("add user error", err) | ||
} | ||
wg.Done() | ||
}, strconv.Itoa(i), big.NewInt(1000000)) | ||
if err != nil { | ||
fmt.Println("add user error", err) | ||
failedCount++ | ||
} | ||
balance.Store(i, 1000000) | ||
wg.Add(1) | ||
} | ||
if failedCount > 0 { | ||
fmt.Println("add user failed", failedCount) | ||
return | ||
} | ||
wg.Wait() | ||
fmt.Println("start transfer") | ||
var wg2 sync.WaitGroup | ||
sendBar := progressbar.Default(int64(total)) | ||
receiveBar := progressbar.Default(int64(total)) | ||
for i := 0; i < total; i++ { | ||
from := i % userCount | ||
to := (i + userCount/2) % userCount | ||
amount := 1 | ||
_, err = transfer.AsyncTransfer(func(receipt *types.Receipt, err error) { | ||
receiveBar.Add(1) | ||
wg2.Done() | ||
if err != nil { | ||
fmt.Println("transfer error", err) | ||
return | ||
} | ||
currentFrom, _ := balance.Load(from) | ||
currentTo, _ := balance.Load(to) | ||
balance.Store(from, currentFrom.(int)-amount) | ||
balance.Store(to, currentTo.(int)+amount) | ||
}, strconv.Itoa(from), strconv.Itoa(to), big.NewInt(int64(amount))) | ||
if err != nil { | ||
fmt.Println("transfer error", err) | ||
continue | ||
} | ||
sendBar.Add(1) | ||
wg2.Add(1) | ||
} | ||
wg2.Wait() | ||
// check balance | ||
fmt.Println("check balance") | ||
var wg3 sync.WaitGroup | ||
for i := 0; i < userCount; i++ { | ||
wg3.Add(1) | ||
go func(i int) { | ||
b, err := transfer.BalanceOf(strconv.Itoa(i)) | ||
if err != nil { | ||
fmt.Println("check balance error", err) | ||
return | ||
} | ||
current, _ := balance.Load(i) | ||
if b.Cmp(big.NewInt(int64(current.(int)))) != 0 { | ||
fmt.Println("check balance error", i, b, current.(int)) | ||
} | ||
wg3.Done() | ||
}(i) | ||
} | ||
} |
Oops, something went wrong.