lightstreams-network/lightchain

Add support for getLogs() on FilterAPI

Opened this issue · 7 comments

Summary

Some web3 libraries such as https://www.npmjs.com/package/ethers and other projects have the necessity to filter Lightchain logs.

The web3 method is called getLogs() and translates to Geth API as eth_getLogs.

ethers/providers/json-rpc-provider.ts

            case 'getLogs':
                if (params.filter && params.filter.address != null) {
                    params.filter.address = getLowerCase(params.filter.address);
                }
                return this.send('eth_getLogs', [params.filter]);

Steps to resolve

  1. Implement func (api *PublicFilterAPI) GetLogs(ctx context.Context, crit FilterCriteria) ([]*types.Log, error) {

Screen Shot 2019-08-29 at 15 26 02

From: go-ethereum/eth/filters/api.go

Something like this should work as fix:

lightchain/database/database.go

		if _, ok := v.Service.(*filters.PublicFilterAPI); ok {
			v.Service = filters.NewPublicFilterAPI(
				db.eth.APIBackend,
				false,
			)
		}

Test code

const { providers } = require("ethers");
const BlocksToScan = 6001; // Relayers re-register to the hub every 6000 blocks
const hubContractAddress = "0x511bed1c29bc163c96b7d4dde28c7e0590aa44f5";

(async () => {
  const jsonRpcProvider = new providers.JsonRpcProvider(
    "https://node.sirius.lightstreams.io"
  );
  const latestBlock = await jsonRpcProvider.getBlockNumber();
  console.log("latestBlock", latestBlock);
  const fromBlock = latestBlock - BlocksToScan;
  const relayAddedEvents = await jsonRpcProvider.getLogs({
    fromBlock,
    address: hubContractAddress
  });
  // never get a response
  console.log("relayAddedEvents", relayAddedEvents);
})();

UPDATE: Seems like we have the filtering API in place without me writing any extra Lightchain code. I also wrote the tests for the Ethers.js library as we may use it a lot from now on and the filtering logic and everything seems to work on Standalone but I am having issues on Sirius. Investigating why.

Screen Shot 2019-08-30 at 14 59 13

Hanging call:

curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock": "0x7A120", "address": "0xb4aB862fE086f5Baf4f81d8F1564E168d0731630", "topics":["0xb84f62b93fd66a0d09e52bd30961fc71e750f3f1a9c1584fda93aa5e056e7f34"]}],"id":74}' https://node.sirius.lightstreams.io

HA. A working call:

~ $curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock": "0x8618C", "address": "0xDa8B4c62b70e4441a52c4a45829c64B97124DC7b"}],"id":161}' https://node.sirius.lightstreams.io

{"jsonrpc":"2.0","id":161,"result":[{"address":"0xda8b4c62b70e4441a52c4a45829c64b97124dc7b","topics":["0xb84f62b93fd66a0d09e52bd30961fc71e750f3f1a9c1584fda93aa5e056e7f34"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","blockNumber":"0x8619e","transactionHash":"0xe74b0c6f2c7db0690ba3c44f93486f00f3d35cadf42ad8d7bc53d0fc8c01f0b4","transactionIndex":"0x0","blockHash":"0xd1a855008bfd74f460e4efe85c315376088cd96e62d015739a770f3d7a21b697","logIndex":"0x0","removed":false}]}

The question is... what's the difference. ID seems to be irrelevant from Go code perspective.

Screen Shot 2019-09-03 at 11 22 30

Additional reproducable hanging sandbox from Portis: https://codesandbox.io/s/lightstreams-get-logs-dquuh

Testing differences between Geth versions 1.8.27 and 1.9.2.

Using Geth 1.9.2 with improved test suite logging and assertions as in commit below.

Truffle connected to Local Sirius

Screen Shot 2019-09-03 at 11 57 13

cURL connected to Local Sirius

~ $curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock": "0x86184", "address": "0xE499D895ECFB8d6474706072f0d367077B7924e6", "topics":["0xb84f62b93fd66a0d09e52bd30961fc71e750f3f1a9c1584fda93aa5e056e7f34"]}],"id":161}' http://localhost:8545

{"jsonrpc":"2.0","id":161,"result":[{"address":"0xe499d895ecfb8d6474706072f0d367077b7924e6","topics":["0xb84f62b93fd66a0d09e52bd30961fc71e750f3f1a9c1584fda93aa5e056e7f34"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","blockNumber":"0x861e8","transactionHash":"0xb1b0aa655af9d5105ffbb6fe25c2a486d917dd953d4cd51a3e8d4e69bfe450ab","transactionIndex":"0x0","blockHash":"0x67fef288a0f323fb60825c695c4a23e164a5773a46609a813312b922da30c16e","logIndex":"0x0","removed":false}]}

Screen Shot 2019-09-03 at 12 00 01

cURL connected to Remote Sirius

curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock": "0x86184", "address": "0xE499D895ECFB8d6474706072f0d367077B7924e6", "topics":["0xb84f62b93fd66a0d09e52bd30961fc71e750f3f1a9c1584fda93aa5e056e7f34"]}],"id":161}' https://node.sirius.lightstreams.io

{"jsonrpc":"2.0","id":161,"result":[{"address":"0xe499d895ecfb8d6474706072f0d367077b7924e6","topics":["0xb84f62b93fd66a0d09e52bd30961fc71e750f3f1a9c1584fda93aa5e056e7f34"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","blockNumber":"0x861e8","transactionHash":"0xb1b0aa655af9d5105ffbb6fe25c2a486d917dd953d4cd51a3e8d4e69bfe450ab","transactionIndex":"0x0","blockHash":"0x67fef288a0f323fb60825c695c4a23e164a5773a46609a813312b922da30c16e","logIndex":"0x0","removed":false}]}

Works all like charm 👍

Using Geth 1.8.27 with improved test suite logging and assertions as in commit below.

... to be tested in few seconds

Using Geth 1.8.27

lightchain $lightchain version
Version: 1.3.1 Fast && Safe

Truffle connected to Local Sirius

Screen Shot 2019-09-03 at 12 16 19

cURL connected to Local Sirius

Screen Shot 2019-09-03 at 12 17 29

~ $curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock": "0x86184", "address": "0x0ba10ec1CCEaF2f17f71f22284cfac876E916Dab", "topics":["0xb84f62b93fd66a0d09e52bd30961fc71e750f3f1a9c1584fda93aa5e056e7f34"]}],"id":161}' http://localhost:8545

{"jsonrpc":"2.0","id":161,"result":[{"address":"0x0ba10ec1cceaf2f17f71f22284cfac876e916dab","topics":["0xb84f62b93fd66a0d09e52bd30961fc71e750f3f1a9c1584fda93aa5e056e7f34"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","blockNumber":"0x86201","transactionHash":"0x1716860f9bd41fe3e074c70ed30cdf337f8d638449332c3223282f5a8dcda612","transactionIndex":"0x0","blockHash":"0x839a6ac0ff7c7fe36c8e4f4aadf73eb4480b5992ebfa704a5bb3397378ed63a0","logIndex":"0x0","removed":false}]}

cURL connected to Remote Sirius

~ $curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock": "0x86184", "address": "0x0ba10ec1CCEaF2f17f71f22284cfac876E916Dab", "topics":["0xb84f62b93fd66a0d09e52bd30961fc71e750f3f1a9c1584fda93aa5e056e7f34"]}],"id":161}' https://node.sirius.lightstreams.io

{"jsonrpc":"2.0","id":161,"result":[{"address":"0x0ba10ec1cceaf2f17f71f22284cfac876e916dab","topics":["0xb84f62b93fd66a0d09e52bd30961fc71e750f3f1a9c1584fda93aa5e056e7f34"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","blockNumber":"0x86201","transactionHash":"0x1716860f9bd41fe3e074c70ed30cdf337f8d638449332c3223282f5a8dcda612","transactionIndex":"0x0","blockHash":"0x839a6ac0ff7c7fe36c8e4f4aadf73eb4480b5992ebfa704a5bb3397378ed63a0","logIndex":"0x0","removed":false}]}

Works all like charm as well 👍 hmmm