gpt4 book ai didi

go - 压缩存储在 big.Int 中的余额的最佳方法是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 03:32:50 26 4
gpt4 key购买 nike

我需要将以太坊(加密货币)余额导出到 Postgres,但我需要将它们压缩成一个 blob,因为它们太多了,我必须为每个 block 存储状态。余额存储在 big.Int 中,但大多数帐户的余额为 0(或非常接近于 0),所以我想到了这种压缩算法:

Format (single record): 
8bits: the length of the bit string
following bits : the actual big.Int converted into bits with Int.Bits() function

余额以 1/10^18 的精度存储,因此 1 个以太币存储为 1 位和 18 个零。我的算法是最好的压缩方法吗?或者有更好的主意吗?

例如,另一个想法是选择一个 float64 ,但我不确定它是否可以容纳所有值范围。 1 以太币是 1 和 18 个零,但加密货币交易所可能有数百万以太币的余额,因此最大值是 1 和大约 25 个零。或者我可以在最坏的情况下选择 float128。

你有什么建议?

最佳答案

为了最大压缩,使用Bytes()(返回[]byte),而不是Bits()(返回[]单位)。例如,一个零余额,一个公共(public)值,是一个字节的 blob。此外,允许负余额。例如,

package main

import (
"fmt"
"math/big"
)

func CompressBalance(i *big.Int) []byte {
if i == nil {
return nil
}
if i.BitLen() == 0 {
return []byte{0}
}
byts := i.Bytes()
if len(byts) > 0x7F {
return nil
}
blob := make([]byte, 1+len(byts))
blob[0] = byte(len(byts))
blob[0] |= byte(i.Sign()) & 0x80
copy(blob[1:], byts)
return blob
}

func DecompressBalance(b []byte) *big.Int {
if len(b) <= 0 {
return nil
}
if 1+int(b[0]&0x7F) != len(b) {
return nil
}
i := new(big.Int)
if b[0] == 0 {
return i
}
i.SetBytes(b[1:])
if b[0]&0x80 == 0x80 {
i.Neg(i)
}
return i
}

func main() {
tests := []string{
"0",
"1925000288124900513257758", // 1,925,000.288124900513257758
"-1925000288124900513257758", // -1,925,000.288124900513257758
}
for _, s := range tests {
i := new(big.Int)
i, ok := i.SetString(s, 10)
if !ok {
fmt.Println("error:", i, ok)
}
blob := CompressBalance(i)
j := DecompressBalance(blob)
fmt.Printf("i: %s\nj: %s\nblob: %d %v\n", i, j, len(blob), blob)
}
}

Playground :https://play.golang.org/p/zClfVxG6agL

输出:

i: 0
j: 0
blob: 1 [0]
i: 1925000288124900513257758
j: 1925000288124900513257758
blob: 12 [11 1 151 162 121 135 80 245 19 41 153 30]
i: -1925000288124900513257758
j: -1925000288124900513257758
blob: 12 [139 1 151 162 121 135 80 245 19 41 153 30]

金融交易需要准确的数字。按照设计, float 是一个近似值。

关于go - 压缩存储在 big.Int 中的余额的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48697055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com