consensus/monero/address/packed.go
DataHoarder 03f19ae2ed
Some checks are pending
continuous-integration/drone/push Build is running
Improve base58 encode/decode and PackedAddress storage
2023-07-23 01:02:43 +02:00

91 lines
2.5 KiB
Go

package address
import (
"git.gammaspectra.live/P2Pool/moneroutil"
"git.gammaspectra.live/P2Pool/p2pool-observer/monero/crypto"
"unsafe"
)
const PackedAddressSpend = 0
const PackedAddressView = 1
// PackedAddress 0 = spend, 1 = view
type PackedAddress [2]crypto.PublicKeyBytes
func NewPackedAddressFromBytes(spend, view crypto.PublicKeyBytes) (result PackedAddress) {
copy(result[PackedAddressSpend][:], spend[:])
copy(result[PackedAddressView][:], view[:])
return
}
func NewPackedAddress(spend, view crypto.PublicKey) (result PackedAddress) {
return NewPackedAddressFromBytes(spend.AsBytes(), view.AsBytes())
}
func (p *PackedAddress) PublicKeys() (spend, view crypto.PublicKey) {
return &(*p)[PackedAddressSpend], &(*p)[PackedAddressView]
}
func (p *PackedAddress) SpendPublicKey() *crypto.PublicKeyBytes {
return &(*p)[PackedAddressSpend]
}
func (p *PackedAddress) ViewPublicKey() *crypto.PublicKeyBytes {
return &(*p)[PackedAddressView]
}
func (p *PackedAddress) ToPackedAddress() PackedAddress {
return *p
}
// Compare special consensus comparison
func (p *PackedAddress) Compare(b Interface) int {
//compare spend key
resultSpendKey := crypto.CompareConsensusPublicKeyBytes(&p[PackedAddressSpend], b.SpendPublicKey())
if resultSpendKey != 0 {
return resultSpendKey
}
// compare view key
return crypto.CompareConsensusPublicKeyBytes(&p[PackedAddressView], b.ViewPublicKey())
}
func (p PackedAddress) ComparePacked(other *PackedAddress) int {
//compare spend key
resultSpendKey := crypto.CompareConsensusPublicKeyBytes(&p[PackedAddressSpend], &other[PackedAddressSpend])
if resultSpendKey != 0 {
return resultSpendKey
}
// compare view key
return crypto.CompareConsensusPublicKeyBytes(&p[PackedAddressView], &other[PackedAddressView])
}
func (p *PackedAddress) ToAddress(network uint8, err ...error) *Address {
if len(err) > 0 && err[0] != nil {
return nil
}
return FromRawAddress(network, p.SpendPublicKey(), p.ViewPublicKey())
}
func (p PackedAddress) ToBase58(network uint8, err ...error) []byte {
var nice [69]byte
nice[0] = network
copy(nice[1:], p[PackedAddressSpend][:])
copy(nice[1+crypto.PublicKeySize:], p[PackedAddressView][:])
sum := crypto.PooledKeccak256(nice[:65])
buf := make([]byte, 0, 95)
return moneroutil.EncodeMoneroBase58PreAllocated(buf, []byte{network}, p[PackedAddressSpend][:], p[PackedAddressView][:], sum[:4])
}
func (p PackedAddress) Reference() *PackedAddress {
return &p
}
func (p PackedAddress) Bytes() []byte {
return (*[crypto.PublicKeySize * 2]byte)(unsafe.Pointer(&p))[:]
}