Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update from Master #2447

Merged
merged 55 commits into from
Apr 30, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
cfd3e54
Use Map for Inclusion Distance in EpochProcessing (#2346)
rauljordan Apr 23, 2019
2d8dd20
Optimize LMD-GHOST Vote Counting (#2333)
rauljordan Apr 23, 2019
41987b2
Renovate Mega Updates (#2332)
terencechain Apr 23, 2019
7a27d9a
Move Inclusion Maps to Epoch Processing (#2347)
rauljordan Apr 23, 2019
a8ce61b
Remove Proto Clone from State Reads (#2349)
Apr 23, 2019
4ed8656
Disable RPC while Syncing (#2353)
Apr 23, 2019
e367148
Enable Ancestor Cache By Default (#2358)
rauljordan Apr 23, 2019
e4bbf54
Hardcoded Bootstrap + Relay Nodes (#2359)
rauljordan Apr 23, 2019
44bc1c1
Suggest to ClearDB if Contract Mismatches Cluster (#2360)
rauljordan Apr 23, 2019
376aacd
Use infura for http provider as well (#2363)
prestonvanloon Apr 23, 2019
64e7db6
Resolve Contract Address Automatically via HTTP (#2361)
rauljordan Apr 23, 2019
e7ec153
Interactive Validator Client Onboarding (#2362)
rauljordan Apr 24, 2019
6c1740e
Add Caching to Tree Hashing Algorithm (#1929)
shayzluf Apr 24, 2019
89941ee
Fix State Reads (#2368)
Apr 24, 2019
54f6fff
Batch Attestations in Attestation Service (#2370)
Apr 24, 2019
941810e
Use State Instead of Cached Registry (#2372)
Apr 24, 2019
b81eeec
Optimize block fetch with attestation target fetch (#2373)
terencechain Apr 24, 2019
66f3964
allow CORS from anywhere (#2375)
prestonvanloon Apr 24, 2019
8abd2e5
Update flags.go (#2376)
prestonvanloon Apr 25, 2019
75be7be
Handle Panics In Attestation and Disable Logging (#2380)
nisdas Apr 25, 2019
a84fd21
Minor Cosmetic Updates to Validator Logging (#2377)
terencechain Apr 25, 2019
706aa9b
Update Jaeger Export Tracing (#2382)
rauljordan Apr 25, 2019
538d7ec
Prevent Fetching Head State Many Times in Requesting Latest Attestati…
rauljordan Apr 25, 2019
5bf1032
Prevent Reading Head State on Every Received Attestation (#2383)
rauljordan Apr 25, 2019
82d0bbb
RPC Validator Index Lookup Failover (#2386)
terencechain Apr 25, 2019
2318a53
Lock Down the ReceiveBlock Function (#2387)
rauljordan Apr 26, 2019
89600e8
Remove Duplicated Functions in the Slice Package (#2389)
nisdas Apr 26, 2019
09083b0
add log (#2390)
nisdas Apr 26, 2019
a170c69
upgrading linter from gometalinter to golangci-lint (#2100)
Apr 26, 2019
81c8b13
Only Sync With the Peer With the Highest Observed Slot (#2280)
rauljordan Apr 26, 2019
6ddb5fa
Added flag to disable rewards/penatlty logging (#2319)
Apr 27, 2019
7a04af7
Use Withfields for Forked Block (#2394)
terencechain Apr 27, 2019
210edfc
P2P handshake handling (#2306)
prestonvanloon Apr 27, 2019
cd302e8
Fix Block Processing And UpdateChainHead (#2399)
Apr 27, 2019
dcc2250
Use HTTP for On Demand Block Requests (#2405)
rauljordan Apr 27, 2019
769fcb5
use Network, not Peerstore (#2404)
prestonvanloon Apr 27, 2019
5167fad
Serve pprof http (#2406)
prestonvanloon Apr 27, 2019
80d4746
Add a temporary commenting for issue #2408 (#2409)
prestonvanloon Apr 28, 2019
6337879
do not run assign every slot (#2412)
rauljordan Apr 28, 2019
85daf6e
update to 3.2ETH (#2415)
terencechain Apr 28, 2019
52250c9
Fix Fork Choice Reorg Conditions (#2413)
Apr 28, 2019
5249134
set cluster manager to deposit 3.2 eth (#2416)
prestonvanloon Apr 28, 2019
63633a3
Enable Historical State Pruning By Default (#2433)
rauljordan Apr 29, 2019
a9d2003
Add SSL support for prylabs.net, support opengraph on alpha.prylabs.n…
prestonvanloon Apr 29, 2019
4a3b2f6
Renovates Major Updates (#2434)
terencechain Apr 29, 2019
e16f1e1
Reverts RPC Disabling (#2435)
nisdas Apr 29, 2019
4a90f82
Fix Validator Ejection for Testnet (#2438)
terencechain Apr 29, 2019
c288af5
Continue Processing Invalid Deposits (#2437)
nisdas Apr 29, 2019
63998b9
Add and Use Truncate Hash Library (#2417)
terencechain Apr 29, 2019
aa80c30
Save Deposit to DB Even If Fails to Deserialize (#2440)
rauljordan Apr 29, 2019
bff774d
Operation service prunes invalid attestation (#2439)
terencechain Apr 29, 2019
22fa595
Prune Atts One Epoch Older (#2442)
terencechain Apr 29, 2019
3f742d7
Use new port for testnet site, redirect prylabs.net to alpha.prylabs.…
prestonvanloon Apr 29, 2019
7a7b4e5
prevent validator exit reentrance (#2443)
terencechain Apr 29, 2019
ead368a
Merge branch 'master' of https://github.com/prysmaticlabs/geth-shardi…
nisdas Apr 30, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 31 additions & 31 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
name = "bazel_skylib",
url = "https://github.com/bazelbuild/bazel-skylib/archive/0.8.0.tar.gz",
sha256 = "2ea8a5ed2b448baf4a6855d3ce049c4c452a6470b1efd1504fdb7c1c134d220a",
strip_prefix = "bazel-skylib-0.8.0",
url = "https://github.com/bazelbuild/bazel-skylib/archive/0.8.0.tar.gz",
)

http_archive(
name = "io_bazel_rules_go",
url = "https://github.com/bazelbuild/rules_go/releases/download/0.18.3/rules_go-0.18.3.tar.gz",
sha256 = "86ae934bd4c43b99893fc64be9d9fc684b81461581df7ea8fc291c816f5ee8c5",
url = "https://github.com/bazelbuild/rules_go/releases/download/0.18.3/rules_go-0.18.3.tar.gz",
)

http_archive(
Expand All @@ -28,22 +28,22 @@ http_archive(

http_archive(
name = "io_bazel_rules_docker",
url = "https://github.com/bazelbuild/rules_docker/archive/v0.7.0.tar.gz",
strip_prefix = "rules_docker-0.7.0",
sha256 = "aed1c249d4ec8f703edddf35cbe9dfaca0b5f5ea6e4cd9e83e99f3b0d1136c3d",
strip_prefix = "rules_docker-0.7.0",
url = "https://github.com/bazelbuild/rules_docker/archive/v0.7.0.tar.gz",
)

http_archive(
name = "build_bazel_rules_nodejs",
sha256 = "3a3efbf223f6de733475602844ad3a8faa02abda25ab8cfe1d1ed0db134887cf",
urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.27.12/rules_nodejs-0.27.12.tar.gz"],
sha256 = "4c702ffeeab2d24dd4101601b6d27cf582d2e0d4cdc3abefddd4834664669b6b",
urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.28.0/rules_nodejs-0.28.0.tar.gz"],
)

http_archive(
name = "io_bazel_rules_k8s",
sha256 = "b4aabc3f931a67b4970076ae9490afc18caa1690360c952fba9681225739f6d5",
strip_prefix = "rules_k8s-e7b408f07785e3b660ee7e99173b0e4328c7b65e",
url = "https://github.com/bazelbuild/rules_k8s/archive/e7b408f07785e3b660ee7e99173b0e4328c7b65e.tar.gz",
sha256 = "00606b1de959028881220e2cdc1186068242de491f8782e30922e8285b5f3ad1",
strip_prefix = "rules_k8s-c1daa04ce0a83fbaa4396fb4987d7675cd24f25e",
url = "https://github.com/bazelbuild/rules_k8s/archive/c1daa04ce0a83fbaa4396fb4987d7675cd24f25e.tar.gz",
)

load(
Expand All @@ -64,7 +64,7 @@ yarn_install(
)

# This requires rules_docker to be fully instantiated before it is pulled in.
load("@io_bazel_rules_k8s//k8s:k8s.bzl", "k8s_repositories", "k8s_defaults")
load("@io_bazel_rules_k8s//k8s:k8s.bzl", "k8s_defaults", "k8s_repositories")

k8s_repositories()

Expand All @@ -88,7 +88,7 @@ k8s_repositories()
"service_account",
]]

load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains")
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")

go_rules_dependencies()

Expand All @@ -111,15 +111,15 @@ _go_image_repos()

http_archive(
name = "prysm_testnet_site",
url = "https://github.com/prestonvanloon/prysm-testnet-site/archive/3d0a15deb03aeefe0c69d4400a1f9486383fde27.tar.gz",
strip_prefix = "prysm-testnet-site-3d0a15deb03aeefe0c69d4400a1f9486383fde27",
sha256 = "f56cb21ab184ab2bfa7e8503ef1d3ec189bd2004aac9681012e6a58a0ba3f3e3",
build_file_content = """
proto_library(
name = "faucet_proto",
srcs = ["src/proto/faucet.proto"],
visibility = ["//visibility:public"],
)""",
sha256 = "d57cbb11cbd8126d31385064315df731132401f5c5ea110e05ed86da350c9523",
strip_prefix = "prysm-testnet-site-3848e91aab9332a0b2c15291f65f09c94db1a84d",
url = "https://github.com/prestonvanloon/prysm-testnet-site/archive/3848e91aab9332a0b2c15291f65f09c94db1a84d.tar.gz",
)

http_archive(
Expand Down Expand Up @@ -182,7 +182,7 @@ go_repository(

go_repository(
name = "com_github_libp2p_go_libp2p",
commit = "5bce62bbecc0c07087af4cae2490b764afe1c594", # v0.0.15
commit = "4d4f98f9ae7a78727e76c0cf5609bfa09e70715a", # v0.0.20
importpath = "github.com/libp2p/go-libp2p",
)

Expand Down Expand Up @@ -213,13 +213,13 @@ go_repository(

go_repository(
name = "com_github_multiformats_go_multihash",
commit = "922cbd7915f407488e3f4413ada76400a1b29b49", # v0.0.3
commit = "043d98569fdc31461b049f0c9fe267291fcbc087", # v0.0.5
importpath = "github.com/multiformats/go-multihash",
)

go_repository(
name = "com_github_libp2p_go_libp2p_swarm",
commit = "51da4b6c9c2e869dce87a455a7c788d7181711c7", # v0.0.2
commit = "688f64125c469829608b4c5b75d500d93646604e", # v0.0.3
importpath = "github.com/libp2p/go-libp2p-swarm",
)

Expand All @@ -231,7 +231,7 @@ go_repository(

go_repository(
name = "com_github_libp2p_go_libp2p_peerstore",
commit = "47258995923bfab02b60b8f45257642568b0a358", # v0.0.2
commit = "2dd94506d962d6b86d9d730ff49b3d3965dce5d8", # v0.0.5
importpath = "github.com/libp2p/go-libp2p-peerstore",
)

Expand All @@ -255,7 +255,7 @@ go_repository(

go_repository(
name = "com_github_libp2p_go_conn_security_multistream",
commit = "d4c3bf7e5688390e4106d3ec73aafd7d0856143b", # v0.0.1
commit = "6b0762ae2e6aa1f4bdd58d96b26a67ad75961c2d", # v0.0.2
importpath = "github.com/libp2p/go-conn-security-multistream",
)

Expand Down Expand Up @@ -340,7 +340,7 @@ go_repository(
go_repository(
name = "com_github_libp2p_go_libp2p_secio",
build_file_proto_mode = "disable_global",
commit = "c3eee8a92db23bd65c434512810c60bec85e7ac9", # v0.0.1
commit = "a1c285be4bd81a8ced3179064005e9e35ea4f495", # v0.0.3
importpath = "github.com/libp2p/go-libp2p-secio",
)

Expand Down Expand Up @@ -412,7 +412,7 @@ go_repository(

go_repository(
name = "com_github_libp2p_go_libp2p_transport_upgrader",
commit = "b4ab689796cdae99ad6641abcedcd7c23258de0c", # v0.0.1
commit = "ff9702e0f87f607f8f51c98b84962eb34c10fb3e", # v0.0.2
importpath = "github.com/libp2p/go-libp2p-transport-upgrader",
)

Expand Down Expand Up @@ -532,7 +532,7 @@ go_repository(

go_repository(
name = "com_github_libp2p_go_msgio",
commit = "2efd92d62d528c56c6711346e82df0c74a5742a8", # v0.0.1
commit = "d166a44c787c5308c27c8dae8b75dc7b182752b7", # v0.0.2
importpath = "github.com/libp2p/go-msgio",
)

Expand Down Expand Up @@ -628,7 +628,7 @@ go_repository(

go_repository(
name = "io_opencensus_go",
commit = "bd64e5eff7498c1c67eba74dc87ad96aa525bf28", # v0.20.2
commit = "fd90d04f12c9f72a32364672932b5a21005b8d7e", # v0.21.0
importpath = "go.opencensus.io",
)

Expand All @@ -642,7 +642,7 @@ go_repository(

go_repository(
name = "org_golang_google_api",
commit = "0cbcb99a9ea0c8023c794b2693cbe1def82ed4d7", # v0.3.2
commit = "067bed655e9cbc26f4dbac8f8897b30756d90990", # v0.4.0
importpath = "google.golang.org/api",
)

Expand Down Expand Up @@ -758,7 +758,7 @@ go_repository(
go_repository(
name = "com_github_libp2p_go_libp2p_kad_dht",
build_file_proto_mode = "disable_global",
commit = "b220ac23e82c0df788178e806b1fefa92e936766", # v0.0.9
commit = "f279358375f2ce20df85ebdf2afa211055513b60", # v0.0.10
importpath = "github.com/libp2p/go-libp2p-kad-dht",
)

Expand Down Expand Up @@ -961,19 +961,19 @@ go_repository(

go_repository(
name = "com_github_deckarep_golang_set",
commit = "699df6a3acf6867538e50931511e9dc403da108a",
commit = "cbaa98ba5575e67703b32b4b19f73c91f3c4159e", # v1.7.1
importpath = "github.com/deckarep/golang-set",
)

go_repository(
name = "com_github_go_stack_stack",
commit = "2fee6af1a9795aafbe0253a0cfbdf668e1fb8a9a",
commit = "f66e05c21cd224e01c8a3ee7bc867aa79439e207", # v1.8.0
importpath = "github.com/go-stack/stack",
)

go_repository(
name = "com_github_rs_cors",
commit = "76f58f330d76a55c5badc74f6212e8a15e742c77",
commit = "9a47f48565a795472d43519dd49aac781f3034fb", # v1.6.0
importpath = "github.com/rs/cors",
)

Expand All @@ -985,19 +985,19 @@ go_repository(

go_repository(
name = "in_gopkg_urfave_cli_v1",
commit = "cfb38830724cc34fedffe9a2a29fb54fa9169cd1",
commit = "cfb38830724cc34fedffe9a2a29fb54fa9169cd1", # v1.20.0
importpath = "gopkg.in/urfave/cli.v1",
)

go_repository(
name = "com_github_rjeczalik_notify",
commit = "629144ba06a1c6af28c1e42c228e3d42594ce081",
commit = "69d839f37b13a8cb7a78366f7633a4071cb43be7", # v0.9.2
importpath = "github.com/rjeczalik/notify",
)

go_repository(
name = "com_github_edsrzf_mmap_go",
commit = "904c4ced31cdffe19e971afa0b3d319ff06d9c72",
commit = "188cc3b666ba704534fa4f96e9e61f21f1e1ba7c", # v1.0.0
importpath = "github.com/edsrzf/mmap-go",
)

Expand Down
17 changes: 12 additions & 5 deletions beacon-chain/attestation/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ import (
var log = logrus.WithField("prefix", "attestation")
var committeeCache = cache.NewCommitteesCache()

// TargetHandler provides an interface for fetching latest attestation targets
// and updating attestations in batches.
type TargetHandler interface {
LatestAttestationTarget(state *pb.BeaconState, validatorIndex uint64) (*pb.AttestationTarget, error)
BatchUpdateLatestAttestation(ctx context.Context, atts []*pb.Attestation) error
}

type attestationStore struct {
sync.RWMutex
m map[[48]byte]*pb.Attestation
Expand Down Expand Up @@ -251,11 +258,11 @@ func (a *Service) updateAttestation(ctx context.Context, headRoot [32]byte, beac
}

log.WithFields(logrus.Fields{
"attestation slot": attestation.Data.Slot - params.BeaconConfig().GenesisSlot,
"attestation shard": attestation.Data.Shard,
"committees shard": cachedCommittees.Committees[0].Shard,
"committees list": cachedCommittees.Committees[0].Committee,
"length of committees": len(cachedCommittees.Committees),
"attestationSlot": attestation.Data.Slot - params.BeaconConfig().GenesisSlot,
"attestationShard": attestation.Data.Shard,
"committeesShard": cachedCommittees.Committees[0].Shard,
"committeesList": cachedCommittees.Committees[0].Committee,
"lengthOfCommittees": len(cachedCommittees.Committees),
}).Debug("Updating latest attestation")

// The participation bitfield from attestation is represented in bytes,
Expand Down
2 changes: 2 additions & 0 deletions beacon-chain/attestation/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ func init() {
logrus.SetLevel(logrus.DebugLevel)
}

var _ = TargetHandler(&Service{})

func TestUpdateLatestAttestation_UpdatesLatest(t *testing.T) {
beaconDB := internal.SetupDB(t)
defer internal.TeardownDB(t, beaconDB)
Expand Down
1 change: 1 addition & 0 deletions beacon-chain/blockchain/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ go_test(
name = "go_default_test",
srcs = [
"block_processing_test.go",
"fork_choice_reorg_test.go",
"fork_choice_test.go",
"service_test.go",
],
Expand Down
70 changes: 53 additions & 17 deletions beacon-chain/blockchain/fork_choice.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,50 +140,65 @@ func (c *ChainService) ApplyForkChoiceRule(
if err != nil {
return fmt.Errorf("could not retrieve justified head: %v", err)
}
head, err := c.lmdGhost(ctx, justifiedHead, justifiedState, attestationTargets)

newHead, err := c.lmdGhost(ctx, justifiedHead, justifiedState, attestationTargets)
if err != nil {
return fmt.Errorf("could not run fork choice: %v", err)
}
headRoot, err := hashutil.HashBeaconBlock(head)
newHeadRoot, err := hashutil.HashBeaconBlock(newHead)
if err != nil {
return fmt.Errorf("could not hash head block: %v", err)
}
c.canonicalBlocksLock.Lock()
defer c.canonicalBlocksLock.Unlock()
c.canonicalBlocks[head.Slot] = headRoot[:]
c.canonicalBlocks[newHead.Slot] = newHeadRoot[:]

currentHead, err := c.beaconDB.ChainHead()
if err != nil {
return fmt.Errorf("could not retrieve chain head: %v", err)
}

isDescendant, err := c.isDescendant(currentHead, newHead)
if err != nil {
return fmt.Errorf("could not check if block is descendant: %v", err)
}

newState := postState
if head.Slot != block.Slot {
log.Warnf("Reorg happened, last processed block at slot %d, new head block at slot %d",
block.Slot-params.BeaconConfig().GenesisSlot, head.Slot-params.BeaconConfig().GenesisSlot)
if !isDescendant {
log.Warnf("Reorg happened, last head at slot %d, new head block at slot %d",
currentHead.Slot-params.BeaconConfig().GenesisSlot, newHead.Slot-params.BeaconConfig().GenesisSlot)

// Only regenerate head state if there was a reorg.
newState, err = c.beaconDB.HistoricalStateFromSlot(ctx, head.Slot)
newState, err = c.beaconDB.HistoricalStateFromSlot(ctx, newHead.Slot)
if err != nil {
return fmt.Errorf("could not gen state: %v", err)
}

if newState.Slot != postState.Slot {
log.Warnf("Reorg happened, post state slot at %d, new head state at slot %d",
postState.Slot-params.BeaconConfig().GenesisSlot, newState.Slot-params.BeaconConfig().GenesisSlot)
}

for revertedSlot := block.Slot; revertedSlot > head.Slot; revertedSlot-- {
for revertedSlot := currentHead.Slot; revertedSlot > newHead.Slot; revertedSlot-- {
delete(c.canonicalBlocks, revertedSlot)
}
reorgCount.Inc()
}

if err := c.beaconDB.UpdateChainHead(ctx, head, newState); err != nil {
// If we receive forked blocks.
if newHead.Slot != newState.Slot {
newState, err = c.beaconDB.HistoricalStateFromSlot(ctx, newHead.Slot)
if err != nil {
return fmt.Errorf("could not gen state: %v", err)
}
}

if err := c.beaconDB.UpdateChainHead(ctx, newHead, newState); err != nil {
return fmt.Errorf("failed to update chain: %v", err)
}
h, err := hashutil.HashBeaconBlock(head)
h, err := hashutil.HashBeaconBlock(newHead)
if err != nil {
return fmt.Errorf("could not hash head: %v", err)
}
log.WithFields(logrus.Fields{
"headRoot": fmt.Sprintf("0x%x", h),
"headRoot": fmt.Sprintf("#%x", bytesutil.Trunc(h[:])),
}).Info("Chain head block and state updated")

return nil
}

Expand Down Expand Up @@ -288,11 +303,32 @@ func (c *ChainService) blockChildren(ctx context.Context, block *pb.BeaconBlock,
return children, nil
}

// isDescendant checks if the new head block is a descendant block of the current head.
func (c *ChainService) isDescendant(currentHead *pb.BeaconBlock, newHead *pb.BeaconBlock) (bool, error) {
currentHeadRoot, err := hashutil.HashBeaconBlock(currentHead)
if err != nil {
return false, nil
}
for newHead.Slot > currentHead.Slot {
if bytesutil.ToBytes32(newHead.ParentRootHash32) == currentHeadRoot {
return true, nil
}
newHead, err = c.beaconDB.Block(bytesutil.ToBytes32(newHead.ParentRootHash32))
if err != nil {
return false, err
}
if newHead == nil {
return false, nil
}
}
return false, nil
}

// attestationTargets retrieves the list of attestation targets since last finalized epoch,
// each attestation target consists of validator index and its attestation target (i.e. the block
// which the validator attested to)
func (c *ChainService) attestationTargets(state *pb.BeaconState) (map[uint64]*pb.AttestationTarget, error) {
indices := helpers.ActiveValidatorIndices(state, helpers.CurrentEpoch(state))
indices := helpers.ActiveValidatorIndices(state.ValidatorRegistry, helpers.CurrentEpoch(state))
attestationTargets := make(map[uint64]*pb.AttestationTarget)
for i, index := range indices {
target, err := c.attsService.LatestAttestationTarget(state, index)
Expand Down
Loading