{"action":"created","comment":{"url":"https://api.github.com/repos/insolar/insolar/pulls/comments/242059898","pull_request_review_id":185481239,"id":242059898,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MjA1OTg5OA==","diff_hunk":"@@ -48,72 +51,152 @@ func (sp *SecondPhase) Execute(ctx context.Context, state *FirstPhaseState) (*Se\n \tglobuleHash, globuleProof, err := sp.Calculator.GetGlobuleProof(entry)\n \n \tif err != nil {\n-\t\treturn nil, errors.Wrap(err, \"[ Execute ] Failed to calculate pulse proof.\")\n+\t\treturn nil, errors.Wrap(err, \"[ SecondPhase ] Failed to calculate pulse proof.\")\n \t}\n \n \tpacket := packets.Phase2Packet{}\n \terr = packet.SetGlobuleHashSignature(globuleProof.Signature.Bytes())\n \tif err != nil {\n-\t\treturn nil, errors.Wrap(err, \"[ Execute ] Failed to set pulse proof in Phase2Packet.\")\n+\t\treturn nil, errors.Wrap(err, \"[ SecondPhase ] Failed to set pulse proof in Phase2Packet.\")\n \t}\n-\tbitset, err := generatePhase2Bitset(state.UnsyncList, state.ValidProofs)\n+\tbitset, err := sp.generatePhase2Bitset(state.UnsyncList, state.ValidProofs)\n \tif err != nil {\n-\t\treturn nil, errors.Wrap(err, \"[ Execute ] Failed to generate bitset for Phase2Packet\")\n+\t\treturn nil, errors.Wrap(err, \"[ SecondPhase ] Failed to generate bitset for Phase2Packet\")\n \t}\n \tpacket.SetBitSet(bitset)\n \terr = sp.signPhase2Packet(&packet)\n \tif err != nil {\n-\t\treturn nil, errors.Wrap(err, \"failed to sign a packet\")\n+\t\treturn nil, errors.Wrap(err, \"[ SecondPhase ] Failed to sign a packet\")\n \t}\n \tactiveNodes := state.UnsyncList.GetActiveNodes()\n-\tpackets, err := sp.Communicator.ExchangePhase2(ctx, activeNodes, &packet)\n+\tpackets, err := sp.Communicator.ExchangePhase2(ctx, state.UnsyncList, activeNodes, &packet)\n \tif err != nil {\n-\t\treturn nil, errors.Wrap(err, \"[ Execute ] Failed to exchange results.\")\n+\t\treturn nil, errors.Wrap(err, \"[ SecondPhase ] Failed to exchange results.\")\n \t}\n \n-\tnodeProofs := make(map[core.Node]*merkle.GlobuleProof)\n+\t// nodeProofs := make(map[core.Node]*GlobuleProofValidated)\n+\tstateMatrix := NewStateMatrix(state.UnsyncList)\n \n \tfor ref, packet := range packets {\n \t\tsignIsCorrect, err := sp.isSignPhase2PacketRight(packet, ref)\n \t\tif err != nil {\n-\t\t\tlog.Warn(\"failed to check a sign: \", err.Error())\n-\t\t} else if !signIsCorrect {\n-\t\t\tlog.Warn(\"recieved a bad sign packet: \", err.Error())\n+\t\t\tinslogger.FromContext(ctx).Warnf(\"Failed to check phase2 packet signature from %s: %s\", ref, err.Error())\n+\t\t\tcontinue\n \t\t}\n-\t\tnode := state.UnsyncList.GetActiveNode(ref)\n-\t\tproof := &merkle.GlobuleProof{\n-\t\t\tBaseProof: merkle.BaseProof{\n-\t\t\t\tSignature: core.SignatureFromBytes(packet.GetGlobuleHashSignature()),\n-\t\t\t},\n-\t\t\tPrevCloudHash: prevCloudHash,\n-\t\t\tGlobuleID:     globuleProof.GlobuleID,\n-\t\t\tNodeCount:     globuleProof.NodeCount,\n-\t\t\tNodeRoot:      globuleProof.NodeRoot,\n+\t\tif !signIsCorrect {\n+\t\t\tinslogger.FromContext(ctx).Warnf(\"Received phase2 packet from %s with bad signature\", ref)\n+\t\t\tcontinue\n \t\t}\n-\n-\t\tif !sp.Calculator.IsValid(proof, globuleHash, node.PublicKey()) {\n-\t\t\tnodeProofs[node] = proof\n+\t\tghs := packet.GetGlobuleHashSignature()\n+\t\tstate.UnsyncList.SetGlobuleHashSignature(ref, ghs)\n+\t\terr = stateMatrix.ApplyBitSet(ref, packet.GetBitSet())\n+\t\tif err != nil {\n+\t\t\tlog.Warnf(\"[ SecondPhase ] Could not apply bitset from node %s\", ref)\n+\t\t\tcontinue\n \t\t}\n+\t\t// node := state.UnsyncList.GetActiveNode(ref)\n+\t\t// proof := &merkle.GlobuleProof{\n+\t\t// \tBaseProof: merkle.BaseProof{\n+\t\t// \t\tSignature: core.SignatureFromBytes(ghs[:]),\n+\t\t// \t},\n+\t\t// \tPrevCloudHash: prevCloudHash,\n+\t\t// \tGlobuleID:     globuleProof.GlobuleID,\n+\t\t// \tNodeCount:     globuleProof.NodeCount,\n+\t\t// \tNodeRoot:      globuleProof.NodeRoot,\n+\t\t// }\n+\t\t// valid := sp.Calculator.IsValid(proof, globuleHash, node.PublicKey())\n+\t\t// nodeProofs[node] = &GlobuleProofValidated{Proof: proof, Valid: valid}\n \t}\n \n-\t// TODO: check\n-\tif !consensusReached(len(nodeProofs), len(activeNodes)) {\n-\t\treturn nil, errors.New(\"[ Execute ] Consensus not reached\")\n+\tmatrixCalculation, err := stateMatrix.CalculatePhase2(sp.NodeKeeper.GetOrigin().ID())\n+\tif err != nil {\n+\t\treturn nil, errors.Wrap(err, \"[ SecondPhase ] Failed to calculate bitset matrix consensus result\")\n \t}\n \n-\t// TODO: timeouts, deviants, etc.\n-\tsp.NodeKeeper.Sync(state.UnsyncList)\n \treturn &SecondPhaseState{\n \t\tFirstPhaseState: state,\n-\n-\t\tGlobuleEntry:    entry,\n-\t\tGlobuleHash:     globuleHash,\n-\t\tGlobuleProof:    globuleProof,\n-\t\tGlobuleProofSet: nodeProofs,\n+\t\tMatrix:          stateMatrix,\n+\t\tMatrixState:     matrixCalculation,\n+\t\tBitSet:          bitset,\n+\n+\t\tGlobuleEntry: entry,\n+\t\tGlobuleHash:  globuleHash,\n+\t\tGlobuleProof: globuleProof,\n+\t\t// GlobuleProofSet: nodeProofs,\n \t}, nil\n }\n \n-func generatePhase2Bitset(list network.UnsyncList, proofs map[core.Node]*merkle.PulseProof) (packets.BitSet, error) {\n+func (sp *SecondPhase) Execute21(ctx context.Context, state *SecondPhaseState) (*SecondPhaseState, error) {\n+\tadditionalRequests := state.MatrixState.AdditionalRequestsPhase2\n+\tif len(additionalRequests) == 0 {\n+\t\treturn state, nil\n+\t}\n+\n+\tcount := len(additionalRequests)\n+\tresults := make(map[uint16]*packets.MissingNodeSupplementaryVote)\n+\tclaims := make(map[uint16]*packets.MissingNodeClaim)\n+\n+\tpacket := packets.Phase2Packet{}\n+\terr := packet.SetGlobuleHashSignature(state.GlobuleProof.Signature.Bytes())\n+\tif err != nil {\n+\t\treturn nil, errors.Wrap(err, \"[ Phase 2.1 ] Failed to set pulse proof in Phase2Packet.\")\n+\t}\n+\tpacket.SetBitSet(state.BitSet)\n+\terr = sp.signPhase2Packet(&packet)\n+\tif err != nil {\n+\t\treturn nil, errors.Wrap(err, \"[ Phase 2.1 ] Failed to sign a packet\")\n+\t}\n+\n+\tvoteAnswers, err := sp.Communicator.ExchangePhase21(ctx, state.UnsyncList, &packet, additionalRequests)\n+\tif err != nil {\n+\t\treturn nil, errors.Wrap(err, \"[ Phase 2.1 ] Failed to send additional requests.\")\n+\t}\n+\n+\tfor _, vote := range voteAnswers {\n+\t\tswitch v := vote.(type) {\n+\t\tcase *packets.MissingNodeSupplementaryVote:\n+\t\t\tresults[v.NodeIndex] = v\n+\t\tcase *packets.MissingNodeClaim:\n+\t\t\tclaims[v.NodeIndex] = v\n+\t\t}\n+\t}\n+\n+\tif len(results) != count {\n+\t\treturn nil, errors.New(fmt.Sprintf(\"[ Phase 2.1 ] Failed to receive enough MissingNodeSupplementaryVote responses,\"+\n+\t\t\t\" received: %d/%d\", len(results), count))\n+\t}\n+\n+\torigin := sp.NodeKeeper.GetOrigin().ID()\n+\tfor index, result := range results {\n+\t\tnode, err := nodenetwork.ClaimToNode(\"\", &result.NodeClaimUnsigned)\n+\t\tif err != nil {\n+\t\t\treturn nil, errors.Wrapf(err, \"[ Phase 2.1 ] Failed to convert claim to node, ref: %s\", result.NodeClaimUnsigned.NodeRef)\n+\t\t}\n+\t\tstate.UnsyncList.AddNode(node, index)\n+\t\tstate.UnsyncList.AddProof(node.ID(), &result.NodePulseProof)\n+\t\tstate.UnsyncList.SetGlobuleHashSignature(node.ID(), result.GlobuleHashSignature)\n+\t\tstate.Matrix.ReceivedProofFromNode(origin, node.ID())\n+\t}\n+\tclaimMap := make(map[core.RecordRef][]packets.ReferendumClaim)\n+\tfor index, claim := range claims {\n+\t\tref, err := state.UnsyncList.IndexToRef(int(index))\n+\t\tif err != nil {\n+\t\t\treturn nil, errors.Wrapf(err, \"[ Phase 2.1 ] Failed to map index %d to ref\", index)\n+\t\t}\n+\t\tlist := claimMap[ref]\n+\t\tif list == nil {\n+\t\t\tlist = make([]packets.ReferendumClaim, 0)\n+\t\t}\n+\t\tlist = append(list, claim.Claim)\n+\t\tclaimMap[ref] = list\n+\t}\n+\tstate.UnsyncList.AddClaims(claimMap)\n+\tstate.MatrixState, err = state.Matrix.CalculatePhase2(origin)","path":"consensus/phases/secondphase.go","position":194,"original_position":194,"commit_id":"d9c336cddc078381215a7aa4456b0c9dd0b882b1","original_commit_id":"d9c336cddc078381215a7aa4456b0c9dd0b882b1","user":{"login":"golangcibot","id":42910462,"node_id":"MDQ6VXNlcjQyOTEwNDYy","avatar_url":"https://avatars1.githubusercontent.com/u/42910462?v=4","gravatar_id":"","url":"https://api.github.com/users/golangcibot","html_url":"https://github.com/golangcibot","followers_url":"https://api.github.com/users/golangcibot/followers","following_url":"https://api.github.com/users/golangcibot/following{/other_user}","gists_url":"https://api.github.com/users/golangcibot/gists{/gist_id}","starred_url":"https://api.github.com/users/golangcibot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/golangcibot/subscriptions","organizations_url":"https://api.github.com/users/golangcibot/orgs","repos_url":"https://api.github.com/users/golangcibot/repos","events_url":"https://api.github.com/users/golangcibot/events{/privacy}","received_events_url":"https://api.github.com/users/golangcibot/received_events","type":"User","site_admin":false},"body":"ineffectual assignment to `err` (from `ineffassign`)","created_at":"2018-12-17T08:40:26Z","updated_at":"2018-12-17T08:40:27Z","html_url":"https://github.com/insolar/insolar/pull/810#discussion_r242059898","pull_request_url":"https://api.github.com/repos/insolar/insolar/pulls/810","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/insolar/insolar/pulls/comments/242059898"},"html":{"href":"https://github.com/insolar/insolar/pull/810#discussion_r242059898"},"pull_request":{"href":"https://api.github.com/repos/insolar/insolar/pulls/810"}}},"pull_request":{"url":"https://api.github.com/repos/insolar/insolar/pulls/810","id":239063933,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM5MDYzOTMz","html_url":"https://github.com/insolar/insolar/pull/810","diff_url":"https://github.com/insolar/insolar/pull/810.diff","patch_url":"https://github.com/insolar/insolar/pull/810.patch","issue_url":"https://api.github.com/repos/insolar/insolar/issues/810","number":810,"state":"open","locked":false,"title":"NET-6: phase 2.1","user":{"login":"krestkrest","id":20128511,"node_id":"MDQ6VXNlcjIwMTI4NTEx","avatar_url":"https://avatars0.githubusercontent.com/u/20128511?v=4","gravatar_id":"","url":"https://api.github.com/users/krestkrest","html_url":"https://github.com/krestkrest","followers_url":"https://api.github.com/users/krestkrest/followers","following_url":"https://api.github.com/users/krestkrest/following{/other_user}","gists_url":"https://api.github.com/users/krestkrest/gists{/gist_id}","starred_url":"https://api.github.com/users/krestkrest/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/krestkrest/subscriptions","organizations_url":"https://api.github.com/users/krestkrest/orgs","repos_url":"https://api.github.com/users/krestkrest/repos","events_url":"https://api.github.com/users/krestkrest/events{/privacy}","received_events_url":"https://api.github.com/users/krestkrest/received_events","type":"User","site_admin":false},"body":"**- What I did**\r\nPhase 2.1 complete and various consensus fixes\r\n","created_at":"2018-12-17T08:39:34Z","updated_at":"2018-12-17T08:40:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"assignees":[],"requested_reviewers":[{"login":"nordicdyno","id":47291,"node_id":"MDQ6VXNlcjQ3Mjkx","avatar_url":"https://avatars2.githubusercontent.com/u/47291?v=4","gravatar_id":"","url":"https://api.github.com/users/nordicdyno","html_url":"https://github.com/nordicdyno","followers_url":"https://api.github.com/users/nordicdyno/followers","following_url":"https://api.github.com/users/nordicdyno/following{/other_user}","gists_url":"https://api.github.com/users/nordicdyno/gists{/gist_id}","starred_url":"https://api.github.com/users/nordicdyno/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nordicdyno/subscriptions","organizations_url":"https://api.github.com/users/nordicdyno/orgs","repos_url":"https://api.github.com/users/nordicdyno/repos","events_url":"https://api.github.com/users/nordicdyno/events{/privacy}","received_events_url":"https://api.github.com/users/nordicdyno/received_events","type":"User","site_admin":false},{"login":"dmitry-panchenko","id":4153268,"node_id":"MDQ6VXNlcjQxNTMyNjg=","avatar_url":"https://avatars2.githubusercontent.com/u/4153268?v=4","gravatar_id":"","url":"https://api.github.com/users/dmitry-panchenko","html_url":"https://github.com/dmitry-panchenko","followers_url":"https://api.github.com/users/dmitry-panchenko/followers","following_url":"https://api.github.com/users/dmitry-panchenko/following{/other_user}","gists_url":"https://api.github.com/users/dmitry-panchenko/gists{/gist_id}","starred_url":"https://api.github.com/users/dmitry-panchenko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dmitry-panchenko/subscriptions","organizations_url":"https://api.github.com/users/dmitry-panchenko/orgs","repos_url":"https://api.github.com/users/dmitry-panchenko/repos","events_url":"https://api.github.com/users/dmitry-panchenko/events{/privacy}","received_events_url":"https://api.github.com/users/dmitry-panchenko/received_events","type":"User","site_admin":false},{"login":"egorikas","id":6932844,"node_id":"MDQ6VXNlcjY5MzI4NDQ=","avatar_url":"https://avatars3.githubusercontent.com/u/6932844?v=4","gravatar_id":"","url":"https://api.github.com/users/egorikas","html_url":"https://github.com/egorikas","followers_url":"https://api.github.com/users/egorikas/followers","following_url":"https://api.github.com/users/egorikas/following{/other_user}","gists_url":"https://api.github.com/users/egorikas/gists{/gist_id}","starred_url":"https://api.github.com/users/egorikas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/egorikas/subscriptions","organizations_url":"https://api.github.com/users/egorikas/orgs","repos_url":"https://api.github.com/users/egorikas/repos","events_url":"https://api.github.com/users/egorikas/events{/privacy}","received_events_url":"https://api.github.com/users/egorikas/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/insolar/insolar/pulls/810/commits","review_comments_url":"https://api.github.com/repos/insolar/insolar/pulls/810/comments","review_comment_url":"https://api.github.com/repos/insolar/insolar/pulls/comments{/number}","comments_url":"https://api.github.com/repos/insolar/insolar/issues/810/comments","statuses_url":"https://api.github.com/repos/insolar/insolar/statuses/d9c336cddc078381215a7aa4456b0c9dd0b882b1","head":{"label":"insolar:NET-6-phase-2.1","ref":"NET-6-phase-2.1","sha":"d9c336cddc078381215a7aa4456b0c9dd0b882b1","user":{"login":"insolar","id":31775388,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNzc1Mzg4","avatar_url":"https://avatars1.githubusercontent.com/u/31775388?v=4","gravatar_id":"","url":"https://api.github.com/users/insolar","html_url":"https://github.com/insolar","followers_url":"https://api.github.com/users/insolar/followers","following_url":"https://api.github.com/users/insolar/following{/other_user}","gists_url":"https://api.github.com/users/insolar/gists{/gist_id}","starred_url":"https://api.github.com/users/insolar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/insolar/subscriptions","organizations_url":"https://api.github.com/users/insolar/orgs","repos_url":"https://api.github.com/users/insolar/repos","events_url":"https://api.github.com/users/insolar/events{/privacy}","received_events_url":"https://api.github.com/users/insolar/received_events","type":"Organization","site_admin":false},"repo":{"id":139829328,"node_id":"MDEwOlJlcG9zaXRvcnkxMzk4MjkzMjg=","name":"insolar","full_name":"insolar/insolar","private":false,"owner":{"login":"insolar","id":31775388,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNzc1Mzg4","avatar_url":"https://avatars1.githubusercontent.com/u/31775388?v=4","gravatar_id":"","url":"https://api.github.com/users/insolar","html_url":"https://github.com/insolar","followers_url":"https://api.github.com/users/insolar/followers","following_url":"https://api.github.com/users/insolar/following{/other_user}","gists_url":"https://api.github.com/users/insolar/gists{/gist_id}","starred_url":"https://api.github.com/users/insolar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/insolar/subscriptions","organizations_url":"https://api.github.com/users/insolar/orgs","repos_url":"https://api.github.com/users/insolar/repos","events_url":"https://api.github.com/users/insolar/events{/privacy}","received_events_url":"https://api.github.com/users/insolar/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/insolar/insolar","description":"Enterprise-ready blockchain platform","fork":false,"url":"https://api.github.com/repos/insolar/insolar","forks_url":"https://api.github.com/repos/insolar/insolar/forks","keys_url":"https://api.github.com/repos/insolar/insolar/keys{/key_id}","collaborators_url":"https://api.github.com/repos/insolar/insolar/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/insolar/insolar/teams","hooks_url":"https://api.github.com/repos/insolar/insolar/hooks","issue_events_url":"https://api.github.com/repos/insolar/insolar/issues/events{/number}","events_url":"https://api.github.com/repos/insolar/insolar/events","assignees_url":"https://api.github.com/repos/insolar/insolar/assignees{/user}","branches_url":"https://api.github.com/repos/insolar/insolar/branches{/branch}","tags_url":"https://api.github.com/repos/insolar/insolar/tags","blobs_url":"https://api.github.com/repos/insolar/insolar/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/insolar/insolar/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/insolar/insolar/git/refs{/sha}","trees_url":"https://api.github.com/repos/insolar/insolar/git/trees{/sha}","statuses_url":"https://api.github.com/repos/insolar/insolar/statuses/{sha}","languages_url":"https://api.github.com/repos/insolar/insolar/languages","stargazers_url":"https://api.github.com/repos/insolar/insolar/stargazers","contributors_url":"https://api.github.com/repos/insolar/insolar/contributors","subscribers_url":"https://api.github.com/repos/insolar/insolar/subscribers","subscription_url":"https://api.github.com/repos/insolar/insolar/subscription","commits_url":"https://api.github.com/repos/insolar/insolar/commits{/sha}","git_commits_url":"https://api.github.com/repos/insolar/insolar/git/commits{/sha}","comments_url":"https://api.github.com/repos/insolar/insolar/comments{/number}","issue_comment_url":"https://api.github.com/repos/insolar/insolar/issues/comments{/number}","contents_url":"https://api.github.com/repos/insolar/insolar/contents/{+path}","compare_url":"https://api.github.com/repos/insolar/insolar/compare/{base}...{head}","merges_url":"https://api.github.com/repos/insolar/insolar/merges","archive_url":"https://api.github.com/repos/insolar/insolar/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/insolar/insolar/downloads","issues_url":"https://api.github.com/repos/insolar/insolar/issues{/number}","pulls_url":"https://api.github.com/repos/insolar/insolar/pulls{/number}","milestones_url":"https://api.github.com/repos/insolar/insolar/milestones{/number}","notifications_url":"https://api.github.com/repos/insolar/insolar/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/insolar/insolar/labels{/name}","releases_url":"https://api.github.com/repos/insolar/insolar/releases{/id}","deployments_url":"https://api.github.com/repos/insolar/insolar/deployments","created_at":"2018-07-05T09:49:28Z","updated_at":"2018-12-14T21:39:19Z","pushed_at":"2018-12-17T08:39:35Z","git_url":"git://github.com/insolar/insolar.git","ssh_url":"git@github.com:insolar/insolar.git","clone_url":"https://github.com/insolar/insolar.git","svn_url":"https://github.com/insolar/insolar","homepage":"https://insolar.io","size":20423,"stargazers_count":50,"watchers_count":50,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":12,"mirror_url":null,"archived":false,"open_issues_count":9,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":12,"open_issues":9,"watchers":50,"default_branch":"master"}},"base":{"label":"insolar:NET-integration","ref":"NET-integration","sha":"c25e018c0b7244597cbff37910456477dbd35c37","user":{"login":"insolar","id":31775388,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNzc1Mzg4","avatar_url":"https://avatars1.githubusercontent.com/u/31775388?v=4","gravatar_id":"","url":"https://api.github.com/users/insolar","html_url":"https://github.com/insolar","followers_url":"https://api.github.com/users/insolar/followers","following_url":"https://api.github.com/users/insolar/following{/other_user}","gists_url":"https://api.github.com/users/insolar/gists{/gist_id}","starred_url":"https://api.github.com/users/insolar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/insolar/subscriptions","organizations_url":"https://api.github.com/users/insolar/orgs","repos_url":"https://api.github.com/users/insolar/repos","events_url":"https://api.github.com/users/insolar/events{/privacy}","received_events_url":"https://api.github.com/users/insolar/received_events","type":"Organization","site_admin":false},"repo":{"id":139829328,"node_id":"MDEwOlJlcG9zaXRvcnkxMzk4MjkzMjg=","name":"insolar","full_name":"insolar/insolar","private":false,"owner":{"login":"insolar","id":31775388,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNzc1Mzg4","avatar_url":"https://avatars1.githubusercontent.com/u/31775388?v=4","gravatar_id":"","url":"https://api.github.com/users/insolar","html_url":"https://github.com/insolar","followers_url":"https://api.github.com/users/insolar/followers","following_url":"https://api.github.com/users/insolar/following{/other_user}","gists_url":"https://api.github.com/users/insolar/gists{/gist_id}","starred_url":"https://api.github.com/users/insolar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/insolar/subscriptions","organizations_url":"https://api.github.com/users/insolar/orgs","repos_url":"https://api.github.com/users/insolar/repos","events_url":"https://api.github.com/users/insolar/events{/privacy}","received_events_url":"https://api.github.com/users/insolar/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/insolar/insolar","description":"Enterprise-ready blockchain platform","fork":false,"url":"https://api.github.com/repos/insolar/insolar","forks_url":"https://api.github.com/repos/insolar/insolar/forks","keys_url":"https://api.github.com/repos/insolar/insolar/keys{/key_id}","collaborators_url":"https://api.github.com/repos/insolar/insolar/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/insolar/insolar/teams","hooks_url":"https://api.github.com/repos/insolar/insolar/hooks","issue_events_url":"https://api.github.com/repos/insolar/insolar/issues/events{/number}","events_url":"https://api.github.com/repos/insolar/insolar/events","assignees_url":"https://api.github.com/repos/insolar/insolar/assignees{/user}","branches_url":"https://api.github.com/repos/insolar/insolar/branches{/branch}","tags_url":"https://api.github.com/repos/insolar/insolar/tags","blobs_url":"https://api.github.com/repos/insolar/insolar/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/insolar/insolar/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/insolar/insolar/git/refs{/sha}","trees_url":"https://api.github.com/repos/insolar/insolar/git/trees{/sha}","statuses_url":"https://api.github.com/repos/insolar/insolar/statuses/{sha}","languages_url":"https://api.github.com/repos/insolar/insolar/languages","stargazers_url":"https://api.github.com/repos/insolar/insolar/stargazers","contributors_url":"https://api.github.com/repos/insolar/insolar/contributors","subscribers_url":"https://api.github.com/repos/insolar/insolar/subscribers","subscription_url":"https://api.github.com/repos/insolar/insolar/subscription","commits_url":"https://api.github.com/repos/insolar/insolar/commits{/sha}","git_commits_url":"https://api.github.com/repos/insolar/insolar/git/commits{/sha}","comments_url":"https://api.github.com/repos/insolar/insolar/comments{/number}","issue_comment_url":"https://api.github.com/repos/insolar/insolar/issues/comments{/number}","contents_url":"https://api.github.com/repos/insolar/insolar/contents/{+path}","compare_url":"https://api.github.com/repos/insolar/insolar/compare/{base}...{head}","merges_url":"https://api.github.com/repos/insolar/insolar/merges","archive_url":"https://api.github.com/repos/insolar/insolar/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/insolar/insolar/downloads","issues_url":"https://api.github.com/repos/insolar/insolar/issues{/number}","pulls_url":"https://api.github.com/repos/insolar/insolar/pulls{/number}","milestones_url":"https://api.github.com/repos/insolar/insolar/milestones{/number}","notifications_url":"https://api.github.com/repos/insolar/insolar/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/insolar/insolar/labels{/name}","releases_url":"https://api.github.com/repos/insolar/insolar/releases{/id}","deployments_url":"https://api.github.com/repos/insolar/insolar/deployments","created_at":"2018-07-05T09:49:28Z","updated_at":"2018-12-14T21:39:19Z","pushed_at":"2018-12-17T08:39:35Z","git_url":"git://github.com/insolar/insolar.git","ssh_url":"git@github.com:insolar/insolar.git","clone_url":"https://github.com/insolar/insolar.git","svn_url":"https://github.com/insolar/insolar","homepage":"https://insolar.io","size":20423,"stargazers_count":50,"watchers_count":50,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":12,"mirror_url":null,"archived":false,"open_issues_count":9,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":12,"open_issues":9,"watchers":50,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/insolar/insolar/pulls/810"},"html":{"href":"https://github.com/insolar/insolar/pull/810"},"issue":{"href":"https://api.github.com/repos/insolar/insolar/issues/810"},"comments":{"href":"https://api.github.com/repos/insolar/insolar/issues/810/comments"},"review_comments":{"href":"https://api.github.com/repos/insolar/insolar/pulls/810/comments"},"review_comment":{"href":"https://api.github.com/repos/insolar/insolar/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/insolar/insolar/pulls/810/commits"},"statuses":{"href":"https://api.github.com/repos/insolar/insolar/statuses/d9c336cddc078381215a7aa4456b0c9dd0b882b1"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"golangcibot"}}