Skip to content

Commit

Permalink
add parallelOk
Browse files Browse the repository at this point in the history
  • Loading branch information
bxq2011hust committed Dec 25, 2023
1 parent a97bbd7 commit 3bc58e5
Show file tree
Hide file tree
Showing 5 changed files with 516 additions and 2 deletions.
129 changes: 129 additions & 0 deletions v3/examples/parallelok/main.go
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)
}
}
Loading

0 comments on commit 3bc58e5

Please sign in to comment.