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

[chain] Remove Parent Block Dependency during Verify #427

Merged
merged 28 commits into from
Aug 31, 2023

Conversation

patrick-ogrady
Copy link
Contributor

@patrick-ogrady patrick-ogrady commented Aug 28, 2023

TODO

  • update comments/handling around where a block reprocessing could get triggered
  • Add comment to GetBlockIDAtHeight that this is only called pre-ProposerVM fork
  • Fix genesis block init (roots are messed up)
  • Can we just verify the last accepted block when state sync finishes? otherwise we may not be able to build (right now we consider verifying blocks in 3 places) -> won't be able to ensure no repeats but should be able to process already accepted block -> Because we don't control when state sync will finish (may be during Verify/Accept), we can't get away from having to handle parent verification during child verify/accept.
  • Don't check for duplicate txs if block is already accepted

@patrick-ogrady patrick-ogrady changed the base branch from main to defer-root-v3 August 28, 2023 15:29
@patrick-ogrady patrick-ogrady changed the title [chain] Remove Parent Block Dependency + Only Store Genesis/Latest [chain] Remove Parent Block Dependency Aug 28, 2023
@patrick-ogrady patrick-ogrady changed the title [chain] Remove Parent Block Dependency [chain] Remove Parent Block Dependency during Verify Aug 28, 2023
@patrick-ogrady
Copy link
Contributor Author

