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 }