Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | 19x 1x 18x 15x 3x 38x 35x 3x 1x 2x 1x 1x 19x 4x 15x 37x 37x 37x 37x 4x 11x 4x 3x 3x 3x | /**
* @file bloom
* @author joshstevens19
* @link https://github.com/joshstevens19/ethereum-bloom-filters
*/
import sha256 from './sha256';
import {
Address,
getAddressObjectFromRep
} from './proto';
/**
* @deprecated Use the new Bloom instead
*/
function isBloom(bloom) {
if (bloom instanceof Buffer || bloom instanceof Uint8Array) {
return bloom.length === 256;
}
// if (!/^(0x)?[0-9a-f]{512}$/i.test(bloom)) {
// return false;
// }
if (
/^(0x)?[0-9a-f]{512}$/.test(bloom)
|| /^(0x)?[0-9A-F]{512}$/.test(bloom)
) {
return true;
}
return false;
}
/**
* @param codePoint
* @return {number}
*/
function codePointToInt(codePoint) {
if (codePoint >= 48 && codePoint <= 57) {
/* ['0'..'9'] -> [0..9] */
return codePoint - 48;
}
if (codePoint >= 65 && codePoint <= 70) {
/* ['A'..'F'] -> [10..15] */
return codePoint - 55;
}
if (codePoint >= 97 && codePoint <= 102) {
/* ['a'..'f'] -> [10..15] */
return codePoint - 87;
}
throw new Error('invalid bloom');
}
/**
* @param {string} bloom hex string
* @param {string} hash hex string
* @return {boolean}
*/
export function isInBloom(bloom, hash) {
if (!isBloom(bloom)) {
throw new Error('Invalid Bloom');
}
for (let i = 0; i < 12; i += 4) {
// calculate bit position in bloom filter that must be active
const bitpos = ((parseInt(hash.substr(i, 2), 16) << 8)
+ parseInt(hash.substr(i + 2, 2), 16))
& 2047;
// test if bitpos in bloom is active
const code = codePointToInt(
bloom.charCodeAt(bloom.length - 1 - Math.floor(bitpos / 4)),
);
const offset = 1 << bitpos % 4;
if ((code & offset) !== offset) {
return false;
}
}
return true;
}
/**
* @param {string} bloom base64 string
* @param {string} eventName utf-8 string, such as `Transferred`
* @return {boolean}
*/
export function isEventInBloom(bloom, eventName) {
return isInBloom(Buffer.from(bloom, 'base64').toString('hex'), sha256(eventName));
}
export function isIndexedInBloom(bloom, indexed) {
return isInBloom(Buffer.from(bloom, 'base64').toString('hex'), sha256(Buffer.from(indexed, 'base64')));
}
export function isAddressInBloom(bloom, address) {
const encodedAddress = Address.encode(getAddressObjectFromRep(address)).finish();
return isInBloom(Buffer.from(bloom, 'base64').toString('hex'), sha256(encodedAddress));
}
|