Skip to content
Snippets Groups Projects
Commit 74a2be0e authored by Jonah Husson's avatar Jonah Husson
Browse files

Merge branch 'jonah/tm-change' into 'master'

Add new columns to db, info call to api

See merge request elixxir/mainnet-commitments!12
parents 04a1b63c 81521950
No related branches found
No related tags found
1 merge request!12Add new columns to db, info call to api
...@@ -20,7 +20,7 @@ import ( ...@@ -20,7 +20,7 @@ import (
utils2 "gitlab.com/xx_network/primitives/utils" utils2 "gitlab.com/xx_network/primitives/utils"
) )
func SignAndTransmit(keyPath, idfPath, nominatorWallet, validatorWallet, serverAddress, serverCert, contract string) error { func SignAndTransmit(keyPath, idfPath, nominatorWallet, validatorWallet, serverAddress, serverCert, contract, email string, selectedStake int) error {
var key, idfBytes []byte var key, idfBytes []byte
var err error var err error
var ep string var ep string
...@@ -51,11 +51,11 @@ func SignAndTransmit(keyPath, idfPath, nominatorWallet, validatorWallet, serverA ...@@ -51,11 +51,11 @@ func SignAndTransmit(keyPath, idfPath, nominatorWallet, validatorWallet, serverA
return errors.WithMessage(err, "Failed to write contract to hash") return errors.WithMessage(err, "Failed to write contract to hash")
} }
return signAndTransmit(key, idfBytes, h.Sum(nil), nominatorWallet, validatorWallet, serverAddress, serverCert) return signAndTransmit(key, idfBytes, h.Sum(nil), nominatorWallet, validatorWallet, serverAddress, serverCert, email, selectedStake)
} }
// SignAndTransmit creates a Client object & transmits commitment info to the server // SignAndTransmit creates a Client object & transmits commitment info to the server
func signAndTransmit(pk, idfBytes, contractBytes []byte, nominatorWallet, validatorWallet, serverAddress, serverCert string) error { func signAndTransmit(pk, idfBytes, contractBytes []byte, nominatorWallet, validatorWallet, serverAddress, serverCert, email string, selectedStake int) error {
// Create new resty client // Create new resty client
cl := resty.New() cl := resty.New()
cl.SetRootCertificateFromString(serverCert) cl.SetRootCertificateFromString(serverCert)
...@@ -82,6 +82,8 @@ func signAndTransmit(pk, idfBytes, contractBytes []byte, nominatorWallet, valida ...@@ -82,6 +82,8 @@ func signAndTransmit(pk, idfBytes, contractBytes []byte, nominatorWallet, valida
NominatorWallet: nominatorWallet, NominatorWallet: nominatorWallet,
ValidatorWallet: validatorWallet, ValidatorWallet: validatorWallet,
Signature: base64.URLEncoding.EncodeToString(sig), Signature: base64.URLEncoding.EncodeToString(sig),
Email: email,
SelectedStake: selectedStake,
} }
resp, err := cl.R(). resp, err := cl.R().
SetHeader("Content-Type", "application/json"). SetHeader("Content-Type", "application/json").
...@@ -97,3 +99,18 @@ func signAndTransmit(pk, idfBytes, contractBytes []byte, nominatorWallet, valida ...@@ -97,3 +99,18 @@ func signAndTransmit(pk, idfBytes, contractBytes []byte, nominatorWallet, valida
return nil return nil
} }
func GetInfo(nid, serverCert, serverAddress string) ([]byte, error) {
cl := resty.New()
cl.SetRootCertificateFromString(serverCert)
cl.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
resp, err := cl.R().SetQueryParam("id", nid).Get(serverAddress + "/info")
if err != nil {
return nil, errors.WithMessagef(err, "Failed to get commitment info, received response: %+v", resp)
} else if resp.IsError() {
return nil, errors.Errorf("Failed process request for commitment info, received response: %+v", resp)
}
return resp.Body(), nil
}
...@@ -28,11 +28,13 @@ import ( ...@@ -28,11 +28,13 @@ import (
) )
func TestSignAndTransmit(t *testing.T) { func TestSignAndTransmit(t *testing.T) {
pk, err := rsa.GenerateKey(csprng.NewSystemRNG(), 2048) rng := csprng.NewSystemRNG()
rng.SetSeed([]byte("start"))
pk, err := rsa.GenerateKey(rng, 2048)
if err != nil { if err != nil {
t.Errorf("Failed to gen key: %+v", err) t.Errorf("Failed to gen key: %+v", err)
} }
nid := id.NewIdFromString("zezima", id.Node, t) nid := id.NewIdFromString("jonah", id.Node, t)
idb := [33]byte{} idb := [33]byte{}
copy(idb[:], nid.Marshal()) copy(idb[:], nid.Marshal())
idFile := idf.IdFile{ idFile := idf.IdFile{
...@@ -102,7 +104,7 @@ func TestSignAndTransmit(t *testing.T) { ...@@ -102,7 +104,7 @@ func TestSignAndTransmit(t *testing.T) {
}() }()
time.Sleep(time.Millisecond * 100) time.Sleep(time.Millisecond * 100)
err = SignAndTransmit(testKeyPath, testIDFPath, waddr, waddr2, "http://localhost:11420", "", "") err = SignAndTransmit(testKeyPath, testIDFPath, waddr, waddr2, "http://localhost:11420", "", "", "", 0.0)
if err != nil { if err != nil {
t.Errorf("Failed to sign & transmit: %+v", err) t.Errorf("Failed to sign & transmit: %+v", err)
} }
...@@ -137,3 +139,11 @@ func makeCert(pk *gorsa.PrivateKey) ([]byte, error) { ...@@ -137,3 +139,11 @@ func makeCert(pk *gorsa.PrivateKey) ([]byte, error) {
} }
return pem.EncodeToMemory(block), nil return pem.EncodeToMemory(block), nil
} }
//func TestGetInfo(t *testing.T) {
// ret, err := GetInfo("\\x616263313233", "", "http://0.0.0.0:11420")
// if err != nil {
// t.Errorf("Failed to get info: %+v", err)
// }
// t.Log(string(ret))
//}
...@@ -82,7 +82,7 @@ Mu7/deeXg4hfNzQoWdZnBhzgaB05MAbJI6E= ...@@ -82,7 +82,7 @@ Mu7/deeXg4hfNzQoWdZnBhzgaB05MAbJI6E=
jww.FATAL.Fatalf("You must accept the contract to continue") jww.FATAL.Fatalf("You must accept the contract to continue")
} }
err = SignAndTransmit(keyPath, idfPath, nominatorWallet, validatorWallet, address, commitmentCert, utils.Contract) err = SignAndTransmit(keyPath, idfPath, nominatorWallet, validatorWallet, address, commitmentCert, utils.Contract, "", 1)
if err != nil { if err != nil {
jww.FATAL.Fatalf("Failed to sign & transmit commitment: %+v", err) jww.FATAL.Fatalf("Failed to sign & transmit commitment: %+v", err)
} }
......
...@@ -6,6 +6,15 @@ type Commitment struct { ...@@ -6,6 +6,15 @@ type Commitment struct {
Contract string `json:"contract"` Contract string `json:"contract"`
ValidatorWallet string `json:"validator-wallet"` ValidatorWallet string `json:"validator-wallet"`
NominatorWallet string `json:"nominator-wallet"` NominatorWallet string `json:"nominator-wallet"`
SelectedStake int `json:"selected-stake"`
Email string `json:"email"` Email string `json:"email"`
Signature string `json:"signature"` Signature string `json:"signature"`
} }
type CommitmentInfo struct {
ValidatorWallet string `json:"validator-wallet"`
NominatorWallet string `json:"nominator-wallet"`
SelectedStake int `json:"selected-stake"`
MaxStake int `json:"max-stake"`
Email string `json:"email"`
}
...@@ -75,6 +75,32 @@ func StartServer(params Params, s *storage.Storage) error { ...@@ -75,6 +75,32 @@ func StartServer(params Params, s *storage.Storage) error {
} }
c.JSON(http.StatusAccepted, newCommitment) c.JSON(http.StatusAccepted, newCommitment)
}) })
r.GET("/info", func(c *gin.Context) {
jww.DEBUG.Printf("Received info request %+v...", c.Request)
fmt.Println(c.Request.URL.Query())
nid := c.Request.URL.Query().Get("id")
if nid == "" {
jww.ERROR.Printf("No ID in received request")
wrappedErr := c.Error(errors.New("No ID in received request"))
c.JSON(http.StatusBadRequest, wrappedErr.JSON())
return
}
convertedID := "\\" + nid[1:]
commitment, err := impl.s.GetCommitment(convertedID)
if err != nil {
jww.ERROR.Printf("Failed to get commitment for nid %s: %+v", nid, err)
wrappedErr := c.Error(err)
c.JSON(http.StatusBadRequest, wrappedErr.JSON())
return
}
c.JSON(http.StatusOK, messages.CommitmentInfo{
ValidatorWallet: commitment.Wallet,
NominatorWallet: commitment.NominatorWallet,
SelectedStake: commitment.SelectedStake,
MaxStake: commitment.MaxStake,
Email: commitment.Email,
})
})
impl.comms = r impl.comms = r
// Run with TLS // Run with TLS
if params.KeyPath == "" && params.CertPath == "" { if params.KeyPath == "" && params.CertPath == "" {
...@@ -216,6 +242,12 @@ func (i *Impl) Verify(_ context.Context, msg messages.Commitment) error { ...@@ -216,6 +242,12 @@ func (i *Impl) Verify(_ context.Context, msg messages.Commitment) error {
Wallet: msg.ValidatorWallet, Wallet: msg.ValidatorWallet,
Signature: sigBytes, Signature: sigBytes,
} }
if msg.SelectedStake != 0 {
c.SelectedStake = msg.SelectedStake
}
if msg.Email != "" {
c.Email = msg.Email
}
if msg.NominatorWallet != "" { if msg.NominatorWallet != "" {
c.NominatorWallet = msg.NominatorWallet c.NominatorWallet = msg.NominatorWallet
} }
......
...@@ -22,6 +22,7 @@ type database interface { ...@@ -22,6 +22,7 @@ type database interface {
InsertCommitment(Commitment) error InsertCommitment(Commitment) error
GetMember(hexID string) (*Member, error) GetMember(hexID string) (*Member, error)
GetCommitment(id string) (*Commitment, error)
} }
// DatabaseImpl struct implements the Database Interface with an underlying DB // DatabaseImpl struct implements the Database Interface with an underlying DB
...@@ -41,6 +42,8 @@ type Commitment struct { ...@@ -41,6 +42,8 @@ type Commitment struct {
NominatorWallet string NominatorWallet string
Email string Email string
Signature []byte `gorm:"not null"` Signature []byte `gorm:"not null"`
SelectedStake int
MaxStake int `gorm:"default:137068"`
CreatedAt time.Time CreatedAt time.Time
} }
...@@ -82,8 +85,8 @@ func newDatabase(username, password, dbName, address, ...@@ -82,8 +85,8 @@ func newDatabase(username, password, dbName, address,
defer jww.INFO.Println("Map backend initialized successfully!") defer jww.INFO.Println("Map backend initialized successfully!")
mapImpl := &MapImpl{ mapImpl := &MapImpl{
members: map[string]Member{}, members: map[string]*Member{},
commitments: map[string]Commitment{}, commitments: map[string]*Commitment{},
} }
return database(mapImpl), nil return database(mapImpl), nil
......
...@@ -17,7 +17,7 @@ func (db *DatabaseImpl) InsertMembers(members []Member) error { ...@@ -17,7 +17,7 @@ func (db *DatabaseImpl) InsertMembers(members []Member) error {
} }
func (db *DatabaseImpl) InsertCommitment(commitment Commitment) error { func (db *DatabaseImpl) InsertCommitment(commitment Commitment) error {
return db.db.Clauses(clause.OnConflict{UpdateAll: true}).Create(&commitment).Error return db.db.Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "id"}}, DoUpdates: clause.AssignmentColumns([]string{"wallet", "nominator_wallet", "email", "selected_stake"})}).Create(&commitment).Error
} }
func (db *DatabaseImpl) GetMember(id string) (*Member, error) { func (db *DatabaseImpl) GetMember(id string) (*Member, error) {
...@@ -25,3 +25,9 @@ func (db *DatabaseImpl) GetMember(id string) (*Member, error) { ...@@ -25,3 +25,9 @@ func (db *DatabaseImpl) GetMember(id string) (*Member, error) {
m := Member{} m := Member{}
return &m, db.db.First(&m, "id = ?", id).Error return &m, db.db.First(&m, "id = ?", id).Error
} }
func (db *DatabaseImpl) GetCommitment(id string) (*Commitment, error) {
jww.INFO.Printf("Getting member with id %+v", id)
c := Commitment{}
return &c, db.db.First(&c, "id = ?", id).Error
}
...@@ -16,8 +16,8 @@ import ( ...@@ -16,8 +16,8 @@ import (
// MapImpl struct implements the database interface with an underlying Map // MapImpl struct implements the database interface with an underlying Map
type MapImpl struct { type MapImpl struct {
members map[string]Member members map[string]*Member
commitments map[string]Commitment commitments map[string]*Commitment
sync.RWMutex sync.RWMutex
} }
...@@ -25,7 +25,7 @@ func (db *MapImpl) InsertMembers(members []Member) error { ...@@ -25,7 +25,7 @@ func (db *MapImpl) InsertMembers(members []Member) error {
db.Lock() db.Lock()
defer db.Unlock() defer db.Unlock()
for _, m := range members { for _, m := range members {
db.members[base64.StdEncoding.EncodeToString(m.Id)] = m db.members[base64.StdEncoding.EncodeToString(m.Id)] = &m
} }
return nil return nil
} }
...@@ -33,7 +33,14 @@ func (db *MapImpl) InsertMembers(members []Member) error { ...@@ -33,7 +33,14 @@ func (db *MapImpl) InsertMembers(members []Member) error {
func (db *MapImpl) InsertCommitment(commitment Commitment) error { func (db *MapImpl) InsertCommitment(commitment Commitment) error {
db.Lock() db.Lock()
defer db.Unlock() defer db.Unlock()
db.commitments[string(commitment.Id)] = commitment if _, ok := db.commitments[string(commitment.Id)]; ok {
db.commitments[string(commitment.Id)].NominatorWallet = commitment.NominatorWallet
db.commitments[string(commitment.Id)].SelectedStake = commitment.SelectedStake
db.commitments[string(commitment.Id)].Email = commitment.Email
db.commitments[string(commitment.Id)].Wallet = commitment.Wallet
} else {
db.commitments[string(commitment.Id)] = &commitment
}
return nil return nil
} }
...@@ -51,5 +58,21 @@ func (db *MapImpl) GetMember(id string) (*Member, error) { ...@@ -51,5 +58,21 @@ func (db *MapImpl) GetMember(id string) (*Member, error) {
if !ok { if !ok {
return nil, errors.Errorf("No member in MapImpl with id %+v", id) return nil, errors.Errorf("No member in MapImpl with id %+v", id)
} }
return &m, nil return m, nil
}
func (db *MapImpl) GetCommitment(id string) (*Commitment, error) {
db.RLock()
defer db.RUnlock()
var raw = make([]byte, 33)
_, err := hex.Decode(raw, []byte(id[2:]))
if err != nil {
return nil, err
}
raw[32] = byte(02)
c, ok := db.commitments[string(raw)]
if !ok {
return nil, errors.Errorf("No commitment in MapImpl with id %+v", id)
}
return c, nil
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment