105 lines
3.1 KiB
Protocol Buffer
105 lines
3.1 KiB
Protocol Buffer
syntax = "proto3";
|
|
|
|
package execution;
|
|
|
|
import "types/types.proto";
|
|
|
|
option go_package = "./execution;execution";
|
|
|
|
enum ValidationStatus {
|
|
Success = 0; // State transition simulation is successful.
|
|
InvalidChain = 1; // State transition simulation is Unsuccessful.
|
|
TooFarAway = 2; // Chain hash is too far away from current chain head and unfeasible to validate.
|
|
MissingSegment = 3; // Chain segments are missing.
|
|
}
|
|
|
|
message ForkChoiceReceipt {
|
|
bool success = 1; // Forkchoice is either successful or unsuccessful.
|
|
types.H256 latestValidHash = 2; // Return latest valid hash in case of halt of execution.
|
|
}
|
|
|
|
// Result we receive after validation
|
|
message ValidationReceipt {
|
|
ValidationStatus validationStatus = 1;
|
|
types.H256 latestValidHash = 2;
|
|
optional types.H256 missingHash = 3; // The missing hash, in case we receive MissingSegment so that we can reverse download it.
|
|
};
|
|
|
|
message IsCanonicalResponse {
|
|
bool canonical = 1; // Whether hash is canonical or not.
|
|
}
|
|
|
|
// Header is an header for execution
|
|
message Header {
|
|
types.H256 parentHash = 1;
|
|
types.H160 coinbase = 2;
|
|
types.H256 stateRoot = 3;
|
|
types.H256 receiptRoot = 4;
|
|
types.H2048 logsBloom = 5;
|
|
types.H256 mixDigest = 6;
|
|
uint64 blockNumber = 7;
|
|
uint64 gasLimit = 8;
|
|
uint64 gasUsed = 9;
|
|
uint64 timestamp = 10;
|
|
uint64 nonce = 11;
|
|
bytes extraData = 12;
|
|
types.H256 difficulty = 13;
|
|
types.H256 blockHash = 14; // We keep this so that we can validate it
|
|
types.H256 ommerHash = 15;
|
|
types.H256 transactionHash = 16;
|
|
optional types.H256 baseFeePerGas = 17;
|
|
optional types.H256 withdrawalHash = 18;
|
|
}
|
|
|
|
// Body is a block body for execution
|
|
message BlockBody {
|
|
types.H256 blockHash = 1;
|
|
uint64 blockNumber = 2;
|
|
// Raw transactions in byte format.
|
|
repeated bytes transactions = 3;
|
|
repeated Header uncles = 4;
|
|
repeated types.Withdrawal withdrawals = 5;
|
|
}
|
|
|
|
message GetHeaderResponse {
|
|
optional Header header = 1;
|
|
}
|
|
|
|
message GetBodyResponse {
|
|
optional BlockBody body = 1;
|
|
}
|
|
|
|
message GetHeaderHashNumberResponse {
|
|
optional uint64 blockNumber = 1; // null if not found.
|
|
}
|
|
|
|
message GetSegmentRequest {
|
|
// Get headers/body by number or hash, invalid if none set.
|
|
optional uint64 blockNumber = 1;
|
|
optional types.H256 blockHash = 2;
|
|
}
|
|
|
|
message InsertHeadersRequest {
|
|
repeated Header headers = 1;
|
|
}
|
|
|
|
message InsertBodiesRequest {
|
|
repeated BlockBody bodies = 1;
|
|
}
|
|
|
|
message EmptyMessage {}
|
|
|
|
service Execution {
|
|
// Chain Putters.
|
|
rpc InsertHeaders(InsertHeadersRequest) returns(EmptyMessage);
|
|
rpc InsertBodies(InsertBodiesRequest) returns(EmptyMessage);
|
|
// Chain Validation and ForkChoice.
|
|
rpc ValidateChain(types.H256) returns(ValidationReceipt);
|
|
rpc UpdateForkChoice(types.H256) returns(ForkChoiceReceipt);
|
|
rpc AssembleBlock(EmptyMessage) returns(types.ExecutionPayload); // Builds on top of current head.
|
|
// Chain Getters.
|
|
rpc GetHeader(GetSegmentRequest) returns(GetHeaderResponse);
|
|
rpc GetBody(GetSegmentRequest) returns(GetBodyResponse);
|
|
rpc IsCanonicalHash(types.H256) returns(IsCanonicalResponse);
|
|
rpc GetHeaderHashNumber(types.H256) returns(GetHeaderHashNumberResponse);
|
|
} |