[08-29|17:45:33.229] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> handler/handler.go:454 forwarding sync message to consensus {"nodeID": "NodeID-E1Gnu5Uzv3dgTLfPYqZP8ekRsshPAmL7D", "messageOp": "put"}
[08-29|17:45:33.229] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/transitive.go:886 block verification failed {"error": "rpc error: code = Unknown desc = not found"}
[08-29|17:45:33.229] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:58 filtering poll results {"result": "Bag[ids.ID]: (Size = 20)\n    HqciyQT3Q6xsZ9uKE1zBLgCsnFidntT5ebwYtQ4XxRARmCxDm: 3\n    YyLMJK4JtSk8sS8pRdYDLzkn12g2mPDskUrAK87RuVwaH3mru: 9\n    2E1r6NJPKA14U6QHTBvsdRyJfxJ4R5jFwV8fVnQxNsuodfTnfj: 3\n    2ZYV98zdCGsV6BV2x9phMAf1WAJCZiRPLX4zMvoju1uGz1JBdH: 5"}
[08-29|17:45:33.229] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "HqciyQT3Q6xsZ9uKE1zBLgCsnFidntT5ebwYtQ4XxRARmCxDm", "numVotes": 3, "voteID": "HqciyQT3Q6xsZ9uKE1zBLgCsnFidntT5ebwYtQ4XxRARmCxDm", "error": "not found"}
[08-29|17:45:33.229] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "YyLMJK4JtSk8sS8pRdYDLzkn12g2mPDskUrAK87RuVwaH3mru", "numVotes": 9, "voteID": "YyLMJK4JtSk8sS8pRdYDLzkn12g2mPDskUrAK87RuVwaH3mru", "error": "not found"}
[08-29|17:45:33.229] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "2ZYV98zdCGsV6BV2x9phMAf1WAJCZiRPLX4zMvoju1uGz1JBdH", "numVotes": 5, "voteID": "2ZYV98zdCGsV6BV2x9phMAf1WAJCZiRPLX4zMvoju1uGz1JBdH", "error": "not found"}
[08-29|17:45:33.229] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "2E1r6NJPKA14U6QHTBvsdRyJfxJ4R5jFwV8fVnQxNsuodfTnfj", "numVotes": 3, "voteID": "2E1r6NJPKA14U6QHTBvsdRyJfxJ4R5jFwV8fVnQxNsuodfTnfj", "error": "not found"}
[08-29|17:45:33.229] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:65 finishing poll {"result": "Bag[ids.ID]: (Size = 0)"}
[08-29|17:45:33.229] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:87 Snowman engine can't quiesce
[08-29|17:45:33.229] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:58 filtering poll results {"result": "Bag[ids.ID]: (Size = 20)\n    YyLMJK4JtSk8sS8pRdYDLzkn12g2mPDskUrAK87RuVwaH3mru: 5\n    2ZYV98zdCGsV6BV2x9phMAf1WAJCZiRPLX4zMvoju1uGz1JBdH: 6\n    HqciyQT3Q6xsZ9uKE1zBLgCsnFidntT5ebwYtQ4XxRARmCxDm: 3\n    2E1r6NJPKA14U6QHTBvsdRyJfxJ4R5jFwV8fVnQxNsuodfTnfj: 2\n    28F6ehWoupqutK2RqXCX24gvXZAb818vRPBamuQw2LafBCBwJY: 4"}
[08-29|17:45:33.229] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "YyLMJK4JtSk8sS8pRdYDLzkn12g2mPDskUrAK87RuVwaH3mru", "numVotes": 5, "voteID": "YyLMJK4JtSk8sS8pRdYDLzkn12g2mPDskUrAK87RuVwaH3mru", "error": "not found"}
[08-29|17:45:33.229] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "2ZYV98zdCGsV6BV2x9phMAf1WAJCZiRPLX4zMvoju1uGz1JBdH", "numVotes": 6, "voteID": "2ZYV98zdCGsV6BV2x9phMAf1WAJCZiRPLX4zMvoju1uGz1JBdH", "error": "not found"}
[08-29|17:45:33.229] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "HqciyQT3Q6xsZ9uKE1zBLgCsnFidntT5ebwYtQ4XxRARmCxDm", "numVotes": 3, "voteID": "HqciyQT3Q6xsZ9uKE1zBLgCsnFidntT5ebwYtQ4XxRARmCxDm", "error": "not found"}
[08-29|17:45:33.229] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "2E1r6NJPKA14U6QHTBvsdRyJfxJ4R5jFwV8fVnQxNsuodfTnfj", "numVotes": 2, "voteID": "2E1r6NJPKA14U6QHTBvsdRyJfxJ4R5jFwV8fVnQxNsuodfTnfj", "error": "not found"}
[08-29|17:45:33.230] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:65 finishing poll {"result": "Bag[ids.ID]: (Size = 4)\n    28F6ehWoupqutK2RqXCX24gvXZAb818vRPBamuQw2LafBCBwJY: 4"}
[08-29|17:45:33.230] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:87 Snowman engine can't quiesce
[08-29|17:45:33.230] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:58 filtering poll results {"result": "Bag[ids.ID]: (Size = 20)\n    YyLMJK4JtSk8sS8pRdYDLzkn12g2mPDskUrAK87RuVwaH3mru: 6\n    2E1r6NJPKA14U6QHTBvsdRyJfxJ4R5jFwV8fVnQxNsuodfTnfj: 4\n    HqciyQT3Q6xsZ9uKE1zBLgCsnFidntT5ebwYtQ4XxRARmCxDm: 3\n    28F6ehWoupqutK2RqXCX24gvXZAb818vRPBamuQw2LafBCBwJY: 4\n    2ZYV98zdCGsV6BV2x9phMAf1WAJCZiRPLX4zMvoju1uGz1JBdH: 3"}
[08-29|17:45:33.230] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "HqciyQT3Q6xsZ9uKE1zBLgCsnFidntT5ebwYtQ4XxRARmCxDm", "numVotes": 3, "voteID": "HqciyQT3Q6xsZ9uKE1zBLgCsnFidntT5ebwYtQ4XxRARmCxDm", "error": "not found"}
[08-29|17:45:33.230] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "2E1r6NJPKA14U6QHTBvsdRyJfxJ4R5jFwV8fVnQxNsuodfTnfj", "numVotes": 4, "voteID": "2E1r6NJPKA14U6QHTBvsdRyJfxJ4R5jFwV8fVnQxNsuodfTnfj", "error": "not found"}
[08-29|17:45:33.230] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "2ZYV98zdCGsV6BV2x9phMAf1WAJCZiRPLX4zMvoju1uGz1JBdH", "numVotes": 3, "voteID": "2ZYV98zdCGsV6BV2x9phMAf1WAJCZiRPLX4zMvoju1uGz1JBdH", "error": "not found"}
[08-29|17:45:33.230] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "YyLMJK4JtSk8sS8pRdYDLzkn12g2mPDskUrAK87RuVwaH3mru", "numVotes": 6, "voteID": "YyLMJK4JtSk8sS8pRdYDLzkn12g2mPDskUrAK87RuVwaH3mru", "error": "not found"}
[08-29|17:45:33.230] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:65 finishing poll {"result": "Bag[ids.ID]: (Size = 4)\n    28F6ehWoupqutK2RqXCX24gvXZAb818vRPBamuQw2LafBCBwJY: 4"}
[08-29|17:45:33.230] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:87 Snowman engine can't quiesce
[08-29|17:45:33.230] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:58 filtering poll results {"result": "Bag[ids.ID]: (Size = 20)\n    2ZYV98zdCGsV6BV2x9phMAf1WAJCZiRPLX4zMvoju1uGz1JBdH: 4\n    HqciyQT3Q6xsZ9uKE1zBLgCsnFidntT5ebwYtQ4XxRARmCxDm: 4\n    2E1r6NJPKA14U6QHTBvsdRyJfxJ4R5jFwV8fVnQxNsuodfTnfj: 5\n    28F6ehWoupqutK2RqXCX24gvXZAb818vRPBamuQw2LafBCBwJY: 3\n    YyLMJK4JtSk8sS8pRdYDLzkn12g2mPDskUrAK87RuVwaH3mru: 4"}
[08-29|17:45:33.230] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "2E1r6NJPKA14U6QHTBvsdRyJfxJ4R5jFwV8fVnQxNsuodfTnfj", "numVotes": 5, "voteID": "2E1r6NJPKA14U6QHTBvsdRyJfxJ4R5jFwV8fVnQxNsuodfTnfj", "error": "not found"}
[08-29|17:45:33.230] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "YyLMJK4JtSk8sS8pRdYDLzkn12g2mPDskUrAK87RuVwaH3mru", "numVotes": 4, "voteID": "YyLMJK4JtSk8sS8pRdYDLzkn12g2mPDskUrAK87RuVwaH3mru", "error": "not found"}
[08-29|17:45:33.230] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "2ZYV98zdCGsV6BV2x9phMAf1WAJCZiRPLX4zMvoju1uGz1JBdH", "numVotes": 4, "voteID": "2ZYV98zdCGsV6BV2x9phMAf1WAJCZiRPLX4zMvoju1uGz1JBdH", "error": "not found"}
[08-29|17:45:33.230] DEBUG <25eQd7L7cAh6VjteQ69j1Y38UtWKErr44uiUiW3xo35nq8bg7a Chain> snowman/voter.go:115 dropping vote(s) {"reason": "parent couldn't be fetched", "parentID": "HqciyQT3Q6xsZ9uKE1zBLgCsnFidntT5ebwYtQ4XxRARmCxDm", "numVotes": 4, "voteID": "HqciyQT3Q6xsZ9uKE1zBLgCsnFidntT5ebwYtQ4XxRARmCxDm", "error": "not found"}

@patrick-ogrady
Copy link
Contributor Author

patrick-ogrady commented Aug 30, 2023

[sync] [08-30|08:04:08.402] INFO <2Hq3kN19ZM4V6ZR8wffY6SkCruwUN63joLhM6McmPzzWqHs28p Chain> chain/block.go:654 merkle root generated {"height": 1549, "blkID": "ZdWYbo41YrvCkB9bAUfiAwiQJEpG342rM6kjBMFZ2WjNj6z7m", "root": "2guu67vbau6FChMGBKhYgquDdtqz1zmrGGtNDtN9JmY9ythkAq"}

[sync_concurrent] [08-30|08:04:08.878] INFO <2Hq3kN19ZM4V6ZR8wffY6SkCruwUN63joLhM6McmPzzWqHs28p Chain> sync/manager.go:549 completed {"new root": "2guu67vbau6FChMGBKhYgquDdtqz1zmrGGtNDtN9JmY9ythkAq"}
[sync_concurrent] [08-30|08:04:08.878] INFO <2Hq3kN19ZM4V6ZR8wffY6SkCruwUN63joLhM6McmPzzWqHs28p Chain> vm/syncervm_client.go:178 state sync done
[sync_concurrent] [08-30|08:04:08.878] DEBUG <2Hq3kN19ZM4V6ZR8wffY6SkCruwUN63joLhM6McmPzzWqHs28p Chain> vm/resolutions.go:264 txs evicted from seen {"len": 0}
[sync_concurrent] [08-30|08:04:08.878] INFO <2Hq3kN19ZM4V6ZR8wffY6SkCruwUN63joLhM6McmPzzWqHs28p Chain> vm/vm.go:440 node is not ready yet
[sync_concurrent] [08-30|08:04:08.878] INFO <2Hq3kN19ZM4V6ZR8wffY6SkCruwUN63joLhM6McmPzzWqHs28p Chain> vm/resolutions.go:299 accepted block {"blkID": "2YENEsfYg7QL7oJvdptKoBntQu4ZNFd2sGocvpDpTYbvrjbwvd", "height": 1550, "txs": 19, "size": 3702, "dropped mempool txs": 0, "state ready": false}
[sync_concurrent] [08-30|08:04:08.878] INFO <2Hq3kN19ZM4V6ZR8wffY6SkCruwUN63joLhM6McmPzzWqHs28p Chain> vm/vm.go:411 state sync client ready
[sync_concurrent] [08-30|08:04:08.878] INFO <2Hq3kN19ZM4V6ZR8wffY6SkCruwUN63joLhM6McmPzzWqHs28p Chain> vm/resolutions.go:166 skipping unprocessed block {"height": 1550}
[sync_concurrent] [08-30|08:04:08.879] INFO <2Hq3kN19ZM4V6ZR8wffY6SkCruwUN63joLhM6McmPzzWqHs28p Chain> vm/resolutions.go:239 block processed {"blkID": "2YENEsfYg7QL7oJvdptKoBntQu4ZNFd2sGocvpDpTYbvrjbwvd", "height": 1550}

