{"action":"created","comment":{"url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/comments/180928638","pull_request_review_id":111436546,"id":180928638,"diff_hunk":"@@ -0,0 +1,378 @@\n+// Copyright 2018 The go-ethereum Authors\n+// This file is part of the go-ethereum library.\n+//\n+// The go-ethereum library is free software: you can redistribute it and/or modify\n+// it under the terms of the GNU Lesser General Public License as published by\n+// the Free Software Foundation, either version 3 of the License, or\n+// (at your option) any later version.\n+//\n+// The go-ethereum library is distributed in the hope that it will be useful,\n+// but WITHOUT ANY WARRANTY; without even the implied warranty of\n+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+// GNU Lesser General Public License for more details.\n+//\n+// You should have received a copy of the GNU Lesser General Public License\n+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n+package stream\n+\n+import (\n+\t\"context\"\n+\t//\tcrand \"crypto/rand\"\n+\t\"fmt\"\n+\t//\"io\"\n+\t\"math/rand\"\n+\t//\"sync\"\n+\t\"testing\"\n+\t\"time\"\n+\n+\t\"github.com/ethereum/go-ethereum/log\"\n+\t//\"github.com/ethereum/go-ethereum/p2p\"\n+\t\"github.com/ethereum/go-ethereum/p2p/discover\"\n+\t\"github.com/ethereum/go-ethereum/p2p/simulations\"\n+\t//\"github.com/ethereum/go-ethereum/p2p/simulations/adapters\"\n+\t//\"github.com/ethereum/go-ethereum/pot\"\n+\t//\"github.com/ethereum/go-ethereum/rpc\"\n+\t\"github.com/ethereum/go-ethereum/swarm/network\"\n+\tstreamTesting \"github.com/ethereum/go-ethereum/swarm/network/stream/testing\"\n+\t\"github.com/ethereum/go-ethereum/swarm/storage\"\n+)\n+\n+func initRetrievalTest() {\n+\ttoAddr = func(id discover.NodeID) *network.BzzAddr {\n+\t\taddr := network.NewAddrFromNodeID(id)\n+\t\treturn addr\n+\t}\n+\tcreateStoreFunc = createTestLocalStorageForId\n+\t//local stores\n+\tstores = make(map[discover.NodeID]storage.ChunkStore)\n+\t//data directories for each node and store\n+\tdatadirs = make(map[discover.NodeID]string)\n+\t//deliveries for each node\n+\tdeliveries = make(map[discover.NodeID]*Delivery)\n+\tgetRetrieveFunc = func(id discover.NodeID) func(chunk *storage.Chunk) error {\n+\t\treturn func(chunk *storage.Chunk) error {\n+\t\t\tskipCheck := true\n+\t\t\t//fmt.Println(fmt.Sprintf(\"-- %s\", id))\n+\t\t\treturn deliveries[id].RequestFromPeers(chunk.Key[:], skipCheck)\n+\t\t}\n+\t}\n+\t//registries, map of discover.NodeID to its streamer\n+\tregistries = make(map[discover.NodeID]*TestRegistry)\n+\t//channel to wait for peers connected\n+\t//not needed for this test but required from common_test for NewStreamService\n+\twaitPeerErrC = make(chan error)\n+\t//also not needed for this test but required for NewStreamService\n+\tpeerCount = func(id discover.NodeID) int {\n+\t\tif ids[0] == id || ids[len(ids)-1] == id {\n+\t\t\treturn 1\n+\t\t}\n+\t\treturn 2\n+\t}\n+}\n+\n+func TestRetrieval(t *testing.T) {\n+\n+\tif *nodes != 0 && *chunks != 0 {\n+\t\tretrievalTest(t, *chunks, *nodes)\n+\t} else {\n+\t\tvar nodeCnt []int\n+\t\tvar chnkCnt []int\n+\t\tif *longrunning {\n+\t\t\tnodeCnt = []int{16, 32, 128}\n+\t\t\tchnkCnt = []int{4, 32, 256}\n+\t\t} else {\n+\t\t\tnodeCnt = []int{16}\n+\t\t\tchnkCnt = []int{32}\n+\t\t}\n+\t\tfor _, n := range nodeCnt {\n+\t\t\tfor _, c := range chnkCnt {\n+\t\t\t\tretrievalTest(t, c, n)\n+\t\t\t}\n+\t\t}\n+\t}\n+}\n+\n+func retrievalTest(t *testing.T, chunkCount int, nodeCount int) {\n+\t//test live and NO history\n+\tlog.Info(\"Testing live and no history\", \"chunkCount\", chunkCount, \"nodeCount\", nodeCount)\n+\tlive = true\n+\thistory = false\n+\terr := runRetrievalTest(chunkCount, nodeCount)\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\t//test history only\n+\tlog.Info(\"Testing history only\", \"chunkCount\", chunkCount, \"nodeCount\", nodeCount)\n+\tlive = false\n+\thistory = true\n+\terr = runRetrievalTest(chunkCount, nodeCount)\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\t//finally test live and history\n+\tlog.Info(\"Testing live and history\", \"chunkCount\", chunkCount, \"nodeCount\", nodeCount)\n+\tlive = true\n+\terr = runRetrievalTest(chunkCount, nodeCount)\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+}\n+\n+/*\n+The test generates the given number of chunks,\n+then uploads these to a random node.\n+Afterwards for every chunk generated, the nearest node addresses\n+are identified, syncing is started, and finally we verify\n+that the nodes closer to the chunk addresses actually do have\n+the chunks in their local stores.\n+\n+The test loads a snapshot file to construct the swarm network,\n+assuming that the snapshot file identifies a healthy\n+kademlia network. The snapshot should have 'streamer' in its service list.\n+*/\n+func runRetrievalTest(chunkCount int, nodeCount int) error {\n+\tinitRetrievalTest()\n+\tids = make([]discover.NodeID, nodeCount)\n+\tdisconnectC := make(chan error)\n+\tquitC := make(chan struct{})\n+\tconf = &synctestConfig{}\n+\t//map of discover ID to indexes of chunks expected at that ID\n+\tconf.idToChunksMap = make(map[discover.NodeID][]int)\n+\t//map of discover ID to kademlia overlay address\n+\tconf.idToAddrMap = make(map[discover.NodeID][]byte)\n+\t//map of overlay address to discover ID\n+\tconf.addrToIdMap = make(map[string]discover.NodeID)\n+\tconf.chunks = make([]storage.Key, 0)\n+\t//load nodes from the snapshot file\n+\tnet, err := initNetWithSnapshot(nodeCount)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\t//do cleanup after test is terminated\n+\tdefer func() {\n+\t\tdoRetrieve = defaultDoRetrieve\n+\t\t//shutdown the snapshot network\n+\t\tnet.Shutdown()\n+\t\t//after the test, clean up local stores initialized with createLocalStoreForId\n+\t\tlocalStoreCleanup()\n+\t\t//finally clear all data directories\n+\t\tdatadirsCleanup()\n+\t}()\n+\t//get the nodes of the network\n+\tnodes := net.GetNodes()\n+\t//select one index at random...\n+\tidx := rand.Intn(len(nodes))\n+\t//...and get the the node at that index\n+\t//this is the node selected for upload\n+\tuploadNode := nodes[idx]\n+\t//iterate over all nodes...\n+\tfor c := 0; c < len(nodes); c++ {\n+\t\t//create an array of discovery nodeIDS\n+\t\tids[c] = nodes[c].ID()\n+\t\ta := network.ToOverlayAddr(ids[c].Bytes())\n+\t\t//append it to the array of all overlay addresses\n+\t\tconf.addrs = append(conf.addrs, a)\n+\t\tconf.idToAddrMap[ids[c]] = a\n+\t\tconf.addrToIdMap[string(a)] = ids[c]\n+\t}\n+\n+\t//needed for healthy call\n+\tppmap = network.NewPeerPot(testMinProxBinSize, ids, conf.addrs)\n+\n+\t// channel to signal simulation initialisation with action call complete\n+\t// or node disconnections\n+\t//disconnectC := make(chan error)\n+\t//quitC := make(chan struct{})\n+\n+\ttrigger := make(chan discover.NodeID)\n+\taction := func(ctx context.Context) error {\n+\t\tticker := time.NewTicker(200 * time.Millisecond)\n+\t\tdefer ticker.Stop()\n+\t\tfor range ticker.C {\n+\t\t\thealthy := true\n+\t\t\tfor _, id := range ids {\n+\t\t\t\tr := registries[id]\n+\t\t\t\t//PeerPot for this node\n+\t\t\t\tpp := ppmap[id]\n+\t\t\t\t//call Healthy RPC\n+\t\t\t\th := r.delivery.overlay.Healthy(pp)\n+\t\t\t\t//print info\n+\t\t\t\tlog.Debug(r.delivery.overlay.String())\n+\t\t\t\tlog.Debug(fmt.Sprintf(\"IS HEALTHY: %t\", h.GotNN && h.KnowNN && h.Full))\n+\t\t\t\tif !h.GotNN || !h.Full {\n+\t\t\t\t\thealthy = false\n+\t\t\t\t\tbreak\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tif healthy {\n+\t\t\t\tbreak\n+\t\t\t}\n+\t\t}\n+\n+\t\tif history {\n+\t\t\tlog.Info(\"Uploading for history\")\n+\t\t\t//If testing only history, we upload the chunk(s) first\n+\t\t\tconf.chunks, err = uploadFileToSingleNodeStore(uploadNode.ID(), chunkCount)\n+\t\t\tif err != nil {\n+\t\t\t\treturn err\n+\t\t\t}\n+\t\t}\n+\n+\t\t//variables needed to wait for all subscriptions established before uploading\n+\t\terrc := make(chan error)\n+\n+\t\t//now setup and start event watching in order to know when we can upload\n+\t\tctx, watchCancel := context.WithTimeout(context.Background(), MAX_TIMEOUT*time.Second)","path":"swarm/network/stream/snapshot_retrieval_test.go","position":225,"original_position":225,"commit_id":"e9ed0cb7ab77d7b8db18ddb252c360a8970c0b73","original_commit_id":"e9ed0cb7ab77d7b8db18ddb252c360a8970c0b73","user":{"login":"zelig","id":769725,"avatar_url":"https://avatars2.githubusercontent.com/u/769725?v=4","gravatar_id":"","url":"https://api.github.com/users/zelig","html_url":"https://github.com/zelig","followers_url":"https://api.github.com/users/zelig/followers","following_url":"https://api.github.com/users/zelig/following{/other_user}","gists_url":"https://api.github.com/users/zelig/gists{/gist_id}","starred_url":"https://api.github.com/users/zelig/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zelig/subscriptions","organizations_url":"https://api.github.com/users/zelig/orgs","repos_url":"https://api.github.com/users/zelig/repos","events_url":"https://api.github.com/users/zelig/events{/privacy}","received_events_url":"https://api.github.com/users/zelig/received_events","type":"User","site_admin":false},"body":"pls use go style constants ","created_at":"2018-04-11T23:35:30Z","updated_at":"2018-04-11T23:52:12Z","html_url":"https://github.com/ethersphere/go-ethereum/pull/387#discussion_r180928638","pull_request_url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/387","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/comments/180928638"},"html":{"href":"https://github.com/ethersphere/go-ethereum/pull/387#discussion_r180928638"},"pull_request":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/387"}}},"pull_request":{"url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/387","id":181038540,"html_url":"https://github.com/ethersphere/go-ethereum/pull/387","diff_url":"https://github.com/ethersphere/go-ethereum/pull/387.diff","patch_url":"https://github.com/ethersphere/go-ethereum/pull/387.patch","issue_url":"https://api.github.com/repos/ethersphere/go-ethereum/issues/387","number":387,"state":"open","locked":false,"title":"swarm: implemented retrieval test","user":{"login":"holisticode","id":88287,"avatar_url":"https://avatars3.githubusercontent.com/u/88287?v=4","gravatar_id":"","url":"https://api.github.com/users/holisticode","html_url":"https://github.com/holisticode","followers_url":"https://api.github.com/users/holisticode/followers","following_url":"https://api.github.com/users/holisticode/following{/other_user}","gists_url":"https://api.github.com/users/holisticode/gists{/gist_id}","starred_url":"https://api.github.com/users/holisticode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/holisticode/subscriptions","organizations_url":"https://api.github.com/users/holisticode/orgs","repos_url":"https://api.github.com/users/holisticode/repos","events_url":"https://api.github.com/users/holisticode/events{/privacy}","received_events_url":"https://api.github.com/users/holisticode/received_events","type":"User","site_admin":false},"body":"Introduces retrieval tests on netstore\r\n\r\ncloses https://github.com/ethersphere/go-ethereum/issues/232","created_at":"2018-04-11T21:52:54Z","updated_at":"2018-04-11T23:52:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"16760d717304167a28b51a294efba29908732b21","assignee":{"login":"holisticode","id":88287,"avatar_url":"https://avatars3.githubusercontent.com/u/88287?v=4","gravatar_id":"","url":"https://api.github.com/users/holisticode","html_url":"https://github.com/holisticode","followers_url":"https://api.github.com/users/holisticode/followers","following_url":"https://api.github.com/users/holisticode/following{/other_user}","gists_url":"https://api.github.com/users/holisticode/gists{/gist_id}","starred_url":"https://api.github.com/users/holisticode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/holisticode/subscriptions","organizations_url":"https://api.github.com/users/holisticode/orgs","repos_url":"https://api.github.com/users/holisticode/repos","events_url":"https://api.github.com/users/holisticode/events{/privacy}","received_events_url":"https://api.github.com/users/holisticode/received_events","type":"User","site_admin":false},"assignees":[{"login":"holisticode","id":88287,"avatar_url":"https://avatars3.githubusercontent.com/u/88287?v=4","gravatar_id":"","url":"https://api.github.com/users/holisticode","html_url":"https://github.com/holisticode","followers_url":"https://api.github.com/users/holisticode/followers","following_url":"https://api.github.com/users/holisticode/following{/other_user}","gists_url":"https://api.github.com/users/holisticode/gists{/gist_id}","starred_url":"https://api.github.com/users/holisticode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/holisticode/subscriptions","organizations_url":"https://api.github.com/users/holisticode/orgs","repos_url":"https://api.github.com/users/holisticode/repos","events_url":"https://api.github.com/users/holisticode/events{/privacy}","received_events_url":"https://api.github.com/users/holisticode/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":239695069,"url":"https://api.github.com/repos/ethersphere/go-ethereum/labels/in%20progress","name":"in progress","color":"d2db30","default":false},{"id":783051512,"url":"https://api.github.com/repos/ethersphere/go-ethereum/labels/network%20rewrite","name":"network rewrite","color":"15929b","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/387/commits","review_comments_url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/387/comments","review_comment_url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ethersphere/go-ethereum/issues/387/comments","statuses_url":"https://api.github.com/repos/ethersphere/go-ethereum/statuses/e9ed0cb7ab77d7b8db18ddb252c360a8970c0b73","head":{"label":"holisticode:swarm-network-rewrite-retrieval-test","ref":"swarm-network-rewrite-retrieval-test","sha":"e9ed0cb7ab77d7b8db18ddb252c360a8970c0b73","user":{"login":"holisticode","id":88287,"avatar_url":"https://avatars3.githubusercontent.com/u/88287?v=4","gravatar_id":"","url":"https://api.github.com/users/holisticode","html_url":"https://github.com/holisticode","followers_url":"https://api.github.com/users/holisticode/followers","following_url":"https://api.github.com/users/holisticode/following{/other_user}","gists_url":"https://api.github.com/users/holisticode/gists{/gist_id}","starred_url":"https://api.github.com/users/holisticode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/holisticode/subscriptions","organizations_url":"https://api.github.com/users/holisticode/orgs","repos_url":"https://api.github.com/users/holisticode/repos","events_url":"https://api.github.com/users/holisticode/events{/privacy}","received_events_url":"https://api.github.com/users/holisticode/received_events","type":"User","site_admin":false},"repo":{"id":80787491,"name":"go-ethereum","full_name":"holisticode/go-ethereum","owner":{"login":"holisticode","id":88287,"avatar_url":"https://avatars3.githubusercontent.com/u/88287?v=4","gravatar_id":"","url":"https://api.github.com/users/holisticode","html_url":"https://github.com/holisticode","followers_url":"https://api.github.com/users/holisticode/followers","following_url":"https://api.github.com/users/holisticode/following{/other_user}","gists_url":"https://api.github.com/users/holisticode/gists{/gist_id}","starred_url":"https://api.github.com/users/holisticode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/holisticode/subscriptions","organizations_url":"https://api.github.com/users/holisticode/orgs","repos_url":"https://api.github.com/users/holisticode/repos","events_url":"https://api.github.com/users/holisticode/events{/privacy}","received_events_url":"https://api.github.com/users/holisticode/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/holisticode/go-ethereum","description":"Ethereum Go","fork":true,"url":"https://api.github.com/repos/holisticode/go-ethereum","forks_url":"https://api.github.com/repos/holisticode/go-ethereum/forks","keys_url":"https://api.github.com/repos/holisticode/go-ethereum/keys{/key_id}","collaborators_url":"https://api.github.com/repos/holisticode/go-ethereum/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/holisticode/go-ethereum/teams","hooks_url":"https://api.github.com/repos/holisticode/go-ethereum/hooks","issue_events_url":"https://api.github.com/repos/holisticode/go-ethereum/issues/events{/number}","events_url":"https://api.github.com/repos/holisticode/go-ethereum/events","assignees_url":"https://api.github.com/repos/holisticode/go-ethereum/assignees{/user}","branches_url":"https://api.github.com/repos/holisticode/go-ethereum/branches{/branch}","tags_url":"https://api.github.com/repos/holisticode/go-ethereum/tags","blobs_url":"https://api.github.com/repos/holisticode/go-ethereum/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/holisticode/go-ethereum/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/holisticode/go-ethereum/git/refs{/sha}","trees_url":"https://api.github.com/repos/holisticode/go-ethereum/git/trees{/sha}","statuses_url":"https://api.github.com/repos/holisticode/go-ethereum/statuses/{sha}","languages_url":"https://api.github.com/repos/holisticode/go-ethereum/languages","stargazers_url":"https://api.github.com/repos/holisticode/go-ethereum/stargazers","contributors_url":"https://api.github.com/repos/holisticode/go-ethereum/contributors","subscribers_url":"https://api.github.com/repos/holisticode/go-ethereum/subscribers","subscription_url":"https://api.github.com/repos/holisticode/go-ethereum/subscription","commits_url":"https://api.github.com/repos/holisticode/go-ethereum/commits{/sha}","git_commits_url":"https://api.github.com/repos/holisticode/go-ethereum/git/commits{/sha}","comments_url":"https://api.github.com/repos/holisticode/go-ethereum/comments{/number}","issue_comment_url":"https://api.github.com/repos/holisticode/go-ethereum/issues/comments{/number}","contents_url":"https://api.github.com/repos/holisticode/go-ethereum/contents/{+path}","compare_url":"https://api.github.com/repos/holisticode/go-ethereum/compare/{base}...{head}","merges_url":"https://api.github.com/repos/holisticode/go-ethereum/merges","archive_url":"https://api.github.com/repos/holisticode/go-ethereum/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/holisticode/go-ethereum/downloads","issues_url":"https://api.github.com/repos/holisticode/go-ethereum/issues{/number}","pulls_url":"https://api.github.com/repos/holisticode/go-ethereum/pulls{/number}","milestones_url":"https://api.github.com/repos/holisticode/go-ethereum/milestones{/number}","notifications_url":"https://api.github.com/repos/holisticode/go-ethereum/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/holisticode/go-ethereum/labels{/name}","releases_url":"https://api.github.com/repos/holisticode/go-ethereum/releases{/id}","deployments_url":"https://api.github.com/repos/holisticode/go-ethereum/deployments","created_at":"2017-02-03T01:45:52Z","updated_at":"2017-02-03T01:46:03Z","pushed_at":"2018-04-11T21:51:28Z","git_url":"git://github.com/holisticode/go-ethereum.git","ssh_url":"git@github.com:holisticode/go-ethereum.git","clone_url":"https://github.com/holisticode/go-ethereum.git","svn_url":"https://github.com/holisticode/go-ethereum","homepage":"","size":87741,"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":"lgpl-3.0","name":"GNU Lesser General Public License v3.0","spdx_id":"LGPL-3.0","url":"https://api.github.com/licenses/lgpl-3.0"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ethersphere:swarm-network-rewrite","ref":"swarm-network-rewrite","sha":"5b7c6dac0e2e2af901c7cdc697c5f26ae154443d","user":{"login":"ethersphere","id":6946989,"avatar_url":"https://avatars2.githubusercontent.com/u/6946989?v=4","gravatar_id":"","url":"https://api.github.com/users/ethersphere","html_url":"https://github.com/ethersphere","followers_url":"https://api.github.com/users/ethersphere/followers","following_url":"https://api.github.com/users/ethersphere/following{/other_user}","gists_url":"https://api.github.com/users/ethersphere/gists{/gist_id}","starred_url":"https://api.github.com/users/ethersphere/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethersphere/subscriptions","organizations_url":"https://api.github.com/users/ethersphere/orgs","repos_url":"https://api.github.com/users/ethersphere/repos","events_url":"https://api.github.com/users/ethersphere/events{/privacy}","received_events_url":"https://api.github.com/users/ethersphere/received_events","type":"Organization","site_admin":false},"repo":{"id":17790136,"name":"go-ethereum","full_name":"ethersphere/go-ethereum","owner":{"login":"ethersphere","id":6946989,"avatar_url":"https://avatars2.githubusercontent.com/u/6946989?v=4","gravatar_id":"","url":"https://api.github.com/users/ethersphere","html_url":"https://github.com/ethersphere","followers_url":"https://api.github.com/users/ethersphere/followers","following_url":"https://api.github.com/users/ethersphere/following{/other_user}","gists_url":"https://api.github.com/users/ethersphere/gists{/gist_id}","starred_url":"https://api.github.com/users/ethersphere/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethersphere/subscriptions","organizations_url":"https://api.github.com/users/ethersphere/orgs","repos_url":"https://api.github.com/users/ethersphere/repos","events_url":"https://api.github.com/users/ethersphere/events{/privacy}","received_events_url":"https://api.github.com/users/ethersphere/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ethersphere/go-ethereum","description":"Ethereum Go","fork":true,"url":"https://api.github.com/repos/ethersphere/go-ethereum","forks_url":"https://api.github.com/repos/ethersphere/go-ethereum/forks","keys_url":"https://api.github.com/repos/ethersphere/go-ethereum/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ethersphere/go-ethereum/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ethersphere/go-ethereum/teams","hooks_url":"https://api.github.com/repos/ethersphere/go-ethereum/hooks","issue_events_url":"https://api.github.com/repos/ethersphere/go-ethereum/issues/events{/number}","events_url":"https://api.github.com/repos/ethersphere/go-ethereum/events","assignees_url":"https://api.github.com/repos/ethersphere/go-ethereum/assignees{/user}","branches_url":"https://api.github.com/repos/ethersphere/go-ethereum/branches{/branch}","tags_url":"https://api.github.com/repos/ethersphere/go-ethereum/tags","blobs_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/refs{/sha}","trees_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ethersphere/go-ethereum/statuses/{sha}","languages_url":"https://api.github.com/repos/ethersphere/go-ethereum/languages","stargazers_url":"https://api.github.com/repos/ethersphere/go-ethereum/stargazers","contributors_url":"https://api.github.com/repos/ethersphere/go-ethereum/contributors","subscribers_url":"https://api.github.com/repos/ethersphere/go-ethereum/subscribers","subscription_url":"https://api.github.com/repos/ethersphere/go-ethereum/subscription","commits_url":"https://api.github.com/repos/ethersphere/go-ethereum/commits{/sha}","git_commits_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/commits{/sha}","comments_url":"https://api.github.com/repos/ethersphere/go-ethereum/comments{/number}","issue_comment_url":"https://api.github.com/repos/ethersphere/go-ethereum/issues/comments{/number}","contents_url":"https://api.github.com/repos/ethersphere/go-ethereum/contents/{+path}","compare_url":"https://api.github.com/repos/ethersphere/go-ethereum/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ethersphere/go-ethereum/merges","archive_url":"https://api.github.com/repos/ethersphere/go-ethereum/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ethersphere/go-ethereum/downloads","issues_url":"https://api.github.com/repos/ethersphere/go-ethereum/issues{/number}","pulls_url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls{/number}","milestones_url":"https://api.github.com/repos/ethersphere/go-ethereum/milestones{/number}","notifications_url":"https://api.github.com/repos/ethersphere/go-ethereum/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ethersphere/go-ethereum/labels{/name}","releases_url":"https://api.github.com/repos/ethersphere/go-ethereum/releases{/id}","deployments_url":"https://api.github.com/repos/ethersphere/go-ethereum/deployments","created_at":"2014-03-16T02:06:34Z","updated_at":"2018-04-11T17:24:32Z","pushed_at":"2018-04-11T22:05:35Z","git_url":"git://github.com/ethersphere/go-ethereum.git","ssh_url":"git@github.com:ethersphere/go-ethereum.git","clone_url":"https://github.com/ethersphere/go-ethereum.git","svn_url":"https://github.com/ethersphere/go-ethereum","homepage":"","size":205760,"stargazers_count":84,"watchers_count":84,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":20,"mirror_url":null,"archived":false,"open_issues_count":92,"license":{"key":"lgpl-3.0","name":"GNU Lesser General Public License v3.0","spdx_id":"LGPL-3.0","url":"https://api.github.com/licenses/lgpl-3.0"},"forks":20,"open_issues":92,"watchers":84,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/387"},"html":{"href":"https://github.com/ethersphere/go-ethereum/pull/387"},"issue":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/issues/387"},"comments":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/issues/387/comments"},"review_comments":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/387/comments"},"review_comment":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/387/commits"},"statuses":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/statuses/e9ed0cb7ab77d7b8db18ddb252c360a8970c0b73"}},"author_association":"NONE"}}
{"actor":{"display_login":"zelig"}}