prysm-pulse/third_party
Preston Van Loon 49a0d3caf0
Refactor dependencies, make Prysm "go gettable" (#6053)
* Fix a few deps to work with go.mod, check in generated files

* Update Gossipsub to 1.1 (#5998)

* update libs

* add new validators

* add new deps

* new set of deps

* tls

* further fix gossip update

* get everything to build

* clean up

* gaz

* fix build

* fix all tests

* add deps to images

* imports

Co-authored-by: rauljordan <raul@prysmaticlabs.com>

* Beacon chain builds with go build

* fix bazel

* fix dep

* lint

* Add github action for testing go

* on PR for any branch

* fix libp2p test failure

* Fix TestProcessBlock_PassesProcessingConditions by updating the proposer index in test

* Revert "Fix TestProcessBlock_PassesProcessingConditions by updating the proposer index in test"

This reverts commit 43676894ab01f03fe90a9b8ee3ecfbc2ec1ec4e4.

* Compute and set proposer index instead of hard code

* Add back go mod/sum, fix deps

* go build ./...

* Temporarily skip two tests

* Fix kafka confluent patch

* Fix kafka confluent patch

* fix kafka build

* fix kafka

* Add info in DEPENDENCIES. Added a stub link for Why Bazel? until https://github.com/prysmaticlabs/documentation/issues/138

* Update fuzz ssz files as well

* Update fuzz ssz files as well

* getting closer

* rollback rules_go and gazelle

* fix gogo protobuf

* install librdkafka-dev as part of github actions

* Update kafka to a recent version where librkafkfa is not required for go modules

* clarify comment

* fix kafka build

* disable go tests

* comment

* Fix geth dependencies for end to end

* rename word

* lint

* fix docker

Co-authored-by: Nishant Das <nishdas93@gmail.com>
Co-authored-by: rauljordan <raul@prysmaticlabs.com>
Co-authored-by: terence tsao <terence@prysmaticlabs.com>
2020-05-31 14:44:34 +08:00
..
beacon-fuzz libfuzz based tests (#5095) 2020-05-05 07:22:26 +00:00
herumi Update BLS to allow for spec v0.12 requirements (#5914) 2020-05-23 10:50:02 +08:00
kafka Refactor dependencies, make Prysm "go gettable" (#6053) 2020-05-31 14:44:34 +08:00
BUILD.bazel Spec freeze updates (#2312) 2019-07-19 19:16:10 -05:00
com_github_gogo_protobuf-equal.patch Spec freeze updates (#2312) 2019-07-19 19:16:10 -05:00
com_github_prysmaticlabs_ethereumapis-tags.patch libfuzz based tests (#5095) 2020-05-05 07:22:26 +00:00
com_github_prysmaticlabs_go_ssz.patch Add ssz marshal and unmarshal for most data structures (#5121) 2020-03-19 02:39:23 +00:00
in_gopkg_confluentinc_confluent_kafka_go_v1.patch Refactor dependencies, make Prysm "go gettable" (#6053) 2020-05-31 14:44:34 +08:00
libp2p_tls.patch Refactor dependencies, make Prysm "go gettable" (#6053) 2020-05-31 14:44:34 +08:00
README.md Update README for Patching Ethereum APIs (#4871) 2020-02-16 17:07:06 +00:00

Third Party Package Patching

This directory includes local patches to third party dependencies we use in Prysm. Sometimes, we need to make a small change to some dependency for ease of use in Prysm without wanting to maintain our own fork of the dependency ourselves. Our build tool, Bazel allows us to include patches in a seamless manner based on simple diff rules.

This README outlines how patching works in Prysm and an explanation of previously created patches.

Given maintaining a patch can be difficult and tedious, patches are NOT the recommended way of modifying dependencies in Prysm unless really needed

Table of Contents

Prerequisites

Bazel Installation:

  • The latest release of Bazel
  • A modern UNIX operating system (MacOS included)

Creating a Patch

To create a patch, we need an original version of a dependency which we will refer to as a and the patched version referred to as b.

cd /tmp
git clone https://github.com/someteam/somerepo a
git clone https://github.com/someteam/somerepo b && cd b

Then, make all your changes in b and finally create the diff of all your changes as follows:

cd ..
diff -ur --exclude=".git" a b > $GOPATH/src/github.com/prysmaticlabs/prysm/third_party/YOURPATCH.patch

Next, we need to tell the Bazel WORKSPACE to patch the specific dependency. Here's an example for a patch we use today for the Ethereum APIs dependency:

go_repository(
    name = "com_github_prysmaticlabs_ethereumapis",
    commit = "367ca574419a062ae26818f60bdeb5751a6f538",
    patch_args = ["-p1"],
    patches = [
        "//third_party:com_github_prysmaticlabs_ethereumapis-tags.patch",
    ],
    importpath = "github.com/prysmaticlabs/ethereumapis",
)

Now, when used in Prysm, the dependency you patched will have the patched modifications when you run your code.

Ethereum APIs Patch

As mentioned earlier, patches aren't a recommended approach when needing to modify dependencies in Prysm save for a few use cases. In particular, all of our public APIs and most canonical data structures for Prysm are kept in the Ethereum APIs repo. The purpose of the repo is to serve as a well-documented, well-maintained schema for a full-featured eth2 API. It is written in protobuf format, and specifies JSON over HTTP mappings as well as a Swagger API front-end configuration.

The Prysm repo specifically requires its data structures to have certain struct tags for serialization purposes as well as other package-related annotations for proper functionality. Given a protobuf schema is meant to be generic, easily readable, accessible, and language agnostic (at least for languages which support protobuf generation), it would be wrong for us to include Go-specific annotations in the Ethereum APIs repo. Instead of maintaining a duplicate of it within Prysm, we can apply a patch to include those struct tags as needed, while being able to use the latest changes in the Ethereum APIs repo. This is an appropriate use-case for a patch.

Here's an example:

 // The block body of an Ethereum 2.0 beacon block.
 message BeaconBlockBody {
     // The validators RANDAO reveal 96 byte value.
-    bytes randao_reveal = 1;
+    bytes randao_reveal = 1 [(gogoproto.moretags) = "ssz-size:\"96\""];
 
     // A reference to the Ethereum 1.x chain.
     Eth1Data eth1_data = 2;
 
     // 32 byte field of arbitrary data. This field may contain any data and
     // is not used for anything other than a fun message.
-    bytes graffiti = 3; 
+    bytes graffiti = 3 [(gogoproto.moretags) = "ssz-size:\"32\""];
... 
}

Above, we're telling Prysm to patch a few lines to include protobuf tags for SSZ (the serialization library used by Prysm).

Updating Patches

Say we want to update Ethereum APIs in Prysm to its latest master commit b7452dde4ca361809def4ed5924ab3cb7ad1299a. Here are the steps:

  1. Go to your Prysm WORKSPACE and look at the commit in there for Ethereum APIs, say it's e6f60041667fbc3edb22b03735ec111d1a40cd0e
  2. Go to Ethereum APIs and do git checkout e6f60041667fbc3edb22b03735ec111d1a40cd0e
  3. In the Ethereum APIs repo, do git apply $GOPATH/src/github.com/prysmaticlabs/prysm/third_party/com_github_prysmaticlabs_ethereumapis-tags.patch
  4. Make any changes you want to make in Ethereum APIs, such as applying ssz struct tags, etc.
  5. In the Ethereum APIs repo, do git commit -m "applied patch and changes"
  6. Do git merge master
  7. Generate a new diff and update the diff in Prysm git diff b7452dde4ca361809def4ed5924ab3cb7ad1299a > $GOPATH/src/github.com/prysmaticlabs/prysm/third_party/com_github_prysmaticlabs_ethereumapis-tags.patch
  8. Update the commit in the Prysm WORKSPACE file for Ethereum APIs to b7452dde4ca361809def4ed5924ab3cb7ad1299a
  9. Build the Prysm project