[sync_concurrent] [08-30|08:06:03.147] INFO <2Hq3kN19ZM4V6ZR8wffY6SkCruwUN63joLhM6McmPzzWqHs28p Chain> chain/block.go:805 block not processed {"height": 1550, "blkID": "2YENEsfYg7QL7oJvdptKoBntQu4ZNFd2sGocvpDpTYbvrjbwvd", "attemptVerify": true}
[sync_concurrent] [08-30|08:06:03.147] INFO <2Hq3kN19ZM4V6ZR8wffY6SkCruwUN63joLhM6McmPzzWqHs28p Chain> chain/block.go:841 block root does not match accepted state {"height": 1550, "blkID": "2YENEsfYg7QL7oJvdptKoBntQu4ZNFd2sGocvpDpTYbvrjbwvd", "accepted root": "2guu67vbau6FChMGBKhYgquDdtqz1zmrGGtNDtN9JmY9ythkAq", "block root": "XfwLntAecL1UsWcpi3wH4STmWqXrHj5Essz7c9BuxamgRP64X"}
[sync_concurrent] [08-30|08:06:03.147] INFO <2Hq3kN19ZM4V6ZR8wffY6SkCruwUN63joLhM6McmPzzWqHs28p Chain> chain/block.go:857 verifying block when view requested {"height": 1550, "blkID": "2YENEsfYg7QL7oJvdptKoBntQu4ZNFd2sGocvpDpTYbvrjbwvd", "accepted": true}

@patrick-ogrady
Copy link
Contributor Author

