{"action":"created","comment":{"url":"https://api.github.com/repos/prysmaticlabs/prysm/pulls/comments/220396352","pull_request_review_id":158793800,"id":220396352,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyMDM5NjM1Mg==","diff_hunk":"@@ -301,24 +323,107 @@ func (s *Service) ValidatorIndex(ctx context.Context, req *pb.PublicKey) (*pb.In\n \treturn &pb.IndexResponse{Index: index}, nil\n }\n \n-// LatestAttestation streams the latest processed attestations to the rpc clients.\n-func (s *Service) LatestAttestation(req *empty.Empty, stream pb.BeaconService_LatestAttestationServer) error {\n-\tsub := s.attestationService.IncomingAttestationFeed().Subscribe(s.incomingAttestation)\n-\tdefer sub.Unsubscribe()\n+// ValidatorAssignment streams validator assignments every slot to clients that request\n+// to watch a subset of public keys in the CrystallizedState's active validator set.\n+func (s *Service) ValidatorAssignment(req *pb.ValidatorAssignmentRequest, stream pb.ValidatorService_ValidatorAssignmentServer) error {\n+\t// If the genesis time was at 12:00:00PM a if the SlotDuration is set to\n+\t// 8 seconds. We can accomplish this by using utils.WaitUntilTimestamp\n+\t// and passing in the desired slot duration as an argument.\n+\t//\n+\t// Instead of utilizing params.SlotDuration, we utilize a property of\n+\t// RPC service struct called slotAlignmentDuration. This value\n+\t// can be set to 0 seconds as a parameter in tests.\n+\t// Otherwise, tests would sleep.\n+\tutils.WaitUntilTimestamp(s.slotAlignmentDuration)\n+\n+\t// Right after the timestamps are aligned, we start a new ticker\n+\t// that fires exactly every params.SlotDuration*time.Second. This ensures\n+\t// a consistent \"heartbeat\" to keep track of every beacon slot.\n+\ttickerChan := time.NewTicker(s.slotAlignmentDuration).C\n+\treturn s.streamValidators(req, stream, utils.CurrentBeaconSlot(), tickerChan, s.ctx.Done())\n+}\n \n+// streamValidators is a wrapper around the internal logic for streaming validator assignments\n+// to clients. It is abstracted into this function for easier tests.\n+func (s *Service) streamValidators(\n+\treq *pb.ValidatorAssignmentRequest,\n+\tstream pb.ValidatorService_ValidatorAssignmentServer,\n+\tcurrentSlot uint64,\n+\ttickerChan <-chan time.Time,\n+\tdone <-chan struct{}) error {\n \tfor {\n \t\tselect {\n-\t\tcase attestation := <-s.incomingAttestation:\n-\t\t\tlog.Info(\"Sending attestation to RPC clients\")\n-\t\t\tif err := stream.Send(attestation); err != nil {\n+\t\tcase <-done:\n+\t\t\tlog.Debug(\"ValidatorAssignment stream closed, exiting goroutine\")\n+\t\t\treturn nil\n+\t\tcase <-tickerChan:\n+\n+\t\t\tif len(req.GetPublicKeys()) == 0 {\n+\t\t\t\treturn errors.New(\"no public keys specified in request\")\n+\t\t\t}\n+\n+\t\t\tlog.WithField(\"slotNumber\", currentSlot).Debug(\"Sending validator assignment to RPC clients\")\n+\t\t\t// NOTE: this set will not change, so we can just cache the previous one\n+\n+\t\t\t// We get the current crystallized state.\n+\t\t\tcState := s.chainService.CurrentCrystallizedState()\n+\n+\t\t\t// Next, for each public key in the request, we build\n+\t\t\t// up an array of assignments.\n+\t\t\tassignments := []*pb.ValidatorAssignmentResponse_Assignment{}\n+\n+\t\t\tfor _, val := range req.GetPublicKeys() {\n+\n+\t\t\t\t// For the corresponding public key and current crystallized state,\n+\t\t\t\t// we determine the assigned slot for the validator and whether it\n+\t\t\t\t// should act as a proposer or attester.\n+\t\t\t\tassignedSlot, responsibility, err := casper.ValidatorSlotAndResponsibility(","path":"beacon-chain/rpc/service.go","position":207,"original_position":207,"commit_id":"11e21596d95c6595c7a7672b4785e8d73e1f6891","original_commit_id":"11e21596d95c6595c7a7672b4785e8d73e1f6891","user":{"login":"prestonvanloon","id":7246818,"node_id":"MDQ6VXNlcjcyNDY4MTg=","avatar_url":"https://avatars1.githubusercontent.com/u/7246818?v=4","gravatar_id":"","url":"https://api.github.com/users/prestonvanloon","html_url":"https://github.com/prestonvanloon","followers_url":"https://api.github.com/users/prestonvanloon/followers","following_url":"https://api.github.com/users/prestonvanloon/following{/other_user}","gists_url":"https://api.github.com/users/prestonvanloon/gists{/gist_id}","starred_url":"https://api.github.com/users/prestonvanloon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prestonvanloon/subscriptions","organizations_url":"https://api.github.com/users/prestonvanloon/orgs","repos_url":"https://api.github.com/users/prestonvanloon/repos","events_url":"https://api.github.com/users/prestonvanloon/events{/privacy}","received_events_url":"https://api.github.com/users/prestonvanloon/received_events","type":"User","site_admin":false},"body":"What about when the pubkey is not assigned in this slot?","created_at":"2018-09-26T00:32:45Z","updated_at":"2018-09-26T00:41:03Z","html_url":"https://github.com/prysmaticlabs/prysm/pull/563#discussion_r220396352","pull_request_url":"https://api.github.com/repos/prysmaticlabs/prysm/pulls/563","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/prysmaticlabs/prysm/pulls/comments/220396352"},"html":{"href":"https://github.com/prysmaticlabs/prysm/pull/563#discussion_r220396352"},"pull_request":{"href":"https://api.github.com/repos/prysmaticlabs/prysm/pulls/563"}}},"pull_request":{"url":"https://api.github.com/repos/prysmaticlabs/prysm/pulls/563","id":217544356,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE3NTQ0MzU2","html_url":"https://github.com/prysmaticlabs/prysm/pull/563","diff_url":"https://github.com/prysmaticlabs/prysm/pull/563.diff","patch_url":"https://github.com/prysmaticlabs/prysm/pull/563.patch","issue_url":"https://api.github.com/repos/prysmaticlabs/prysm/issues/563","number":563,"state":"open","locked":false,"title":"Validator Assignment RPC Beacon Node Stream","user":{"login":"rauljordan","id":5572669,"node_id":"MDQ6VXNlcjU1NzI2Njk=","avatar_url":"https://avatars3.githubusercontent.com/u/5572669?v=4","gravatar_id":"","url":"https://api.github.com/users/rauljordan","html_url":"https://github.com/rauljordan","followers_url":"https://api.github.com/users/rauljordan/followers","following_url":"https://api.github.com/users/rauljordan/following{/other_user}","gists_url":"https://api.github.com/users/rauljordan/gists{/gist_id}","starred_url":"https://api.github.com/users/rauljordan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rauljordan/subscriptions","organizations_url":"https://api.github.com/users/rauljordan/orgs","repos_url":"https://api.github.com/users/rauljordan/repos","events_url":"https://api.github.com/users/rauljordan/events{/privacy}","received_events_url":"https://api.github.com/users/rauljordan/received_events","type":"User","site_admin":false},"body":"This is part of #545.\r\n\r\n---\r\n\r\n# Description\r\n\r\nThis PR implements the server-side functionality for streaming validator assignments to validator clients. Validators will send a request to a beacon node to watch a certain subset of public keys and the server will reply with a stream that is written to exactly at every slot interval (every 8 seconds as of writing). \r\n\r\n## Scope\r\n\r\nThe scope of this PR affects the RPC service in our beacon node and associated tests. This PR also implements a precise slot alignment ticker to ensure a beacon node streams to validator clients at exactly each slot interval. That is, if the current beacon slot started at 12:00:00PM and the current time is 12:00:03PM, we don't want to tick right away, but instead wait until 12:00:08PM to send a stream to connected validator clients.","created_at":"2018-09-24T01:45:56Z","updated_at":"2018-09-26T00:41:03Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5b8ad62909c810408a9f54e385bad6dc5a517c95","assignee":{"login":"rauljordan","id":5572669,"node_id":"MDQ6VXNlcjU1NzI2Njk=","avatar_url":"https://avatars3.githubusercontent.com/u/5572669?v=4","gravatar_id":"","url":"https://api.github.com/users/rauljordan","html_url":"https://github.com/rauljordan","followers_url":"https://api.github.com/users/rauljordan/followers","following_url":"https://api.github.com/users/rauljordan/following{/other_user}","gists_url":"https://api.github.com/users/rauljordan/gists{/gist_id}","starred_url":"https://api.github.com/users/rauljordan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rauljordan/subscriptions","organizations_url":"https://api.github.com/users/rauljordan/orgs","repos_url":"https://api.github.com/users/rauljordan/repos","events_url":"https://api.github.com/users/rauljordan/events{/privacy}","received_events_url":"https://api.github.com/users/rauljordan/received_events","type":"User","site_admin":false},"assignees":[{"login":"rauljordan","id":5572669,"node_id":"MDQ6VXNlcjU1NzI2Njk=","avatar_url":"https://avatars3.githubusercontent.com/u/5572669?v=4","gravatar_id":"","url":"https://api.github.com/users/rauljordan","html_url":"https://github.com/rauljordan","followers_url":"https://api.github.com/users/rauljordan/followers","following_url":"https://api.github.com/users/rauljordan/following{/other_user}","gists_url":"https://api.github.com/users/rauljordan/gists{/gist_id}","starred_url":"https://api.github.com/users/rauljordan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rauljordan/subscriptions","organizations_url":"https://api.github.com/users/rauljordan/orgs","repos_url":"https://api.github.com/users/rauljordan/repos","events_url":"https://api.github.com/users/rauljordan/events{/privacy}","received_events_url":"https://api.github.com/users/rauljordan/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"rawfalafel","id":202157,"node_id":"MDQ6VXNlcjIwMjE1Nw==","avatar_url":"https://avatars0.githubusercontent.com/u/202157?v=4","gravatar_id":"","url":"https://api.github.com/users/rawfalafel","html_url":"https://github.com/rawfalafel","followers_url":"https://api.github.com/users/rawfalafel/followers","following_url":"https://api.github.com/users/rawfalafel/following{/other_user}","gists_url":"https://api.github.com/users/rawfalafel/gists{/gist_id}","starred_url":"https://api.github.com/users/rawfalafel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rawfalafel/subscriptions","organizations_url":"https://api.github.com/users/rawfalafel/orgs","repos_url":"https://api.github.com/users/rawfalafel/repos","events_url":"https://api.github.com/users/rawfalafel/events{/privacy}","received_events_url":"https://api.github.com/users/rawfalafel/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":969536296,"node_id":"MDU6TGFiZWw5Njk1MzYyOTY=","url":"https://api.github.com/repos/prysmaticlabs/prysm/labels/Beacon%20Chain","name":"Beacon Chain","color":"e5f49a","default":false},{"id":953164091,"node_id":"MDU6TGFiZWw5NTMxNjQwOTE=","url":"https://api.github.com/repos/prysmaticlabs/prysm/labels/Intermediate","name":"Intermediate","color":"db856f","default":false}],"milestone":{"url":"https://api.github.com/repos/prysmaticlabs/prysm/milestones/1","html_url":"https://github.com/prysmaticlabs/prysm/milestone/1","labels_url":"https://api.github.com/repos/prysmaticlabs/prysm/milestones/1/labels","id":3141840,"node_id":"MDk6TWlsZXN0b25lMzE0MTg0MA==","number":1,"title":"Ruby","description":"The Ruby Release: Local Alphanet","creator":{"login":"prestonvanloon","id":7246818,"node_id":"MDQ6VXNlcjcyNDY4MTg=","avatar_url":"https://avatars1.githubusercontent.com/u/7246818?v=4","gravatar_id":"","url":"https://api.github.com/users/prestonvanloon","html_url":"https://github.com/prestonvanloon","followers_url":"https://api.github.com/users/prestonvanloon/followers","following_url":"https://api.github.com/users/prestonvanloon/following{/other_user}","gists_url":"https://api.github.com/users/prestonvanloon/gists{/gist_id}","starred_url":"https://api.github.com/users/prestonvanloon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prestonvanloon/subscriptions","organizations_url":"https://api.github.com/users/prestonvanloon/orgs","repos_url":"https://api.github.com/users/prestonvanloon/repos","events_url":"https://api.github.com/users/prestonvanloon/events{/privacy}","received_events_url":"https://api.github.com/users/prestonvanloon/received_events","type":"User","site_admin":false},"open_issues":16,"closed_issues":256,"state":"open","created_at":"2018-02-25T21:22:44Z","updated_at":"2018-09-25T12:39:25Z","due_on":"2018-10-01T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/prysmaticlabs/prysm/pulls/563/commits","review_comments_url":"https://api.github.com/repos/prysmaticlabs/prysm/pulls/563/comments","review_comment_url":"https://api.github.com/repos/prysmaticlabs/prysm/pulls/comments{/number}","comments_url":"https://api.github.com/repos/prysmaticlabs/prysm/issues/563/comments","statuses_url":"https://api.github.com/repos/prysmaticlabs/prysm/statuses/11e21596d95c6595c7a7672b4785e8d73e1f6891","head":{"label":"rauljordan:stream-server","ref":"stream-server","sha":"11e21596d95c6595c7a7672b4785e8d73e1f6891","user":{"login":"rauljordan","id":5572669,"node_id":"MDQ6VXNlcjU1NzI2Njk=","avatar_url":"https://avatars3.githubusercontent.com/u/5572669?v=4","gravatar_id":"","url":"https://api.github.com/users/rauljordan","html_url":"https://github.com/rauljordan","followers_url":"https://api.github.com/users/rauljordan/followers","following_url":"https://api.github.com/users/rauljordan/following{/other_user}","gists_url":"https://api.github.com/users/rauljordan/gists{/gist_id}","starred_url":"https://api.github.com/users/rauljordan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rauljordan/subscriptions","organizations_url":"https://api.github.com/users/rauljordan/orgs","repos_url":"https://api.github.com/users/rauljordan/repos","events_url":"https://api.github.com/users/rauljordan/events{/privacy}","received_events_url":"https://api.github.com/users/rauljordan/received_events","type":"User","site_admin":false},"repo":{"id":142178606,"node_id":"MDEwOlJlcG9zaXRvcnkxNDIxNzg2MDY=","name":"prysm","full_name":"rauljordan/prysm","private":false,"owner":{"login":"rauljordan","id":5572669,"node_id":"MDQ6VXNlcjU1NzI2Njk=","avatar_url":"https://avatars3.githubusercontent.com/u/5572669?v=4","gravatar_id":"","url":"https://api.github.com/users/rauljordan","html_url":"https://github.com/rauljordan","followers_url":"https://api.github.com/users/rauljordan/followers","following_url":"https://api.github.com/users/rauljordan/following{/other_user}","gists_url":"https://api.github.com/users/rauljordan/gists{/gist_id}","starred_url":"https://api.github.com/users/rauljordan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rauljordan/subscriptions","organizations_url":"https://api.github.com/users/rauljordan/orgs","repos_url":"https://api.github.com/users/rauljordan/repos","events_url":"https://api.github.com/users/rauljordan/events{/privacy}","received_events_url":"https://api.github.com/users/rauljordan/received_events","type":"User","site_admin":false},"html_url":"https://github.com/rauljordan/prysm","description":"Go implementation of Ethereum 2.0 - casper & sharding","fork":true,"url":"https://api.github.com/repos/rauljordan/prysm","forks_url":"https://api.github.com/repos/rauljordan/prysm/forks","keys_url":"https://api.github.com/repos/rauljordan/prysm/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rauljordan/prysm/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rauljordan/prysm/teams","hooks_url":"https://api.github.com/repos/rauljordan/prysm/hooks","issue_events_url":"https://api.github.com/repos/rauljordan/prysm/issues/events{/number}","events_url":"https://api.github.com/repos/rauljordan/prysm/events","assignees_url":"https://api.github.com/repos/rauljordan/prysm/assignees{/user}","branches_url":"https://api.github.com/repos/rauljordan/prysm/branches{/branch}","tags_url":"https://api.github.com/repos/rauljordan/prysm/tags","blobs_url":"https://api.github.com/repos/rauljordan/prysm/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rauljordan/prysm/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rauljordan/prysm/git/refs{/sha}","trees_url":"https://api.github.com/repos/rauljordan/prysm/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rauljordan/prysm/statuses/{sha}","languages_url":"https://api.github.com/repos/rauljordan/prysm/languages","stargazers_url":"https://api.github.com/repos/rauljordan/prysm/stargazers","contributors_url":"https://api.github.com/repos/rauljordan/prysm/contributors","subscribers_url":"https://api.github.com/repos/rauljordan/prysm/subscribers","subscription_url":"https://api.github.com/repos/rauljordan/prysm/subscription","commits_url":"https://api.github.com/repos/rauljordan/prysm/commits{/sha}","git_commits_url":"https://api.github.com/repos/rauljordan/prysm/git/commits{/sha}","comments_url":"https://api.github.com/repos/rauljordan/prysm/comments{/number}","issue_comment_url":"https://api.github.com/repos/rauljordan/prysm/issues/comments{/number}","contents_url":"https://api.github.com/repos/rauljordan/prysm/contents/{+path}","compare_url":"https://api.github.com/repos/rauljordan/prysm/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rauljordan/prysm/merges","archive_url":"https://api.github.com/repos/rauljordan/prysm/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rauljordan/prysm/downloads","issues_url":"https://api.github.com/repos/rauljordan/prysm/issues{/number}","pulls_url":"https://api.github.com/repos/rauljordan/prysm/pulls{/number}","milestones_url":"https://api.github.com/repos/rauljordan/prysm/milestones{/number}","notifications_url":"https://api.github.com/repos/rauljordan/prysm/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rauljordan/prysm/labels{/name}","releases_url":"https://api.github.com/repos/rauljordan/prysm/releases{/id}","deployments_url":"https://api.github.com/repos/rauljordan/prysm/deployments","created_at":"2018-07-24T15:32:12Z","updated_at":"2018-07-24T15:32:14Z","pushed_at":"2018-09-25T19:48:01Z","git_url":"git://github.com/rauljordan/prysm.git","ssh_url":"git@github.com:rauljordan/prysm.git","clone_url":"https://github.com/rauljordan/prysm.git","svn_url":"https://github.com/rauljordan/prysm","homepage":"https://prysmaticlabs.com/","size":84329,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"prysmaticlabs:master","ref":"master","sha":"5bc324d2f110e60421fdc66399cc154509b9823e","user":{"login":"prysmaticlabs","id":35349758,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM1MzQ5NzU4","avatar_url":"https://avatars2.githubusercontent.com/u/35349758?v=4","gravatar_id":"","url":"https://api.github.com/users/prysmaticlabs","html_url":"https://github.com/prysmaticlabs","followers_url":"https://api.github.com/users/prysmaticlabs/followers","following_url":"https://api.github.com/users/prysmaticlabs/following{/other_user}","gists_url":"https://api.github.com/users/prysmaticlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/prysmaticlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prysmaticlabs/subscriptions","organizations_url":"https://api.github.com/users/prysmaticlabs/orgs","repos_url":"https://api.github.com/users/prysmaticlabs/repos","events_url":"https://api.github.com/users/prysmaticlabs/events{/privacy}","received_events_url":"https://api.github.com/users/prysmaticlabs/received_events","type":"Organization","site_admin":false},"repo":{"id":117156031,"node_id":"MDEwOlJlcG9zaXRvcnkxMTcxNTYwMzE=","name":"prysm","full_name":"prysmaticlabs/prysm","private":false,"owner":{"login":"prysmaticlabs","id":35349758,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM1MzQ5NzU4","avatar_url":"https://avatars2.githubusercontent.com/u/35349758?v=4","gravatar_id":"","url":"https://api.github.com/users/prysmaticlabs","html_url":"https://github.com/prysmaticlabs","followers_url":"https://api.github.com/users/prysmaticlabs/followers","following_url":"https://api.github.com/users/prysmaticlabs/following{/other_user}","gists_url":"https://api.github.com/users/prysmaticlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/prysmaticlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prysmaticlabs/subscriptions","organizations_url":"https://api.github.com/users/prysmaticlabs/orgs","repos_url":"https://api.github.com/users/prysmaticlabs/repos","events_url":"https://api.github.com/users/prysmaticlabs/events{/privacy}","received_events_url":"https://api.github.com/users/prysmaticlabs/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/prysmaticlabs/prysm","description":"Go implementation of Ethereum 2.0 - casper & sharding","fork":false,"url":"https://api.github.com/repos/prysmaticlabs/prysm","forks_url":"https://api.github.com/repos/prysmaticlabs/prysm/forks","keys_url":"https://api.github.com/repos/prysmaticlabs/prysm/keys{/key_id}","collaborators_url":"https://api.github.com/repos/prysmaticlabs/prysm/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/prysmaticlabs/prysm/teams","hooks_url":"https://api.github.com/repos/prysmaticlabs/prysm/hooks","issue_events_url":"https://api.github.com/repos/prysmaticlabs/prysm/issues/events{/number}","events_url":"https://api.github.com/repos/prysmaticlabs/prysm/events","assignees_url":"https://api.github.com/repos/prysmaticlabs/prysm/assignees{/user}","branches_url":"https://api.github.com/repos/prysmaticlabs/prysm/branches{/branch}","tags_url":"https://api.github.com/repos/prysmaticlabs/prysm/tags","blobs_url":"https://api.github.com/repos/prysmaticlabs/prysm/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/prysmaticlabs/prysm/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/prysmaticlabs/prysm/git/refs{/sha}","trees_url":"https://api.github.com/repos/prysmaticlabs/prysm/git/trees{/sha}","statuses_url":"https://api.github.com/repos/prysmaticlabs/prysm/statuses/{sha}","languages_url":"https://api.github.com/repos/prysmaticlabs/prysm/languages","stargazers_url":"https://api.github.com/repos/prysmaticlabs/prysm/stargazers","contributors_url":"https://api.github.com/repos/prysmaticlabs/prysm/contributors","subscribers_url":"https://api.github.com/repos/prysmaticlabs/prysm/subscribers","subscription_url":"https://api.github.com/repos/prysmaticlabs/prysm/subscription","commits_url":"https://api.github.com/repos/prysmaticlabs/prysm/commits{/sha}","git_commits_url":"https://api.github.com/repos/prysmaticlabs/prysm/git/commits{/sha}","comments_url":"https://api.github.com/repos/prysmaticlabs/prysm/comments{/number}","issue_comment_url":"https://api.github.com/repos/prysmaticlabs/prysm/issues/comments{/number}","contents_url":"https://api.github.com/repos/prysmaticlabs/prysm/contents/{+path}","compare_url":"https://api.github.com/repos/prysmaticlabs/prysm/compare/{base}...{head}","merges_url":"https://api.github.com/repos/prysmaticlabs/prysm/merges","archive_url":"https://api.github.com/repos/prysmaticlabs/prysm/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/prysmaticlabs/prysm/downloads","issues_url":"https://api.github.com/repos/prysmaticlabs/prysm/issues{/number}","pulls_url":"https://api.github.com/repos/prysmaticlabs/prysm/pulls{/number}","milestones_url":"https://api.github.com/repos/prysmaticlabs/prysm/milestones{/number}","notifications_url":"https://api.github.com/repos/prysmaticlabs/prysm/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/prysmaticlabs/prysm/labels{/name}","releases_url":"https://api.github.com/repos/prysmaticlabs/prysm/releases{/id}","deployments_url":"https://api.github.com/repos/prysmaticlabs/prysm/deployments","created_at":"2018-01-11T21:31:33Z","updated_at":"2018-09-25T16:38:19Z","pushed_at":"2018-09-26T00:12:35Z","git_url":"git://github.com/prysmaticlabs/prysm.git","ssh_url":"git@github.com:prysmaticlabs/prysm.git","clone_url":"https://github.com/prysmaticlabs/prysm.git","svn_url":"https://github.com/prysmaticlabs/prysm","homepage":"https://prysmaticlabs.com/","size":83833,"stargazers_count":267,"watchers_count":267,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":50,"mirror_url":null,"archived":false,"open_issues_count":53,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":50,"open_issues":53,"watchers":267,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/prysmaticlabs/prysm/pulls/563"},"html":{"href":"https://github.com/prysmaticlabs/prysm/pull/563"},"issue":{"href":"https://api.github.com/repos/prysmaticlabs/prysm/issues/563"},"comments":{"href":"https://api.github.com/repos/prysmaticlabs/prysm/issues/563/comments"},"review_comments":{"href":"https://api.github.com/repos/prysmaticlabs/prysm/pulls/563/comments"},"review_comment":{"href":"https://api.github.com/repos/prysmaticlabs/prysm/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/prysmaticlabs/prysm/pulls/563/commits"},"statuses":{"href":"https://api.github.com/repos/prysmaticlabs/prysm/statuses/11e21596d95c6595c7a7672b4785e8d73e1f6891"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"prestonvanloon"}}