I've read some docs online that to get the miner/sealer/signer address of a particular block that runs with the Ethereum PoA/Clique consensus (the Rinkeby testnet for example), I need to call the clique_getSnapshot RPC interface. However when I tried it with a infura Rinkeby endpoint, it returns "The method clique_getSnapshot does not exist/is not available" error.
So is there any way where I can get the miner/sealer/signer address of a particular block on the Rinkeby testnet with an infura Rinkeby endpoint? For example on etherscan it shows that block 4753195 is mined by 0x7ffC57839B00206D1ad20c69A1981b489f772031
https://rinkeby.etherscan.io/block/4753195
How may I get that info?
======
Thanks to @Ha ĐANG , I've now come to this stage:
Web3 = require("web3");
web3 = new Web3("https://rinkeby.infura.io/v3/xxxxxxxxx"); // my infura Rinkeby endpoint
ejutils = require("ethereumjs-utils");
(async () => {
blk = await web3.eth.getBlock(4753195);
blkhash = blk.hash;
console.log(blkhash);
// 0xdfd0a441a76d0f54bea2b61963871a61bca5eb4adf76f15d60e2d3c7b19cf191 Correct!!
extdat = blk.extraData;
console.log(extdat);
// 0xd883010900846765746888676f312e31322e34856c696e7578000000000000009e4d991ca30e6ff6782058da4b958eb180e54f3af99f00afa9d42ea01c08b1134664c21f408d79c87d93a6ce83354a68d8f0d3fea99bc796029875563acceef801 Correct!!
msg = ejutils.toBuffer(blkhash);
sig = extdat.slice(-130);
r = "0x" + sig.slice(0, 64);
s = '0x' + sig.slice(64, 128);
v = '0x' + sig.slice(128, 130);
v = parseInt(v) + 27;
pub = ejutils.ecrecover(msg, v, r, s);
addr = ejutils.pubToAddress(pub);
addr = ejutils.bufferToHex(addr);
console.log(addr);
// 0xe2877298e8cf1046ae9f3231e17f73fe85282590 Wrong :(
})();
So any idea what went wrong in the above code? Thanks.