[sync_concurrent] [08-30|08:28:09.879] INFO <2LguN2LcNtMc8cBqV9ZerKUccfyKz9hJ79H5GwsrUzQbmbKWtE Chain> chain/block.go:805 block not processed {"height": 1576, "blkID": "ny8EcuV27nXoU5x225wJtdBoRr9SzUyXR6YEHbDtWfGvki2cL", "attemptVerify": true}
[sync_concurrent] [08-30|08:28:09.879] INFO <2LguN2LcNtMc8cBqV9ZerKUccfyKz9hJ79H5GwsrUzQbmbKWtE Chain> chain/block.go:841 block root does not match accepted state {"height": 1576, "blkID": "ny8EcuV27nXoU5x225wJtdBoRr9SzUyXR6YEHbDtWfGvki2cL", "accepted root": "2bMn6Uh4ZLHNShumSsAEYbRLKWGpbydDD9o5L6A1fKjLXR4wUK", "block root": "2aJSLdwUhfb8yJ3HnBcX9rQC4wLA3sUvkfr76NsZMGsvMj77LA"}
[sync_concurrent] [08-30|08:28:09.879] INFO <2LguN2LcNtMc8cBqV9ZerKUccfyKz9hJ79H5GwsrUzQbmbKWtE Chain> chain/block.go:857 verifying block when view requested {"height": 1576, "blkID": "ny8EcuV27nXoU5x225wJtdBoRr9SzUyXR6YEHbDtWfGvki2cL", "accepted": true}
[sync_concurrent] [08-30|08:28:09.879] ERROR <2LguN2LcNtMc8cBqV9ZerKUccfyKz9hJ79H5GwsrUzQbmbKWtE Chain> chain/block.go:868 unable to verify block {"error": "duplicate transaction: duplicate in ancestry"}

Need to bypass tx check because block is already accepted and txs are in the VM's emap.

chain/block.go Outdated Show resolved Hide resolved
chain/block.go Outdated Show resolved Hide resolved
chain/block.go Outdated Show resolved Hide resolved
chain/block.go Outdated Show resolved Hide resolved
chain/block.go Outdated Show resolved Hide resolved
chain/block.go Outdated Show resolved Hide resolved
chain/block.go Outdated Show resolved Hide resolved
chain/block.go Outdated Show resolved Hide resolved
vm/verify_context.go Outdated Show resolved Hide resolved
vm/vm.go Outdated Show resolved Hide resolved
vm/vm.go Outdated Show resolved Hide resolved
vm/vm.go Outdated Show resolved Hide resolved
@patrick-ogrady patrick-ogrady marked this pull request as ready for review August 31, 2023 01:36
@patrick-ogrady patrick-ogrady merged commit 689d3bf into defer-root-v3 Aug 31, 2023
@patrick-ogrady patrick-ogrady deleted the remove-parent-dependency branch August 31, 2023 01:36
patrick-ogrady added a commit that referenced this pull request Sep 1, 2023
* add first todo

* cleanup README point

* update mocks

* add poc

* add span for waitRoot

* fix VerifySignatures

* make signature verification a config

* add a TODO for splitting parallelism

* update to tip of dev

* split parallelism

* set cores 50/50

* wait root calc metric

* add more TODOs

* update logic to handle unprocessed block post-state sync

* more progress

* add more notes

* use nil in vm

* finish comments on View

* nits

* comment nit

* comment nits

* fix genesis handling

* change variable name

* use math.Max

* add more logging

* more cleanup

* add TODO for invariant change

* [chain] Remove Parent Block Dependency during Verify (#427)

* add TODO

* remove parent fetch

* remove parent block from innerVerify

* add verify context

* cleanup VerifyContext call

* working on clarifying GetVerifyContext/View

* keep cleaning up

* add specific conditional for height

* update verification context handling

* update wording in view to explain why we need accepted handling

* add more comments to main path

* update interface

* use preferred block directly

* drop verify

* fix lint

* update state manager

* add note about GetBlockIDByHeight

* finish comment about handling blocks

* make sure keys in set

* add todo for genesis handling

* update genesis block handling

* add more logs

* e2e passing

* address chain nits

* better comment genesis

* extra VM comments

* add TODO

* clarify note about verification status

* populate more of README

* commit WIP

* progress

* final pass on README
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant