Merge branch 'master' into add-header

Former-commit-id: b6291004938d0f49089e596156564ab3a7d096a9 [formerly d2fee7edb819cbe0ad847647a31af8f4fe8da208]
Former-commit-id: 9d062b79f83e3cdbb6eac9ccbf2fa55ce05b17a3
This commit is contained in:
Terence Tsao 2018-05-02 13:10:40 -07:00
commit 86820bbe13
5 changed files with 51 additions and 47 deletions

View File

@ -1,6 +1,6 @@
// Package client provides an interface for interacting with a running ethereum full node. // Package client provides an interface for interacting with a running ethereum full node.
// As part of the initial phases of sharding, actors will need access to the sharding management // As part of the initial phases of sharding, actors will need access to the sharding management
// contract on the main PoW chain. // contract on the main PoW chain
package client package client
import ( import (
@ -33,8 +33,7 @@ const (
clientIdentifier = "geth" // Used to determine the ipc name. clientIdentifier = "geth" // Used to determine the ipc name.
) )
// General client for Notary/Proposer. Communicates to Geth node via JSON RPC. // General client for Notary/Proposer - Communicates to Geth node via JSON RPC
type shardingClient struct { type shardingClient struct {
endpoint string // Endpoint to JSON RPC endpoint string // Endpoint to JSON RPC
client *ethclient.Client // Ethereum RPC client. client *ethclient.Client // Ethereum RPC client.
@ -44,6 +43,7 @@ type shardingClient struct {
rpcClient *rpc.Client // The RPC client connection to the main geth node rpcClient *rpc.Client // The RPC client connection to the main geth node
} }
// Client methods that must be implemented to run a sharded system
type Client interface { type Client interface {
Start() error Start() error
Close() Close()
@ -54,7 +54,8 @@ type Client interface {
SMCTransactor() *contracts.SMCTransactor SMCTransactor() *contracts.SMCTransactor
} }
func NewClient(ctx *cli.Context) *shardingClient { // NewClient forms a new struct instance
func NewClient(ctx *cli.Context) Client {
path := node.DefaultDataDir() path := node.DefaultDataDir()
if ctx.GlobalIsSet(utils.DataDirFlag.Name) { if ctx.GlobalIsSet(utils.DataDirFlag.Name) {
path = ctx.GlobalString(utils.DataDirFlag.Name) path = ctx.GlobalString(utils.DataDirFlag.Name)
@ -85,9 +86,9 @@ func NewClient(ctx *cli.Context) *shardingClient {
} }
} }
// Start the sharding client. // Start the sharding client
// * Connects to Geth node. // Connects to Geth node
// * Verifies or deploys the sharding manager contract. // Verifies or deploys the sharding manager contract
func (c *shardingClient) Start() error { func (c *shardingClient) Start() error {
rpcClient, err := dialRPC(c.endpoint) rpcClient, err := dialRPC(c.endpoint)
if err != nil { if err != nil {
@ -184,6 +185,7 @@ func (c *shardingClient) SMCCaller() *contracts.SMCCaller {
return &c.smc.SMCCaller return &c.smc.SMCCaller
} }
// SMCTransactor allows us to send tx's to the SMC programmatically
func (c *shardingClient) SMCTransactor() *contracts.SMCTransactor { func (c *shardingClient) SMCTransactor() *contracts.SMCTransactor {
return &c.smc.SMCTransactor return &c.smc.SMCTransactor
} }

View File

@ -1,18 +1,19 @@
package sharding package sharding
import ( import (
"math"
"math/big" "math/big"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
) )
// Collation base struct
type Collation struct { type Collation struct {
header *CollationHeader header *CollationHeader
transactions []*types.Transaction transactions []*types.Transaction
} }
// CollationHeader base struct
type CollationHeader struct { type CollationHeader struct {
shardID *big.Int //the shard ID of the shard shardID *big.Int //the shard ID of the shard
chunkRoot *common.Hash //the root of the chunk tree which identifies collation body chunkRoot *common.Hash //the root of the chunk tree which identifies collation body
@ -21,27 +22,26 @@ type CollationHeader struct {
proposerSignature []byte //the proposer's signature for calculating collation hash proposerSignature []byte //the proposer's signature for calculating collation hash
} }
func (c *Collation) Header() *CollationHeader { return c.header } // Header returns the collation's header
func (c *Collation) Transactions() []*types.Transaction { return c.transactions } func (c *Collation) Header() *CollationHeader { return c.header }
func (c *Collation) ShardID() *big.Int { return c.header.shardID }
func (c *Collation) Period() *big.Int { return c.header.period }
func (c *Collation) ProposerAddress() *common.Address { return c.header.proposerAddress }
// Transactions returns an array of tx's in the collation
func (c *Collation) Transactions() []*types.Transaction { return c.transactions }
// ShardID is the identifier for a shard
func (c *Collation) ShardID() *big.Int { return c.header.shardID }
// Period the collation corresponds to
func (c *Collation) Period() *big.Int { return c.header.period }
// ProposerAddress is the coinbase addr of the creator for the collation
func (c *Collation) ProposerAddress() *common.Address { return c.header.proposerAddress }
// SetHeader updates the collation's header
func (c *Collation) SetHeader(h *CollationHeader) { c.header = h } func (c *Collation) SetHeader(h *CollationHeader) { c.header = h }
// AddTransaction adds to the collation's body of tx blobs
func (c *Collation) AddTransaction(tx *types.Transaction) { func (c *Collation) AddTransaction(tx *types.Transaction) {
// TODO: Check transaction does not exceed gas limit // TODO: Include blob serialization instead
c.transactions = append(c.transactions, tx) c.transactions = append(c.transactions, tx)
} }
func (c *Collation) GasUsed() *big.Int {
g := uint64(0)
for _, tx := range c.transactions {
if g > math.MaxUint64-(g+tx.Gas()) {
g = math.MaxUint64
break
}
g += tx.Gas()
}
return big.NewInt(0).SetUint64(g)
}

View File

@ -7,32 +7,33 @@ import (
) )
var ( var (
// Number of network shards // ShardCount is the number of network shards
ShardCount = int64(100) ShardCount = int64(100)
// Address of the sharding manager contract // ShardingManagerAddress is the address of the sharding manager contract
ShardingManagerAddress = common.HexToAddress("0x0") // TODO ShardingManagerAddress = common.HexToAddress("0x0") // TODO
// Gas limit for verifying signatures // SigGasLimit for verifying signatures
SigGasLimit = 40000 SigGasLimit = 40000
// Number of blocks in a period // PeriodLength is num of blocks in period
PeriodLength = int64(5) PeriodLength = int64(5)
// Number of periods ahead of current period which the contract is able to return the notary of that period. // LookaheadPeriods is the umber of periods ahead of current period
// which the contract is able to return the notary of that period
LookaheadPeriods = 4 LookaheadPeriods = 4
// Required deposit size in wei for notary // NotaryDeposit is a required deposit size in wei
NotaryDeposit = new(big.Int).Exp(big.NewInt(10), big.NewInt(21), nil) // 1000 ETH NotaryDeposit = new(big.Int).Exp(big.NewInt(10), big.NewInt(21), nil) // 1000 ETH
// Required deposit size in wei for proposer // ProposerDeposit is a required deposit size in wei
ProposerDeposit = new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil) // 1 ETH ProposerDeposit = new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil) // 1 ETH
// Minimum Balance of proposer where bids are deducted // MinProposerBalance of proposer where bids are deducted
MinProposerBalance = new(big.Int).Exp(big.NewInt(10), big.NewInt(17), nil) // 0.1 ETH MinProposerBalance = new(big.Int).Exp(big.NewInt(10), big.NewInt(17), nil) // 0.1 ETH
// Gas limit to create contract // ContractGasLimit to create contract
ContractGasLimit = uint64(4700000) // Max is 4712388 ContractGasLimit = uint64(4700000) // Max is 4712388
// Number of periods to lockup notary deposit from time of deregistration // NotaryLockupLength to lockup notary deposit from time of deregistration
NotaryLockupLength = int64(16128) NotaryLockupLength = int64(16128)
// Number of periods to lockup proposer deposit from time of deregistration // ProposerLockupLength to lockup proposer deposit from time of deregistration
ProposerLockupLength = int64(48) ProposerLockupLength = int64(48)
// Number of ETH awarded to notary after collation included in canonical chain // NotarySubsidy is ETH awarded to notary after collation included in canonical chain
NotarySubsidy = new(big.Int).Exp(big.NewInt(10), big.NewInt(15), nil) // 0.001 ETH NotarySubsidy = new(big.Int).Exp(big.NewInt(10), big.NewInt(15), nil) // 0.001 ETH
// Number of notaries sampled per block from the notaries pool per period per shard // NotaryCommitSize sampled per block from the notaries pool per period per shard
NotaryCommitSize = int64(135) NotaryCommitSize = int64(135)
// Number of notary votes the collation needs to get accepted to the canonical chain // NotaryQuorumSize votes the collation needs to get accepted to the canonical chain
NotaryQuorumSize = int64(90) NotaryQuorumSize = int64(90)
) )

View File

@ -1,4 +1,3 @@
// Package notary holds all of the functionality to run as a notary in a sharded system.
package notary package notary
import ( import (
@ -7,9 +6,9 @@ import (
cli "gopkg.in/urfave/cli.v1" cli "gopkg.in/urfave/cli.v1"
) )
// Notary runnable client. // Notary runnable client
type Notary interface { type Notary interface {
// Start the main routine for a notary. // Start the main routine for a notary
Start() error Start() error
} }
@ -17,14 +16,14 @@ type notary struct {
client client.Client client client.Client
} }
// NewNotary creates a new notary instance. // NewNotary creates a new notary instance
func NewNotary(ctx *cli.Context) Notary { func NewNotary(ctx *cli.Context) Notary {
return &notary{ return &notary{
client: client.NewClient(ctx), client: client.NewClient(ctx),
} }
} }
// Start the main routine for a notary. // Start the main routine for a notary
func (c *notary) Start() error { func (c *notary) Start() error {
log.Info("Starting notary client") log.Info("Starting notary client")
err := c.client.Start() err := c.client.Start()

View File

@ -1,5 +1,3 @@
// Package proposer holds all of the functionality to run as a collation proposer in a sharded
// system.
package proposer package proposer
import ( import (
@ -8,6 +6,8 @@ import (
cli "gopkg.in/urfave/cli.v1" cli "gopkg.in/urfave/cli.v1"
) )
// Proposer holds functionality required to run a collation proposer
// in a sharded system
type Proposer interface { type Proposer interface {
Start() error Start() error
} }
@ -16,12 +16,14 @@ type proposer struct {
client client.Client client client.Client
} }
// NewProposer creates a struct instance
func NewProposer(ctx *cli.Context) Proposer { func NewProposer(ctx *cli.Context) Proposer {
return &proposer{ return &proposer{
client: client.NewClient(ctx), client: client.NewClient(ctx),
} }
} }
// Start the main entry point for proposing collations
func (p *proposer) Start() error { func (p *proposer) Start() error {
log.Info("Starting proposer client") log.Info("Starting proposer client")
err := p.client.Start() err := p.client.Start()