Remove moneroutil dependency, replace base58 encoding with git.gammaspectra.live/P2Pool/monero-base58

This commit is contained in:
DataHoarder 2024-04-07 19:15:00 +02:00
parent 7d6af59d07
commit c999597d5e
Signed by: DataHoarder
SSH key fingerprint: SHA256:OLTRf6Fl87G52SiR7sWLGNzlJt4WOX+tfI2yxo0z7xk
10 changed files with 109 additions and 46 deletions

2
go.mod
View file

@ -6,7 +6,7 @@ require (
git.gammaspectra.live/P2Pool/edwards25519 v0.0.0-20240405085108-e2f706cb5c00
git.gammaspectra.live/P2Pool/go-monero v0.0.0-20230410011208-910450c4a523
git.gammaspectra.live/P2Pool/go-randomx v0.0.0-20221027085532-f46adfce03a7
git.gammaspectra.live/P2Pool/moneroutil v0.0.0-20230722215223-18ecc51ae61e
git.gammaspectra.live/P2Pool/monero-base58 v1.0.0
git.gammaspectra.live/P2Pool/randomx-go-bindings v0.0.0-20230514082649-9c5f18cd5a71
git.gammaspectra.live/P2Pool/sha3 v0.17.0
github.com/dolthub/swiss v0.2.2-0.20240312182618-f4b2babd2bc1

4
go.sum
View file

@ -4,8 +4,8 @@ git.gammaspectra.live/P2Pool/go-monero v0.0.0-20230410011208-910450c4a523 h1:oIJ
git.gammaspectra.live/P2Pool/go-monero v0.0.0-20230410011208-910450c4a523/go.mod h1:TAOAAV972JNDkCzyV5SkbYkKCRvcfhvvFa8LHH4Dg6g=
git.gammaspectra.live/P2Pool/go-randomx v0.0.0-20221027085532-f46adfce03a7 h1:bzHDuu1IgETKqPBOlIdCE2LaZIJ+ZpROSprNn+fnzd8=
git.gammaspectra.live/P2Pool/go-randomx v0.0.0-20221027085532-f46adfce03a7/go.mod h1:3kT0v4AMwT/OdorfH2gRWPwoOrUX/LV03HEeBsaXG1c=
git.gammaspectra.live/P2Pool/moneroutil v0.0.0-20230722215223-18ecc51ae61e h1:ropqS9niQR/ZKCUrlmWe+uDH0fLIyAnCIjkEjyTDgA8=
git.gammaspectra.live/P2Pool/moneroutil v0.0.0-20230722215223-18ecc51ae61e/go.mod h1:Wn5QI7XIMHMpEu10pPspW9h3eGmXQPJwh/4/+Gi3G1U=
git.gammaspectra.live/P2Pool/monero-base58 v1.0.0 h1:s8LZxVNc93YEs2NCCNWZ7CKr8RbEb031y6Wkvhn+TS4=
git.gammaspectra.live/P2Pool/monero-base58 v1.0.0/go.mod h1:WWEJy/AdWKxKAruvlKI82brw+DtVlePy0ct3ZiBlc68=
git.gammaspectra.live/P2Pool/randomx-go-bindings v0.0.0-20230514082649-9c5f18cd5a71 h1:MgeHHcF+GnCJBWMSzq8XAbc8p/UhNwFruEKCPPJ74YQ=
git.gammaspectra.live/P2Pool/randomx-go-bindings v0.0.0-20230514082649-9c5f18cd5a71/go.mod h1:KQaYHIxGXNHNMQELC7xGLu8xouwvP/dN7iGk681BXmk=
git.gammaspectra.live/P2Pool/sha3 v0.17.0 h1:CZpB466LPbNVQrUNjQTtQScGDc30xSMkZ6Bmw0W9VuM=

View file

@ -3,8 +3,9 @@ package address
import (
"bytes"
"errors"
"git.gammaspectra.live/P2Pool/consensus/v3/monero"
"git.gammaspectra.live/P2Pool/consensus/v3/monero/crypto"
"git.gammaspectra.live/P2Pool/moneroutil"
base58 "git.gammaspectra.live/P2Pool/monero-base58"
"slices"
)
@ -13,9 +14,13 @@ type Address struct {
ViewPub crypto.PublicKeyBytes
Network uint8
hasChecksum bool
checksum moneroutil.Checksum
checksum Checksum
}
const ChecksumLength = 4
type Checksum [ChecksumLength]byte
func (a *Address) Compare(b Interface) int {
//compare spend key
@ -53,31 +58,32 @@ func (a *Address) ToPackedAddress() PackedAddress {
func FromBase58(address string) *Address {
preAllocatedBuf := make([]byte, 0, 69)
raw := moneroutil.DecodeMoneroBase58PreAllocated(preAllocatedBuf, []byte(address))
raw := base58.DecodeMoneroBase58PreAllocated(preAllocatedBuf, []byte(address))
if len(raw) != 69 {
return nil
}
switch raw[0] {
case moneroutil.MainNetwork, moneroutil.TestNetwork, moneroutil.StageNetwork:
case monero.MainNetwork, monero.TestNetwork, monero.StageNetwork:
break
case moneroutil.IntegratedMainNetwork, moneroutil.IntegratedTestNetwork, moneroutil.IntegratedStageNetwork:
case monero.IntegratedMainNetwork, monero.IntegratedTestNetwork, monero.IntegratedStageNetwork:
return nil
case moneroutil.SubAddressMainNetwork, moneroutil.SubAddressTestNetwork, moneroutil.SubAddressStageNetwork:
case monero.SubAddressMainNetwork, monero.SubAddressTestNetwork, monero.SubAddressStageNetwork:
return nil
default:
return nil
}
checksum := moneroutil.GetChecksum(raw[:65])
if bytes.Compare(checksum[:], raw[65:]) != 0 {
return nil
}
checksum := crypto.PooledKeccak256(raw[:65])
a := &Address{
Network: raw[0],
checksum: checksum,
hasChecksum: true,
Network: raw[0],
}
copy(a.checksum[:], checksum[:ChecksumLength])
a.hasChecksum = true
if bytes.Compare(a.checksum[:], raw[65:]) != 0 {
return nil
}
copy(a.SpendPub[:], raw[1:33])
@ -88,18 +94,18 @@ func FromBase58(address string) *Address {
func FromBase58NoChecksumCheck(address []byte) *Address {
preAllocatedBuf := make([]byte, 0, 69)
raw := moneroutil.DecodeMoneroBase58PreAllocated(preAllocatedBuf, address)
raw := base58.DecodeMoneroBase58PreAllocated(preAllocatedBuf, address)
if len(raw) != 69 {
return nil
}
switch raw[0] {
case moneroutil.MainNetwork, moneroutil.TestNetwork, moneroutil.StageNetwork:
case monero.MainNetwork, monero.TestNetwork, monero.StageNetwork:
break
case moneroutil.IntegratedMainNetwork, moneroutil.IntegratedTestNetwork, moneroutil.IntegratedStageNetwork:
case monero.IntegratedMainNetwork, monero.IntegratedTestNetwork, monero.IntegratedStageNetwork:
return nil
case moneroutil.SubAddressMainNetwork, moneroutil.SubAddressTestNetwork, moneroutil.SubAddressStageNetwork:
case monero.SubAddressMainNetwork, monero.SubAddressTestNetwork, monero.SubAddressStageNetwork:
return nil
default:
return nil
@ -128,7 +134,7 @@ func FromRawAddress(network uint8, spend, view crypto.PublicKey) *Address {
a := &Address{
Network: nice[0],
}
copy(a.checksum[:], checksum[:4])
copy(a.checksum[:], checksum[:ChecksumLength])
a.hasChecksum = true
a.SpendPub = spend.AsBytes()
@ -145,7 +151,7 @@ func (a *Address) verifyChecksum() {
copy(nice[1+crypto.PublicKeySize:], a.ViewPub.AsSlice())
sum := crypto.PooledKeccak256(nice[:65])
//this race is ok
copy(a.checksum[:], sum[:4])
copy(a.checksum[:], sum[:ChecksumLength])
a.hasChecksum = true
}
}
@ -153,14 +159,14 @@ func (a *Address) verifyChecksum() {
func (a *Address) ToBase58() []byte {
a.verifyChecksum()
buf := make([]byte, 0, 95)
return moneroutil.EncodeMoneroBase58PreAllocated(buf, []byte{a.Network}, a.SpendPub.AsSlice(), a.ViewPub.AsSlice(), a.checksum[:])
return base58.EncodeMoneroBase58PreAllocated(buf, []byte{a.Network}, a.SpendPub.AsSlice(), a.ViewPub.AsSlice(), a.checksum[:])
}
func (a *Address) MarshalJSON() ([]byte, error) {
a.verifyChecksum()
buf := make([]byte, 95+2)
buf[0] = '"'
moneroutil.EncodeMoneroBase58PreAllocated(buf[1:1], []byte{a.Network}, a.SpendPub.AsSlice(), a.ViewPub.AsSlice(), a.checksum[:])
base58.EncodeMoneroBase58PreAllocated(buf[1:1], []byte{a.Network}, a.SpendPub.AsSlice(), a.ViewPub.AsSlice(), a.checksum[:])
buf[len(buf)-1] = '"'
return buf, nil
}

View file

@ -6,7 +6,7 @@ import (
p2poolcrypto "git.gammaspectra.live/P2Pool/consensus/v3/p2pool/crypto"
"git.gammaspectra.live/P2Pool/consensus/v3/types"
"git.gammaspectra.live/P2Pool/edwards25519"
"git.gammaspectra.live/P2Pool/moneroutil"
base58 "git.gammaspectra.live/P2Pool/monero-base58"
"git.gammaspectra.live/P2Pool/sha3"
"strings"
)
@ -87,7 +87,7 @@ func GetTxProofV2(a Interface, txId types.Hash, txKey crypto.PrivateKey, message
sharedSecret, signature := crypto.GenerateTxProofV2(prefixHash, txKey, a.ViewPublicKey(), nil)
return "OutProofV2" + string(moneroutil.EncodeMoneroBase58(sharedSecret.AsSlice())) + string(moneroutil.EncodeMoneroBase58(signature.Bytes()))
return "OutProofV2" + string(base58.EncodeMoneroBase58(sharedSecret.AsSlice())) + string(base58.EncodeMoneroBase58(signature.Bytes()))
}
func GetTxProofV1(a Interface, txId types.Hash, txKey crypto.PrivateKey, message string) string {
@ -95,7 +95,7 @@ func GetTxProofV1(a Interface, txId types.Hash, txKey crypto.PrivateKey, message
sharedSecret, signature := crypto.GenerateTxProofV1(prefixHash, txKey, a.ViewPublicKey(), nil)
return "OutProofV1" + string(moneroutil.EncodeMoneroBase58(sharedSecret.AsSlice())) + string(moneroutil.EncodeMoneroBase58(signature.Bytes()))
return "OutProofV1" + string(base58.EncodeMoneroBase58(sharedSecret.AsSlice())) + string(base58.EncodeMoneroBase58(signature.Bytes()))
}
type SignatureVerifyResult int
@ -131,7 +131,7 @@ func VerifyMessage(a Interface, message []byte, signature string) SignatureVerif
} else {
return ResultFail
}
raw := moneroutil.DecodeMoneroBase58([]byte(signature[5:]))
raw := base58.DecodeMoneroBase58([]byte(signature[5:]))
sig := crypto.NewSignatureFromBytes(raw)
@ -170,7 +170,7 @@ func VerifyMessageFallbackToZero(a Interface, message []byte, signature string)
} else {
return ResultFail
}
raw := moneroutil.DecodeMoneroBase58([]byte(signature[5:]))
raw := base58.DecodeMoneroBase58([]byte(signature[5:]))
sig := crypto.NewSignatureFromBytes(raw)

View file

@ -2,7 +2,7 @@ package address
import (
"git.gammaspectra.live/P2Pool/consensus/v3/monero/crypto"
"git.gammaspectra.live/P2Pool/moneroutil"
base58 "git.gammaspectra.live/P2Pool/monero-base58"
"unsafe"
)
@ -78,7 +78,7 @@ func (p PackedAddress) ToBase58(network uint8, err ...error) []byte {
sum := crypto.PooledKeccak256(nice[:65])
buf := make([]byte, 0, 95)
return moneroutil.EncodeMoneroBase58PreAllocated(buf, []byte{network}, p[PackedAddressSpend][:], p[PackedAddressView][:], sum[:4])
return base58.EncodeMoneroBase58PreAllocated(buf, []byte{network}, p[PackedAddressSpend][:], p[PackedAddressView][:], sum[:4])
}
func (p PackedAddress) Reference() *PackedAddress {

View file

@ -15,3 +15,17 @@ const (
RequiredMoneroVersion = (RequiredMajor << 16) | RequiredMinor
RequiredMoneroString = "v0.18.0.0"
)
const (
MainNetwork = 18
TestNetwork = 53
StageNetwork = 24
SubAddressMainNetwork = 42
SubAddressTestNetwork = 63
SubAddressStageNetwork = 36
IntegratedMainNetwork = 19
IntegratedTestNetwork = 54
IntegratedStageNetwork = 25
)

View file

@ -53,6 +53,8 @@ func GetDerivationSharedDataAndViewTagForOutputIndexNoAllocate(k PublicKeyBytes,
return c, h[0]
}
/* TODO: wait for HashToPoint in edwards25519
func GetKeyImage(pair *KeyPair) PublicKey {
return PublicKeyFromPoint(HashToPoint(pair.PublicKey)).Multiply(pair.PrivateKey.AsScalar())
}
*/

View file

@ -1,11 +1,6 @@
package crypto
import (
"git.gammaspectra.live/P2Pool/edwards25519"
fasthex "github.com/tmthrgd/go-hex"
"testing"
)
/* TODO: wait for HashToPoint in edwards25519
func TestKeyImageRaw(t *testing.T) {
sec, _ := fasthex.DecodeString("981d477fb18897fa1f784c89721a9d600bf283f06b89cb018a077f41dcefef0f")
@ -16,3 +11,4 @@ func TestKeyImageRaw(t *testing.T) {
t.Fatalf("key image expected %s, got %s", "a637203ec41eab772532d30420eac80612fce8e44f1758bc7e2cb1bdda815887", keyImage.String())
}
}
*/

View file

@ -3,7 +3,6 @@ package crypto
import (
"git.gammaspectra.live/P2Pool/consensus/v3/types"
"git.gammaspectra.live/P2Pool/edwards25519"
"git.gammaspectra.live/P2Pool/moneroutil"
"git.gammaspectra.live/P2Pool/sha3"
)
@ -66,11 +65,58 @@ func HashFastSum(hash *sha3.HasherState, b []byte) []byte {
return b
}
/* TODO: wait for HashToPoint in edwards25519
// HashToPoint Equivalent of Monero's HashToEC
func HashToPointOld(publicKey PublicKey) *edwards25519.Point {
p := moneroutil.Key(publicKey.AsBytes())
var key moneroutil.Key
result := new(moneroutil.ExtendedGroupElement)
var p1 moneroutil.ProjectiveGroupElement
var p2 moneroutil.CompletedGroupElement
h := moneroutil.Key(Keccak256(p[:]))
log.Printf("old %s", hex.EncodeToString(h[:]))
p1.FromBytes(&h)
p1.ToBytes(&key)
log.Printf("old t %s", hex.EncodeToString(key[:]))
moneroutil.GeMul8(&p2, &p1)
p2.ToExtended(result)
result.ToBytes(&key)
log.Printf("old c %s", hex.EncodeToString(key[:]))
out, _ := GetEdwards25519Point().SetBytes(key[:])
return out
}
var cofactor = new(field.Element).Mult32(new(field.Element).One(), 8)
// HashToPoint Equivalent of Monero's HashToEC
func HashToPoint(publicKey PublicKey) *edwards25519.Point {
//TODO: make this work with existing edwards25519 library
input := moneroutil.Key(publicKey.AsBytes())
var key moneroutil.Key
(&input).HashToEC().ToBytes(&key)
p, _ := GetEdwards25519Point().SetBytes(key[:])
h := Keccak256Single(publicKey.AsSlice())
log.Printf("new %s", hex.EncodeToString(h[:]))
e, err := new(field.Element).SetBytes(h[:])
if err != nil {
panic("hash to point failed")
}
log.Printf("new t %s", hex.EncodeToString(e.Bytes()))
e.Multiply(cofactor, e)
log.Printf("new c %s", hex.EncodeToString(e.Bytes()))
p, _ := GetEdwards25519Point().SetBytes(e.Bytes())
return p
var p1 edwards25519.Point
p1.MultByCofactor(&p1)
return p
}
*/

View file

@ -8,7 +8,6 @@ import (
"git.gammaspectra.live/P2Pool/consensus/v3/monero/randomx"
"git.gammaspectra.live/P2Pool/consensus/v3/types"
"git.gammaspectra.live/P2Pool/consensus/v3/utils"
"git.gammaspectra.live/P2Pool/moneroutil"
"strconv"
)
@ -48,11 +47,11 @@ func (n NetworkType) AddressNetwork() (uint8, error) {
case NetworkInvalid:
return 0, errors.New("invalid network")
case NetworkMainnet:
return moneroutil.MainNetwork, nil
return monero.MainNetwork, nil
case NetworkTestnet:
return moneroutil.TestNetwork, nil
return monero.TestNetwork, nil
case NetworkStagenet:
return moneroutil.StageNetwork, nil
return monero.StageNetwork, nil
}
return 0, errors.New("unknown network")
}