153 lines
5.1 KiB
Go
153 lines
5.1 KiB
Go
|
|
||
|
// createParameters provides functions to create network parameters
|
||
|
|
||
|
package createParameters
|
||
|
|
||
|
// We encode fields using integers to save space
|
||
|
|
||
|
// ParametersVersion = 1
|
||
|
// NetworkType = 2
|
||
|
// AdminPublicKeys = 3
|
||
|
// BroadcastTime = 4
|
||
|
// ParametersType = 5
|
||
|
|
||
|
import "seekia/internal/cryptography/blake3"
|
||
|
import "seekia/internal/cryptography/edwardsKeys"
|
||
|
import "seekia/internal/encoding"
|
||
|
import "seekia/internal/helpers"
|
||
|
import "seekia/internal/parameters/readParameters"
|
||
|
|
||
|
import "time"
|
||
|
import messagepack "github.com/vmihailenco/msgpack/v5"
|
||
|
import "errors"
|
||
|
|
||
|
//TODO: Make sure unnecessary rates are pruned
|
||
|
// For example, message cost rates for messages that are more than 2 weeks old can be pruned, if at least 2 rates exists
|
||
|
// This is because messages cannot be funded for longer than 2 weeks.
|
||
|
|
||
|
//Inputs:
|
||
|
// -map[[32]byte][64]byte: Admin key -> Admin signature
|
||
|
// -[]byte: Parameters Bytes
|
||
|
// -error
|
||
|
func CreateParameters(adminSignaturesMap map[[32]byte][64]byte, contentBytes messagepack.RawMessage)([]byte, error){
|
||
|
|
||
|
parametersContentMap := make(map[int]messagepack.RawMessage)
|
||
|
|
||
|
err := encoding.DecodeMessagePackBytes(false, contentBytes, ¶metersContentMap)
|
||
|
if (err != nil) { return nil, err }
|
||
|
|
||
|
contentHash, err := blake3.Get32ByteBlake3Hash(contentBytes)
|
||
|
if (err != nil) { return nil, err }
|
||
|
|
||
|
adminKeysListEncoded, exists := parametersContentMap[3]
|
||
|
if (exists == false){
|
||
|
return nil, errors.New("CreateParameters called with parameters missing AdminPublicKeys")
|
||
|
}
|
||
|
|
||
|
var adminKeysList [][32]byte
|
||
|
|
||
|
err = encoding.DecodeMessagePackBytes(false, adminKeysListEncoded, &adminKeysList)
|
||
|
if (err != nil) {
|
||
|
return nil, errors.New("CreateParameters called with parameters containing invalid AdminPublicKeys")
|
||
|
}
|
||
|
|
||
|
if (len(adminKeysList) != len(adminSignaturesMap)){
|
||
|
return nil, errors.New("Cannot create parameters: Admin signatures map is not the same length as adminKeysList")
|
||
|
}
|
||
|
|
||
|
signaturesList := make([][64]byte, 0, len(adminKeysList))
|
||
|
|
||
|
for _, adminPublicKey := range adminKeysList{
|
||
|
|
||
|
keySignature, exists := adminSignaturesMap[adminPublicKey]
|
||
|
if (exists == false) {
|
||
|
return nil, errors.New("Cannot create parameters: Admin signatures map missing adminPublicKey entry.")
|
||
|
}
|
||
|
|
||
|
signatureIsValid := edwardsKeys.VerifySignature(adminPublicKey, keySignature, contentHash)
|
||
|
if (signatureIsValid == false){
|
||
|
return nil, errors.New("Cannot create parameters: Invalid signature.")
|
||
|
}
|
||
|
|
||
|
signaturesList = append(signaturesList, keySignature)
|
||
|
}
|
||
|
|
||
|
signaturesListEncoded, err := encoding.EncodeMessagePackBytes(signaturesList)
|
||
|
if (err != nil){ return nil, err }
|
||
|
|
||
|
parametersSlice := []messagepack.RawMessage{signaturesListEncoded, contentBytes}
|
||
|
|
||
|
parametersBytes, err := encoding.EncodeMessagePackBytes(parametersSlice)
|
||
|
if (err != nil) { return nil, err }
|
||
|
|
||
|
isValid, err := readParameters.VerifyParameters(parametersBytes)
|
||
|
if (err != nil) { return nil, err }
|
||
|
if (isValid == false) {
|
||
|
return nil, errors.New("Cannot create parameters: Invalid result.")
|
||
|
}
|
||
|
|
||
|
return parametersBytes, nil
|
||
|
}
|
||
|
|
||
|
// This returns the content that the admin(s) are signing, encoded with messagepack
|
||
|
// We need this so the admins can share the content prior to signing it
|
||
|
// Within the gui, they should be able to copy the raw Base64 encoded bytes, share them among eachother, paste them into the GUI, and sign them
|
||
|
|
||
|
func CreateParametersContentBytes(adminPublicKeysList [][32]byte, parametersMap map[string]string)([]byte, error){
|
||
|
|
||
|
if (len(adminPublicKeysList) == 0){
|
||
|
return nil, errors.New("CreateParametersContentBytes called with empty adminPublicKeys list")
|
||
|
}
|
||
|
|
||
|
networkTypeString, exists := parametersMap["NetworkType"]
|
||
|
if (exists == false){
|
||
|
return nil, errors.New("CreateParametersContentBytes called with parametersMap missing NetworkType")
|
||
|
}
|
||
|
|
||
|
networkTypeByte, err := helpers.ConvertNetworkTypeStringToByte(networkTypeString)
|
||
|
if (err != nil){
|
||
|
return nil, errors.New("CreateParametersContentBytes called with parametersMap containing invalid NetworkType: " + networkTypeString)
|
||
|
}
|
||
|
|
||
|
parametersType, exists := parametersMap["ParametersType"]
|
||
|
if (exists == false){
|
||
|
return nil, errors.New("CreateParametersContentBytes called with parametersMap missing ParametersType")
|
||
|
}
|
||
|
|
||
|
parametersVersion := 1
|
||
|
|
||
|
broadcastTime := time.Now().Unix()
|
||
|
|
||
|
parametersVersionEncoded, err := encoding.EncodeMessagePackBytes(parametersVersion)
|
||
|
if (err != nil) { return nil, err }
|
||
|
|
||
|
networkTypeByteEncoded, err := encoding.EncodeMessagePackBytes(networkTypeByte)
|
||
|
if (err != nil) { return nil, err }
|
||
|
|
||
|
adminPublicKeysEncoded, err := encoding.EncodeMessagePackBytes(adminPublicKeysList)
|
||
|
if (err != nil) { return nil, err }
|
||
|
|
||
|
broadcastTimeEncoded, err := encoding.EncodeMessagePackBytes(broadcastTime)
|
||
|
if (err != nil) { return nil, err }
|
||
|
|
||
|
parametersTypeEncoded, err := encoding.EncodeMessagePackBytes(parametersType)
|
||
|
if (err != nil) { return nil, err }
|
||
|
|
||
|
parametersContentMap := map[int]messagepack.RawMessage{
|
||
|
1: parametersVersionEncoded,
|
||
|
2: networkTypeByteEncoded,
|
||
|
3: adminPublicKeysEncoded,
|
||
|
4: broadcastTimeEncoded,
|
||
|
5: parametersTypeEncoded,
|
||
|
}
|
||
|
|
||
|
parametersContentBytes, err := encoding.EncodeMessagePackBytes(parametersContentMap)
|
||
|
if (err != nil) { return nil, err }
|
||
|
|
||
|
return parametersContentBytes, nil
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|