Skip to content

Commit

Permalink
feat(evm): calculate and store logs bloom (#870)
Browse files Browse the repository at this point in the history
* calculate logs bloom

* update configs

* style: resolve style guide violations
  • Loading branch information
oXtxNt9U authored Feb 25, 2025
1 parent 376010a commit 94f92de
Show file tree
Hide file tree
Showing 42 changed files with 3,082 additions and 2,862 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,18 @@ export class EthGetTransactionReceipt implements Contracts.Api.RPC.Action {

Utils.assert.defined(transaction.data.blockHeight);

const header = await this.databaseService.getBlockHeader(transaction.data.blockHeight);
if (!header) {
// eslint-disable-next-line unicorn/no-null
return null;
}

const { receipt } = await this.evm.getReceipt(transaction.data.blockHeight, transaction.id);
if (!receipt) {
// eslint-disable-next-line unicorn/no-null
return null;
}

return this.app.resolve(ReceiptResource).transform(transaction.data, receipt);
return this.app.resolve(ReceiptResource).transform(transaction.data, header, receipt);
}
}
2 changes: 1 addition & 1 deletion packages/api-evm/source/resources/block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export class BlockResource {
parentHash: `0x${blockData.previousBlock}`,
nonce: "0x0000000000000000",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad4e2a311b82e5872087ed76f0f1ccf8f", // No uncles in ARK, this is hash of empty list
logsBloom: "", // TODO: Implement logs bloom,
logsBloom: `0x${blockData.logsBloom}`,
transactionsRoot: `0x${blockData.stateHash}`,
stateRoot: `0x${blockData.stateHash}`,
receiptsRoot: `0x${blockData.stateHash}`,
Expand Down
3 changes: 2 additions & 1 deletion packages/api-evm/source/resources/receipt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { Contracts } from "@mainsail/contracts";
export class ReceiptResource {
public async transform(
transaction: Contracts.Crypto.TransactionData,
header: Contracts.Crypto.BlockHeader,
receipt: Contracts.Evm.TransactionReceipt,
): Promise<object> {
/* eslint-disable sort-keys-fix/sort-keys-fix */
Expand All @@ -21,7 +22,7 @@ export class ReceiptResource {
gasUsed: `0x${receipt.gasUsed.toString(16)}`,
contractAddress: receipt.deployedContractAddress,
logs: receipt.logs,
logsBloom: `0x${"0".repeat(128)}`, // TODO: Implement logs bloom
logsBloom: `0x${header.logsBloom}`,
type: "0x2",
status: receipt.success ? "0x1" : "0x0",
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,7 @@ export class GenesisBlockGenerator extends Generator {
)
.fromPublicKey(keys.publicKey),
height: 0,
logsBloom: "0".repeat(512),
numberOfTransactions: transactions.length,
payloadHash: (
await this.app
Expand Down
2 changes: 2 additions & 0 deletions packages/contracts/source/contracts/crypto/block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ export interface BlockData {
readonly round: number;
readonly previousBlock: string;
readonly stateHash: string;
readonly logsBloom: string;
readonly numberOfTransactions: number;
readonly totalGasUsed: number;
readonly totalAmount: BigNumber;
Expand All @@ -51,6 +52,7 @@ export interface BlockJson {
readonly round: number;
readonly previousBlock: string;
readonly stateHash: string;
readonly logsBloom: string;
readonly numberOfTransactions: number;
readonly totalGasUsed: number;
readonly totalAmount: string;
Expand Down
1 change: 1 addition & 0 deletions packages/contracts/source/contracts/evm/evm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export interface Instance extends CommitHandler {
getReceipt(height: number, txHash: string): Promise<GetReceiptResult>;
calculateActiveValidators(context: CalculateActiveValidatorsContext): Promise<void>;
updateRewardsAndVotes(context: UpdateRewardsAndVotesContext): Promise<void>;
logsBloom(commitKey: CommitKey): Promise<string>;
stateHash(commitKey: CommitKey, currentHash: string): Promise<string>;
codeAt(address: string): Promise<string>;
storageAt(address: string, slot: bigint): Promise<string>;
Expand Down
2,073 changes: 1,037 additions & 1,036 deletions packages/core/bin/config/testnet/core/crypto.json

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions packages/core/bin/config/testnet/core/genesis-wallet.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{
"address": "0x2997aA407Be8eD26779bC37E30c482Be3fe82DdD",
"address": "0xEA1EAD8086c960Ee580735a23948b706017Fd96D",
"consensusKeys": {
"compressed": true,
"privateKey": "0347456161c2fd417b460c4b767ad4b979cb04b315f3b6876e333eecf62af29f",
"publicKey": "a66b0aeb1e08f8f8b93e315c4202d5f4c7f267112f67f76cfcc857294071b0ad39ff91dd577fcc111cf05fedc1d10ad3"
"privateKey": "67394312e4c0bd7bf9da2ac8f8a83b976d1914688314b2a72fa08778106a640d",
"publicKey": "952c2d7f3098f9003a7c72b92902fc02a051776df934e2fe7d472e52e417f7c97eb9222a96a2731c0d4b22e8fedadbc2"
},
"keys": {
"compressed": true,
"privateKey": "a9cde36bb3e2673ba9d11fad03fc0db641d7df085a2e602bcbe2a672eb053e48",
"publicKey": "02e66437b21cd09ff771a7c32a936d1acdc47b08d0977fbb6f4972c0dc243f03a5"
"privateKey": "233fdfa144f4396a12cce51c9916e01ea1482783ac57fb60f489ad09c0f3dada",
"publicKey": "03fa38d810ab7a16eb5817d4a954edf69174696ad48a0b87e7c155f2685505c0b1"
},
"passphrase": "ring segment charge acid muscle derive field second soda clay trial menu welcome off perfect skirt impact supply sting buddy ugly pact pole dove"
"passphrase": "abandon damage quick narrow client resource agree bird hamster zebra render flame sugar slide cheap frog welcome drift skate junior nerve tiny final dog"
}
106 changes: 53 additions & 53 deletions packages/core/bin/config/testnet/core/validators.json

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions packages/crypto-block/source/deserializer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ export class Deserializer implements Contracts.Crypto.BlockDeserializer {
stateHash: {
type: "hash",
},
logsBloom: {
type: "hash",
size: 256,
},
numberOfTransactions: {
type: "uint16",
},
Expand Down
4 changes: 2 additions & 2 deletions packages/crypto-block/source/factory.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ describe<{
assertBlockData(assert, block.data, blockData);
assertBlockData(assert, block.header, blockData);
assert.equal(block.transactions, []);
assert.string(block.serialized);
assert.equal(block.serialized, serialized);
});

it("#make - should make a block with transactions", async ({ factory }) => {
Expand All @@ -62,7 +62,7 @@ describe<{
assertBlockData(assert, block.data, blockDataWithTransactionsOriginal);
assertBlockData(assert, block.header, blockDataWithTransactionsOriginal);
assert.length(block.transactions, blockDataWithTransactionsOriginal.transactions.length);
assert.string(block.serialized);
assert.equal(block.serialized, serializedWithTransactions);

for (let index = 0; index < blockDataWithTransactionsOriginal.transactions.length; index++) {
assertTransactionData(
Expand Down
1 change: 1 addition & 0 deletions packages/crypto-block/source/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ export class ServiceProvider extends Providers.ServiceProvider {
4 + // round
hashByteLength + // previousBlock
hashByteLength + // stateHash
256 + // logsBloom
2 + // numberOfTransactions
4 + // totalGasUsed
32 + // totalAmount
Expand Down
1 change: 1 addition & 0 deletions packages/crypto-block/source/schemas.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ describe<{
previousBlock: "0".repeat(64),
reward: 0,
stateHash: "0".repeat(64),
logsBloom: "0".repeat(512),
timestamp: 0,
totalAmount: 0,
totalFee: 0,
Expand Down
15 changes: 14 additions & 1 deletion packages/crypto-block/source/schemas.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { AnySchemaObject } from "ajv";

export const schemas: Record<"block" | "blockId" | "prefixedBlockId" | "blockHeader", AnySchemaObject> = {
export const schemas: Record<"block" | "blockId" | "prefixedBlockId" | "blockHeader" | "logsBloom", AnySchemaObject> = {
block: {
$id: "block",
$ref: "blockHeader",
Expand All @@ -20,6 +20,7 @@ export const schemas: Record<"block" | "blockId" | "prefixedBlockId" | "blockHea
generatorAddress: { $ref: "address" },
height: { minimum: 0, type: "integer" },
id: { $ref: "blockId" },
logsBloom: { $ref: "logsBloom" },
numberOfTransactions: { minimum: 0, type: "integer" },
payloadHash: { $ref: "hex" },
payloadLength: { minimum: 0, type: "integer" },
Expand All @@ -38,6 +39,7 @@ export const schemas: Record<"block" | "blockId" | "prefixedBlockId" | "blockHea
"previousBlock",
"height",
"stateHash",
"logsBloom",
"totalGasUsed",
"totalAmount",
"totalFee",
Expand All @@ -57,6 +59,17 @@ export const schemas: Record<"block" | "blockId" | "prefixedBlockId" | "blockHea
],
type: "string",
},
logsBloom: {
$id: "logsBloom",
allOf: [
{
$ref: "hex",
maxLength: 512,
minLength: 512,
},
],
type: "string",
},
prefixedBlockId: {
$id: "prefixedBlockId",
allOf: [
Expand Down
6 changes: 3 additions & 3 deletions packages/crypto-block/source/serializer.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ describe<{
});

it("#size - should return size", ({ serializer }) => {
assert.equal(serializer.headerSize(), 237);
assert.equal(serializer.headerSize(), 493);

assert.equal(serializer.totalSize(blockData), 237);
assert.equal(serializer.totalSize(blockData), 493);
});

it("#size - should return size with transactions", async ({ serializer, sandbox }) => {
assert.equal(serializer.totalSize(blockDataWithTransactions), 463);
assert.equal(serializer.totalSize(blockDataWithTransactions), 719);
});

it("#serialize - should serialize and deserialize block", async ({ serializer, deserializer }) => {
Expand Down
6 changes: 6 additions & 0 deletions packages/crypto-block/source/serializer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ export class Serializer implements Contracts.Crypto.BlockSerializer {
stateHash: {
type: "hash",
},
logsBloom: {
type: "hash",
},
numberOfTransactions: {
type: "uint16",
},
Expand Down Expand Up @@ -89,6 +92,9 @@ export class Serializer implements Contracts.Crypto.BlockSerializer {
stateHash: {
type: "hash",
},
logsBloom: {
type: "hash",
},
numberOfTransactions: {
type: "uint16",
},
Expand Down
16 changes: 10 additions & 6 deletions packages/crypto-block/test/fixtures/block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ import { BigNumber } from "@mainsail/utils";
export const blockData: Contracts.Crypto.BlockData = {
generatorAddress: "0xB559F4FbB75c378CDd3Dd7CcbFeff9c5c2094E55",
height: 2,
id: "b60bd8c5c7c74dc5fdf971b1c5392e859aa6ca08e57f98e44e65faa7fd0e4684",
id: "6d9ec81edbe42628b7bb60c81bef94d53525580c99be8ca7efffd4a804ec7c24",
numberOfTransactions: 0,
payloadHash: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
payloadLength: 0,
previousBlock: "0000000000000000000000000000000000000000000000000000000000000000",
reward: BigNumber.ZERO,
round: 1,
stateHash: "0000000000000000000000000000000000000000000000000000000000000000",
logsBloom: "0".repeat(512),
timestamp: 1_703_128_709_748,
totalAmount: BigNumber.ZERO,
totalFee: BigNumber.ZERO,
Expand All @@ -23,14 +24,15 @@ export const blockData: Contracts.Crypto.BlockData = {
export const blockDataJson: Contracts.Crypto.BlockJson = {
generatorAddress: "0xB559F4FbB75c378CDd3Dd7CcbFeff9c5c2094E55",
height: 2,
id: "b60bd8c5c7c74dc5fdf971b1c5392e859aa6ca08e57f98e44e65faa7fd0e4684",
id: "6d9ec81edbe42628b7bb60c81bef94d53525580c99be8ca7efffd4a804ec7c24",
numberOfTransactions: 0,
payloadHash: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
payloadLength: 0,
previousBlock: "0000000000000000000000000000000000000000000000000000000000000000",
reward: "0",
round: 1,
stateHash: "0000000000000000000000000000000000000000000000000000000000000000",
logsBloom: "0".repeat(512),
timestamp: 1_703_128_709_748,
totalAmount: "0",
totalFee: "0",
Expand All @@ -40,19 +42,20 @@ export const blockDataJson: Contracts.Crypto.BlockJson = {
};

export const serialized =
"0174ba618a8c0102000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855b559f4fbb75c378cdd3dd7ccbfeff9c5c2094e55";
"0174ba618a8c010200000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855b559f4fbb75c378cdd3dd7ccbfeff9c5c2094e55";

export const blockDataWithTransactions: Contracts.Crypto.BlockData = {
generatorAddress: "0xB559F4FbB75c378CDd3Dd7CcbFeff9c5c2094E55",
height: 2,
id: "97160d3d9471d500a0f7cd0766a01bce7184a280c1dc566cdca9354b2a2f6b41",
id: "10ee5958aa6a97c60830a75f4c0f49ca02da76e5f13851567534a6837e0fa69d",
numberOfTransactions: 2,
payloadHash: "f01a3a2a2990990a64211feb47e2fa25c048decb3420ee52562fdc4931225c0f",
payloadLength: 226,
previousBlock: "0000000000000000000000000000000000000000000000000000000000000000",
reward: BigNumber.ZERO,
round: 1,
stateHash: "0000000000000000000000000000000000000000000000000000000000000000",
logsBloom: "0".repeat(512),
timestamp: 1_703_128_709_748,
totalAmount: BigNumber.ZERO,
totalFee: BigNumber.make("10000000000"),
Expand Down Expand Up @@ -101,14 +104,15 @@ export const blockDataWithTransactions: Contracts.Crypto.BlockData = {
export const blockDataWithTransactionsJson: Contracts.Crypto.BlockJson = {
generatorAddress: "0xB559F4FbB75c378CDd3Dd7CcbFeff9c5c2094E55",
height: 2,
id: "97160d3d9471d500a0f7cd0766a01bce7184a280c1dc566cdca9354b2a2f6b41",
id: "10ee5958aa6a97c60830a75f4c0f49ca02da76e5f13851567534a6837e0fa69d",
numberOfTransactions: 2,
payloadHash: "f01a3a2a2990990a64211feb47e2fa25c048decb3420ee52562fdc4931225c0f",
payloadLength: 226,
previousBlock: "0000000000000000000000000000000000000000000000000000000000000000",
reward: "0",
round: 1,
stateHash: "0000000000000000000000000000000000000000000000000000000000000000",
logsBloom: "0".repeat(512),
timestamp: 1_703_128_709_748,
totalAmount: "0",
totalFee: "10000000000",
Expand Down Expand Up @@ -153,4 +157,4 @@ export const blockDataWithTransactionsJson: Contracts.Crypto.BlockJson = {
version: 1,
};
export const serializedWithTransactions =
"0174ba618a8c010200000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200d0070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002540be4000000000000000000000000000000000000000000000000000000000000000000e2000000f01a3a2a2990990a64211feb47e2fa25c048decb3420ee52562fdc4931225c0fb559f4fbb75c378cdd3dd7ccbfeff9c5c2094e556d00000002f86a822710808085012a05f200830f424094be89811e15f611c1db12e59679b6f3dc1f4301558080c080a0921101a4583fb153ec00e501f3c2e2636114e1c8c58d2df8a19426cc066a6768a022db4bce1e0ace485ce0838d178b4d5bcfa9f69b315a14c580d9b01e5c980bdd6d00000002f86a822710018085012a05f200830f424094be89811e15f611c1db12e59679b6f3dc1f4301558080c080a06c9842bc78c2f68468cbf8a8f3fec0ae2679707ffb606a4b373dd01a02af55fca01a4c4d984d750678fb204ce8b7e97d860c974ac1a423f098dc4921acd2be0c7d";
"0174ba618a8c01020000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200d0070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002540be4000000000000000000000000000000000000000000000000000000000000000000e2000000f01a3a2a2990990a64211feb47e2fa25c048decb3420ee52562fdc4931225c0fb559f4fbb75c378cdd3dd7ccbfeff9c5c2094e556d00000002f86a822710808085012a05f200830f424094be89811e15f611c1db12e59679b6f3dc1f4301558080c080a0921101a4583fb153ec00e501f3c2e2636114e1c8c58d2df8a19426cc066a6768a022db4bce1e0ace485ce0838d178b4d5bcfa9f69b315a14c580d9b01e5c980bdd6d00000002f86a822710018085012a05f200830f424094be89811e15f611c1db12e59679b6f3dc1f4301558080c080a06c9842bc78c2f68468cbf8a8f3fec0ae2679707ffb606a4b373dd01a02af55fca01a4c4d984d750678fb204ce8b7e97d860c974ac1a423f098dc4921acd2be0c7d";
1 change: 1 addition & 0 deletions packages/crypto-block/test/helpers/prepare-sandbox.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ export const prepareSandbox = async (context) => {
4 + // round
hashByteLength + // previousBlock
hashByteLength + // stateHash
256 + // logsBloom
2 + // numberOfTransactions
4 + // totalGasUsed
32 + // totalAmount
Expand Down
5 changes: 5 additions & 0 deletions packages/evm-service/source/instances/evm.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -739,6 +739,11 @@ describe<{
assert.equal(hash, "d704de6546d2278905030a0c9f180a649964dbae8112f250a72a01629ec25f83");
});

it("should return logs bloom", async ({ instance }) => {
const logsBloom = await instance.logsBloom({ height: BigInt(0), round: BigInt(0) });
assert.equal(logsBloom, "0".repeat(512));
});

it("should return code", async ({ instance }) => {
const [sender] = wallets;

Expand Down
4 changes: 4 additions & 0 deletions packages/evm-service/source/instances/evm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,10 @@ export class EvmInstance implements Contracts.Evm.Instance {
return this.#evm.stateHash(commitKey, currentHash);
}

public async logsBloom(commitKey: Contracts.Evm.CommitKey): Promise<string> {
return this.#evm.logsBloom(commitKey);
}

public mode(): Contracts.Evm.EvmMode {
return Contracts.Evm.EvmMode.Persistent;
}
Expand Down
Loading

0 comments on commit 94f92de

Please sign in to comment.