96 lines
2.2 KiB
Go
96 lines
2.2 KiB
Go
package shim
|
|
|
|
import (
|
|
"fmt"
|
|
"schain/config"
|
|
"schain/peer/ledger"
|
|
pb "schain/proto"
|
|
"schain/proto/util"
|
|
"strconv"
|
|
"strings"
|
|
|
|
cmap "github.com/orcaman/concurrent-map/v2"
|
|
)
|
|
|
|
type StateDB struct {
|
|
Value []byte
|
|
Version *pb.Version
|
|
}
|
|
|
|
type timer struct {
|
|
startTime uint64
|
|
endTime uint64
|
|
}
|
|
|
|
var TxLatency = cmap.New[*timer]()
|
|
|
|
var State = cmap.New[*StateDB]()
|
|
|
|
var detection cmap.ConcurrentMap[string, struct{}]
|
|
|
|
var BlockNum uint64
|
|
|
|
var Blockchain *ledger.BlockStore
|
|
|
|
// GetStateDB 查看状态数据库
|
|
func GetStateDB() {
|
|
valueNum := 0
|
|
num := 0
|
|
var maxColWidths = []int{18, 8, 12, 12, 7}
|
|
|
|
fmt.Println("------------------------------状态数据库------------------------------")
|
|
State.IterCb(func(key string, value *StateDB) {
|
|
num++
|
|
BlockNumber := value.Version.BlockNum
|
|
GroupNum := value.Version.GroupNum
|
|
TxNum := value.Version.TxNum
|
|
if config.ContractName == "SmallBank" {
|
|
val, _ := strconv.Atoi(string(value.Value))
|
|
valueNum += val
|
|
var line string
|
|
line = fmt.Sprintf("账号:%s, 余额:%s, BlockNum:%d, GroupNum:%d, TxNum:%d\n",
|
|
key, value.Value, BlockNumber, GroupNum, TxNum)
|
|
fields := strings.Fields(line)
|
|
for i, field := range fields {
|
|
// 根据最大宽度对齐字段
|
|
format := fmt.Sprintf("%%-%ds", maxColWidths[i])
|
|
fmt.Printf(format, field)
|
|
|
|
// 打印字段之间的分隔符
|
|
if i < len(fields)-1 {
|
|
fmt.Print(" | ")
|
|
}
|
|
}
|
|
fmt.Println()
|
|
} else if config.ContractName == "KvStore" {
|
|
fmt.Printf("key:%s, value:%v, BlockNum:%d, GroupNum:%d, TxNum:%d\n",
|
|
key, value.Value, BlockNumber, GroupNum, TxNum)
|
|
}
|
|
})
|
|
|
|
if config.ContractName == "SmallBank" {
|
|
fmt.Println("账号数量为:", num)
|
|
//fmt.Println("所有账户的总余额为:", valueNum)
|
|
}
|
|
}
|
|
|
|
func GetBlockchainDB() {
|
|
fmt.Println("----------------------------------------区块链账本----------------------------------------")
|
|
ito, _ := Blockchain.RetrieveBlocks(0)
|
|
for ito.Next() {
|
|
blockByte := ito.Value()
|
|
util.StringBlockByte(blockByte)
|
|
}
|
|
}
|
|
|
|
// 计算事务的总延迟时间
|
|
func GetTotalLatency() uint64 {
|
|
var totalTime uint64 = 0
|
|
TxLatency.IterCb(func(key string, t *timer) {
|
|
if t.endTime != 0 {
|
|
totalTime += t.endTime - t.startTime
|
|
}
|
|
})
|
|
return totalTime
|
|
}
|