Open EnchanterIO opened 5 years ago
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.
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.
Additional reproducable hanging sandbox from Portis: https://codesandbox.io/s/lightstreams-get-logs-dquuh
~ $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}]}
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 👍
... to be tested in few seconds
lightchain $lightchain version Version: 1.3.1 Fast && Safe
~ $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 -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
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 aseth_getLogs
.ethers/providers/json-rpc-provider.ts
Steps to resolve
func (api *PublicFilterAPI) GetLogs(ctx context.Context, crit FilterCriteria) ([]*types.Log, error) {
From:
go-ethereum/eth/filters/api.go
Something like this should work as fix:
lightchain/database/database.go