fix: solana subscription jsonParsed mode, program data scheme, update miner stake in MinerBase
This commit is contained in:
parent
2551affae0
commit
d99443d9f0
@ -6,6 +6,7 @@ import (
|
|||||||
|
|
||||||
"github.com/libp2p/go-libp2p-core/peer"
|
"github.com/libp2p/go-libp2p-core/peer"
|
||||||
|
|
||||||
|
"github.com/Secured-Finance/dione/ethclient"
|
||||||
"github.com/Secured-Finance/dione/types"
|
"github.com/Secured-Finance/dione/types"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/filecoin-project/go-state-types/crypto"
|
"github.com/filecoin-project/go-state-types/crypto"
|
||||||
@ -57,6 +58,27 @@ func NewMiningBase() *MiningBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *MinerBase) UpdateStake(c *ethclient.EthereumClient, miner common.Address) error {
|
||||||
|
mStake, err := c.GetMinerStake(miner)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logrus.Warn("Can't get miner stake", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
nStake, err := c.GetTotalStake()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logrus.Warn("Can't get miner stake", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
m.MinerStake = *mStake
|
||||||
|
m.NetworkStake = *nStake
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Start, Stop mining functions
|
// Start, Stop mining functions
|
||||||
|
|
||||||
func (m *Miner) MineTask(ctx context.Context, base *MiningBase, mb *MinerBase) (*types.DioneTask, error) {
|
func (m *Miner) MineTask(ctx context.Context, base *MiningBase, mb *MinerBase) (*types.DioneTask, error) {
|
||||||
|
@ -205,25 +205,3 @@ func (c *EthereumClient) SubmitRequestAnswer(reqID *big.Int, data string, callba
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Getting total stake in DioneStaking contract, this function could
|
|
||||||
// be used for storing the total stake and veryfing the stake tokens
|
|
||||||
// on new tasks
|
|
||||||
func (c *EthereumClient) GetTotalStake() (*big.Int, error) {
|
|
||||||
totalStake, err := c.dioneStaking.TotalStake()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return totalStake, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Getting miner stake in DioneStaking contract, this function could
|
|
||||||
// be used for storing the miner's stake and veryfing the stake tokens
|
|
||||||
// on new tasks
|
|
||||||
func (c *EthereumClient) GetMinerStake(minerAddress common.Address) (*big.Int, error) {
|
|
||||||
minerStake, err := c.dioneStaking.MinerStake(minerAddress)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return minerStake, nil
|
|
||||||
}
|
|
||||||
|
36
ethclient/stake.go
Normal file
36
ethclient/stake.go
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
package ethclient
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/Secured-Finance/dione/types"
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Getting total stake in DioneStaking contract, this function could
|
||||||
|
// be used for storing the total stake and veryfing the stake tokens
|
||||||
|
// on new tasks
|
||||||
|
func (c *EthereumClient) GetTotalStake() (*types.BigInt, error) {
|
||||||
|
var b types.BigInt
|
||||||
|
totalStake, err := c.dioneStaking.TotalStake()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
b.Int = totalStake
|
||||||
|
return &b, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getting miner stake in DioneStaking contract, this function could
|
||||||
|
// be used for storing the miner's stake and veryfing the stake tokens
|
||||||
|
// on new tasks
|
||||||
|
func (c *EthereumClient) GetMinerStake(minerAddress common.Address) (*types.BigInt, error) {
|
||||||
|
var b types.BigInt
|
||||||
|
minerStake, err := c.dioneStaking.MinerStake(minerAddress)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
b.Int = minerStake
|
||||||
|
return &b, nil
|
||||||
|
}
|
1
go.sum
1
go.sum
@ -1204,6 +1204,7 @@ golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/
|
|||||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
|
golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
|
||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
|
golang.org/x/net v0.0.0-20201016165138-7b1cca2348c0 h1:5kGOVHlq0euqwzgTC9Vu15p6fV1Wi0ArVi8da2urnVg=
|
||||||
golang.org/x/net v0.0.0-20201016165138-7b1cca2348c0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201016165138-7b1cca2348c0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
11
rpc/rpc.go
11
rpc/rpc.go
@ -3,17 +3,18 @@ package rpc
|
|||||||
import "net/http"
|
import "net/http"
|
||||||
|
|
||||||
type RequestBody struct {
|
type RequestBody struct {
|
||||||
Jsonrpc string `json:"jsonrpc"`
|
Jsonrpc string `json:"jsonrpc"`
|
||||||
Method string `json:"method"`
|
Method string `json:"method"`
|
||||||
Params []string `json:"params"`
|
Params []interface{} `json:"params"`
|
||||||
ID int `json:"id"`
|
ID int `json:"id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRequestBody(method string) *RequestBody {
|
func NewRequestBody(method string) *RequestBody {
|
||||||
|
var i []interface{}
|
||||||
return &RequestBody{
|
return &RequestBody{
|
||||||
Jsonrpc: "2.0",
|
Jsonrpc: "2.0",
|
||||||
Method: method,
|
Method: method,
|
||||||
Params: []string{},
|
Params: i,
|
||||||
ID: 0,
|
ID: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/Secured-Finance/dione/rpc"
|
"github.com/Secured-Finance/dione/rpc"
|
||||||
types "github.com/Secured-Finance/dione/solana/types"
|
"github.com/Secured-Finance/dione/solana/types"
|
||||||
ws "github.com/dgrr/fastws"
|
ws "github.com/dgrr/fastws"
|
||||||
"github.com/shengdoushi/base58"
|
"github.com/shengdoushi/base58"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
@ -20,6 +20,16 @@ type SolanaClient struct {
|
|||||||
ws string
|
ws string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SubParams struct {
|
||||||
|
Encoding string `json:"encoding"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewSubParam(encoding string) *SubParams {
|
||||||
|
return &SubParams{
|
||||||
|
Encoding: encoding,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NewSolanaClient creates a new solana client structure.
|
// NewSolanaClient creates a new solana client structure.
|
||||||
func NewSolanaClient() *SolanaClient {
|
func NewSolanaClient() *SolanaClient {
|
||||||
return &SolanaClient{
|
return &SolanaClient{
|
||||||
@ -60,8 +70,10 @@ func (c *SolanaClient) subsctibeOnProgram(programID string) {
|
|||||||
|
|
||||||
requestBody := rpc.NewRequestBody("programSubscribe")
|
requestBody := rpc.NewRequestBody("programSubscribe")
|
||||||
requestBody.Params = append(requestBody.Params, programID)
|
requestBody.Params = append(requestBody.Params, programID)
|
||||||
|
p := NewSubParam("jsonParsed")
|
||||||
|
requestBody.Params = append(requestBody.Params, p)
|
||||||
body, err := json.Marshal(requestBody)
|
body, err := json.Marshal(requestBody)
|
||||||
|
logrus.Info(string(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Errorf("Couldn't unmarshal parameters to request body %v", err)
|
logrus.Errorf("Couldn't unmarshal parameters to request body %v", err)
|
||||||
}
|
}
|
||||||
@ -82,7 +94,6 @@ func (c *SolanaClient) subsctibeOnProgram(programID string) {
|
|||||||
}
|
}
|
||||||
json.Unmarshal(msg, &parsedSub)
|
json.Unmarshal(msg, &parsedSub)
|
||||||
logrus.Info("Subscription: ", parsedSub)
|
logrus.Info("Subscription: ", parsedSub)
|
||||||
// TODO: 1) Unmarshal base58 data to program structure in order to read data
|
|
||||||
// 2) Save data from oracle event in redis cache
|
// 2) Save data from oracle event in redis cache
|
||||||
// 3) Start mining of Solana oracle event
|
// 3) Start mining of Solana oracle event
|
||||||
}
|
}
|
||||||
|
42
solana/types/program.go
Normal file
42
solana/types/program.go
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
// SOLANA PROGRAM SCHEME
|
||||||
|
|
||||||
|
type Data struct {
|
||||||
|
Parsed Parsed `json:"parsed"`
|
||||||
|
Program string `json:"program"`
|
||||||
|
Space int `json:"space"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AuthorizedVoters struct {
|
||||||
|
AuthorizedVoter string `json:"authorizedVoter"`
|
||||||
|
Epoch int `json:"epoch"`
|
||||||
|
}
|
||||||
|
type EpochCredits struct {
|
||||||
|
Credits string `json:"credits"`
|
||||||
|
Epoch int `json:"epoch"`
|
||||||
|
PreviousCredits string `json:"previousCredits"`
|
||||||
|
}
|
||||||
|
type LastTimestamp struct {
|
||||||
|
Slot int `json:"slot"`
|
||||||
|
Timestamp int `json:"timestamp"`
|
||||||
|
}
|
||||||
|
type Votes struct {
|
||||||
|
ConfirmationCount int `json:"confirmationCount"`
|
||||||
|
Slot int `json:"slot"`
|
||||||
|
}
|
||||||
|
type Info struct {
|
||||||
|
AuthorizedVoters []AuthorizedVoters `json:"authorizedVoters"`
|
||||||
|
AuthorizedWithdrawer string `json:"authorizedWithdrawer"`
|
||||||
|
Commission int `json:"commission"`
|
||||||
|
EpochCredits []EpochCredits `json:"epochCredits"`
|
||||||
|
LastTimestamp LastTimestamp `json:"lastTimestamp"`
|
||||||
|
NodePubkey string `json:"nodePubkey"`
|
||||||
|
PriorVoters []interface{} `json:"priorVoters"`
|
||||||
|
RootSlot int `json:"rootSlot"`
|
||||||
|
Votes []Votes `json:"votes"`
|
||||||
|
}
|
||||||
|
type Parsed struct {
|
||||||
|
Info Info `json:"info"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
}
|
@ -26,7 +26,7 @@ type Value struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Account struct {
|
type Account struct {
|
||||||
Data string `json:"data"`
|
Data Data `json:"data"`
|
||||||
Executable bool `json:"executable"`
|
Executable bool `json:"executable"`
|
||||||
Lamports int `json:"lamports"`
|
Lamports int `json:"lamports"`
|
||||||
Owner string `json:"owner"`
|
Owner string `json:"owner"`
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package store
|
package store
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math/big"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/Secured-Finance/dione/ethclient"
|
"github.com/Secured-Finance/dione/ethclient"
|
||||||
@ -13,15 +12,15 @@ import (
|
|||||||
|
|
||||||
type DioneStakeInfo struct {
|
type DioneStakeInfo struct {
|
||||||
ID int
|
ID int
|
||||||
MinerStake *big.Int
|
MinerStake *types.BigInt
|
||||||
TotalStake *big.Int
|
TotalStake *types.BigInt
|
||||||
MinerAddress string
|
MinerAddress string
|
||||||
MinerEthWallet string
|
MinerEthWallet string
|
||||||
Timestamp time.Time
|
Timestamp time.Time
|
||||||
Ethereum *ethclient.EthereumClient
|
Ethereum *ethclient.EthereumClient
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDioneStakeInfo(minerStake, totalStake *big.Int, minerWallet, minerEthWallet string, ethereumClient *ethclient.EthereumClient) *DioneStakeInfo {
|
func NewDioneStakeInfo(minerStake, totalStake *types.BigInt, minerWallet, minerEthWallet string, ethereumClient *ethclient.EthereumClient) *DioneStakeInfo {
|
||||||
return &DioneStakeInfo{
|
return &DioneStakeInfo{
|
||||||
MinerStake: minerStake,
|
MinerStake: minerStake,
|
||||||
TotalStake: totalStake,
|
TotalStake: totalStake,
|
||||||
@ -89,8 +88,8 @@ func (s *Store) GetLastStakeInfo(wallet, ethWallet string) (*DioneStakeInfo, err
|
|||||||
func (s *DioneStakeInfo) Validate() error {
|
func (s *DioneStakeInfo) Validate() error {
|
||||||
return validation.ValidateStruct(
|
return validation.ValidateStruct(
|
||||||
s,
|
s,
|
||||||
validation.Field(&s.MinerStake, validation.Required, validation.By(types.ValidateBigInt(s.MinerStake))),
|
validation.Field(&s.MinerStake, validation.Required, validation.By(types.ValidateBigInt(s.MinerStake.Int))),
|
||||||
validation.Field(&s.TotalStake, validation.Required, validation.By(types.ValidateBigInt(s.TotalStake))),
|
validation.Field(&s.TotalStake, validation.Required, validation.By(types.ValidateBigInt(s.TotalStake.Int))),
|
||||||
validation.Field(&s.MinerAddress, validation.Required),
|
validation.Field(&s.MinerAddress, validation.Required),
|
||||||
validation.Field(&s.MinerEthWallet, validation.Required),
|
validation.Field(&s.MinerEthWallet, validation.Required),
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user