Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix!: close epochs based on block numbers #445

Merged
merged 3 commits into from
Jul 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- Added Rollups end-to-end test using Echo Dapp

### Changed

- Changed the dispatcher to close epochs based on block numbers instead of block timestamps.
- **BREAKING**: changed the dispatcher to use the `CARTESI_CONTRACTS_INPUT_BOX_DEPLOYMENT_BLOCK_NUMBER` environment variable instead of `CARTESI_CONTRACTS_APPLICATION_DEPLOYMENT_BLOCK_NUMBER`.
- **BREAKING**: replaced the environment variable `CARTESI_EPOCH_DURATION` with `CARTESI_EPOCH_LENGTH` to match the new epoch algorithm, and set its default value to 7200 (1 day worth of blocks, considering one block is mined every 12 seconds).
- **BREAKING**: replaced the internal environment variable `RD_EPOCH_DURATION` with `RD_EPOCH_LENGTH` to match the new epoch algorithm, and also set its default value to 7200.
- Bumped Rust Version to 1.78.0

### Removed

- Removed `CARTESI_CONTRACTS_APPLICATION_DEPLOYMENT_BLOCK_NUMBER` environment variable.

## [1.4.0] 2024-04-09

### Added
Expand Down
3 changes: 1 addition & 2 deletions build/compose-devnet.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,11 @@ services:
CARTESI_BLOCKCHAIN_IS_LEGACY: "false"
CARTESI_BLOCKCHAIN_FINALITY_OFFSET: "1"
CARTESI_CONTRACTS_APPLICATION_ADDRESS: "0x7C54E3f7A8070a54223469965A871fB8f6f88c22"
CARTESI_CONTRACTS_APPLICATION_DEPLOYMENT_BLOCK_NUMBER: "20"
CARTESI_CONTRACTS_HISTORY_ADDRESS: "0x325272217ae6815b494bF38cED004c5Eb8a7CdA7"
CARTESI_CONTRACTS_AUTHORITY_ADDRESS: "0x58c93F83fb3304730C95aad2E360cdb88b782010"
CARTESI_CONTRACTS_INPUT_BOX_ADDRESS: "0x59b22D57D4f067708AB0c00552767405926dc768"
CARTESI_CONTRACTS_INPUT_BOX_DEPLOYMENT_BLOCK_NUMBER: "20"
CARTESI_EPOCH_DURATION: "120"
CARTESI_EPOCH_LENGTH: "120"
CARTESI_FEATURE_DISABLE_MACHINE_HASH_CHECK: "true"
CARTESI_AUTH_KIND: "mnemonic"
CARTESI_AUTH_MNEMONIC: "test test test test test test test test test test test junk"
1 change: 0 additions & 1 deletion build/compose-sepolia.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ services:
CARTESI_BLOCKCHAIN_IS_LEGACY: "false"
CARTESI_BLOCKCHAIN_FINALITY_OFFSET: "1"
CARTESI_CONTRACTS_APPLICATION_ADDRESS: "0x9f12D4365806FC000D6555ACB85c5371b464E506"
CARTESI_CONTRACTS_APPLICATION_DEPLOYMENT_BLOCK_NUMBER: "4152308"
CARTESI_CONTRACTS_HISTORY_ADDRESS: "0x76f4dCaC0920826541EE718214EEE4be07346cEE"
CARTESI_CONTRACTS_AUTHORITY_ADDRESS: "0x5827Ec9365D3a9b27bF1dB982d258Ad234D37242"
CARTESI_CONTRACTS_INPUT_BOX_ADDRESS: "0x59b22D57D4f067708AB0c00552767405926dc768"
Expand Down
2 changes: 1 addition & 1 deletion build/docker-bake.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ target "common" {
context = ".."
args = {
BASE_IMAGE = "debian:bookworm-20240311-slim"
RUST_VERSION = "1.77.0"
RUST_VERSION = "1.78.0"
marcelstanley marked this conversation as resolved.
Show resolved Hide resolved
GO_VERSION = "1.22.1"
FOUNDRY_NIGHTLY_VERSION = "293fad73670b7b59ca901c7f2105bf7a29165a90"
SERVER_MANAGER_VERSION = "0.9.1"
Expand Down
21 changes: 6 additions & 15 deletions cmd/gen-devnet/deployer.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ package main

import (
"context"
"encoding/json"
"fmt"
"os/exec"
"strings"
Expand Down Expand Up @@ -44,7 +43,7 @@ func createApplication(ctx context.Context, hash string) (DeploymentInfo, error)
var depInfo DeploymentInfo

// Create the Authority/History pair
contractAddresses, _, err := createContracts(ctx,
contractAddresses, err := createContracts(ctx,
common.Address.Hex(addresses.GetTestBook().AuthorityHistoryPairFactory),
"newAuthorityHistoryPair(address,bytes32)(address,address)",
CONTRACT_OWNER_ADDRESS,
Expand All @@ -57,7 +56,7 @@ func createApplication(ctx context.Context, hash string) (DeploymentInfo, error)
depInfo.HistoryAddress = contractAddresses[1]

// Create the Application, passing the address of the newly created Authority
contractAddresses, blockNumber, err := createContracts(ctx,
contractAddresses, err = createContracts(ctx,
common.Address.Hex(addresses.GetTestBook().CartesiDAppFactory),
"newApplication(address,address,bytes32,bytes32)(address)",
depInfo.AuthorityAddress,
Expand All @@ -69,7 +68,6 @@ func createApplication(ctx context.Context, hash string) (DeploymentInfo, error)
}

depInfo.ApplicationAddress = contractAddresses[0]
depInfo.BlockNumber = blockNumber

return depInfo, nil
}
Expand All @@ -80,7 +78,7 @@ func createApplication(ctx context.Context, hash string) (DeploymentInfo, error)
//
// Warning: a second call to a contract with the same arguments will fail.
func createContracts(ctx context.Context,
args ...string) ([]string, string, error) {
args ...string) ([]string, error) {
commonArgs := []string{"--rpc-url", RPC_URL}
commonArgs = append(commonArgs, args...)

Expand All @@ -94,7 +92,7 @@ func createContracts(ctx context.Context,
castCall.Stdout = &outStrBuilder
err := castCall.Run()
if err != nil {
return contractAddresses, "", fmt.Errorf("command failed %v: %v", castCall.Args, err)
return contractAddresses, fmt.Errorf("command failed %v: %v", castCall.Args, err)
}
contractAddresses = strings.Fields(outStrBuilder.String())

Expand All @@ -110,20 +108,13 @@ func createContracts(ctx context.Context,
castSend.Stdout = &outStrBuilder
err = castSend.Run()
if err != nil {
return contractAddresses, "", fmt.Errorf("command failed %v: %v", castSend.Args, err)
return contractAddresses, fmt.Errorf("command failed %v: %v", castSend.Args, err)
}

if VerboseLog {
fmt.Printf("deployer: command: %s\n", castSend.Args)
fmt.Printf("deployer: output: %s\n", outStrBuilder.String())
}
// Extract blockNumber from JSON output
jsonMap := make(map[string](any))
err = json.Unmarshal([]byte([]byte(outStrBuilder.String())), &jsonMap)
if err != nil {
return contractAddresses, "", fmt.Errorf("failed to extract block number, %s", err.Error())
}
blockNumber := jsonMap["blockNumber"].(string)

return contractAddresses, blockNumber, nil
return contractAddresses, nil
}
1 change: 0 additions & 1 deletion cmd/gen-devnet/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,4 @@ type DeploymentInfo struct {
AuthorityAddress string `json:"CARTESI_CONTRACTS_AUTHORITY_ADDRESS"`
HistoryAddress string `json:"CARTESI_CONTRACTS_HISTORY_ADDRESS"`
ApplicationAddress string `json:"CARTESI_CONTRACTS_APPLICATION_ADDRESS"`
BlockNumber string `json:"CARTESI_CONTRACTS_APPLICATION_DEPLOYMENT_BLOCK_NUMBER"`
}
14 changes: 4 additions & 10 deletions docs/config.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,12 +116,6 @@ Address of the DApp's contract.

* **Type:** `string`

## `CARTESI_CONTRACTS_APPLICATION_DEPLOYMENT_BLOCK_NUMBER`

Block in which the DApp's contract was deployed.

* **Type:** `int64`

## `CARTESI_CONTRACTS_AUTHORITY_ADDRESS`

Address of the Authority contract.
Expand Down Expand Up @@ -236,14 +230,14 @@ for more information.
* **Type:** `string`
* **Default:** `""`

## `CARTESI_EPOCH_DURATION`
## `CARTESI_EPOCH_LENGTH`

Duration of a rollups epoch in seconds.
Length of a rollups epoch in blocks.

At the end of each epoch, the node will send claims to the blockchain.

* **Type:** `Duration`
* **Default:** `"86400"`
* **Type:** `uint64`
* **Default:** `"7200"`

## `CARTESI_SNAPSHOT_DIR`

Expand Down
55 changes: 26 additions & 29 deletions internal/node/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,32 +13,31 @@ import (
// NodeConfig contains all the Node variables.
// See the corresponding environment variable for the variable documentation.
type NodeConfig struct {
LogLevel LogLevel
LogPretty bool
RollupsEpochDuration Duration
BlockchainID uint64
BlockchainHttpEndpoint Redacted[string]
BlockchainWsEndpoint Redacted[string]
BlockchainIsLegacy bool
BlockchainFinalityOffset int
BlockchainBlockTimeout int
ContractsApplicationAddress string
ContractsApplicationDeploymentBlockNumber int64
ContractsHistoryAddress string
ContractsAuthorityAddress string
ContractsInputBoxAddress string
ContractsInputBoxDeploymentBlockNumber int64
SnapshotDir string
PostgresEndpoint Redacted[string]
HttpAddress string
HttpPort int
FeatureHostMode bool
FeatureDisableClaimer bool
FeatureDisableMachineHashCheck bool
ExperimentalServerManagerBypassLog bool
ExperimentalSunodoValidatorEnabled bool
ExperimentalSunodoValidatorRedisEndpoint string
Auth Auth
LogLevel LogLevel
LogPretty bool
RollupsEpochLength uint64
BlockchainID uint64
BlockchainHttpEndpoint Redacted[string]
BlockchainWsEndpoint Redacted[string]
BlockchainIsLegacy bool
BlockchainFinalityOffset int
BlockchainBlockTimeout int
ContractsApplicationAddress string
ContractsHistoryAddress string
ContractsAuthorityAddress string
ContractsInputBoxAddress string
ContractsInputBoxDeploymentBlockNumber int64
SnapshotDir string
PostgresEndpoint Redacted[string]
HttpAddress string
HttpPort int
FeatureHostMode bool
FeatureDisableClaimer bool
FeatureDisableMachineHashCheck bool
ExperimentalServerManagerBypassLog bool
ExperimentalSunodoValidatorEnabled bool
ExperimentalSunodoValidatorRedisEndpoint string
Auth Auth
}

// Auth is used to sign transactions.
Expand Down Expand Up @@ -75,16 +74,14 @@ func FromEnv() NodeConfig {
var config NodeConfig
config.LogLevel = getLogLevel()
config.LogPretty = getLogPretty()
config.RollupsEpochDuration = getEpochDuration()
config.RollupsEpochLength = getEpochLength()
config.BlockchainID = getBlockchainId()
config.BlockchainHttpEndpoint = Redacted[string]{getBlockchainHttpEndpoint()}
config.BlockchainWsEndpoint = Redacted[string]{getBlockchainWsEndpoint()}
config.BlockchainIsLegacy = getBlockchainIsLegacy()
config.BlockchainFinalityOffset = getBlockchainFinalityOffset()
config.BlockchainBlockTimeout = getBlockchainBlockTimeout()
config.ContractsApplicationAddress = getContractsApplicationAddress()
config.ContractsApplicationDeploymentBlockNumber =
getContractsApplicationDeploymentBlockNumber()
config.ContractsHistoryAddress = getContractsHistoryAddress()
config.ContractsAuthorityAddress = getContractsAuthorityAddress()
config.ContractsInputBoxAddress = getContractsInputBoxAddress()
Expand Down
13 changes: 4 additions & 9 deletions internal/node/config/generate/Config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,11 @@ the snapshot matches the hash in the Application contract."""
# Rollups
#

[rollups.CARTESI_EPOCH_DURATION]
default = "86400" # 1 day in seconds
go-type = "Duration"
[rollups.CARTESI_EPOCH_LENGTH]
default = "7200" # 1 day (average) in blocks (considering one block is mined every 12 seconds)
go-type = "uint64"
description = """
Duration of a rollups epoch in seconds.
Length of a rollups epoch in blocks.
At the end of each epoch, the node will send claims to the blockchain."""

Expand Down Expand Up @@ -101,11 +101,6 @@ go-type = "string"
description = """
Address of the DApp's contract."""

[contracts.CARTESI_CONTRACTS_APPLICATION_DEPLOYMENT_BLOCK_NUMBER]
go-type = "int64"
description = """
Block in which the DApp's contract was deployed."""

[contracts.CARTESI_CONTRACTS_HISTORY_ADDRESS]
go-type = "string"
description = """
Expand Down
22 changes: 5 additions & 17 deletions internal/node/config/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 3 additions & 4 deletions internal/node/services.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,13 +155,12 @@ func newDispatcher(c config.NodeConfig, workDir string) services.CommandService
c.BlockchainFinalityOffset))
s.Env = append(s.Env, fmt.Sprintf("REDIS_ENDPOINT=%v", getRedisEndpoint(c)))
s.Env = append(s.Env, fmt.Sprintf("DAPP_ADDRESS=%v", c.ContractsApplicationAddress))
s.Env = append(s.Env, fmt.Sprintf("DAPP_DEPLOYMENT_BLOCK_NUMBER=%v",
c.ContractsApplicationDeploymentBlockNumber))
s.Env = append(s.Env, fmt.Sprintf("INPUT_BOX_DEPLOYMENT_BLOCK_NUMBER=%v",
c.ContractsInputBoxDeploymentBlockNumber))
s.Env = append(s.Env, fmt.Sprintf("HISTORY_ADDRESS=%v", c.ContractsHistoryAddress))
s.Env = append(s.Env, fmt.Sprintf("AUTHORITY_ADDRESS=%v", c.ContractsAuthorityAddress))
s.Env = append(s.Env, fmt.Sprintf("INPUT_BOX_ADDRESS=%v", c.ContractsInputBoxAddress))
s.Env = append(s.Env, fmt.Sprintf("RD_EPOCH_DURATION=%v",
int(c.RollupsEpochDuration.Seconds())))
s.Env = append(s.Env, fmt.Sprintf("RD_EPOCH_LENGTH=%v", c.RollupsEpochLength))
s.Env = append(s.Env, fmt.Sprintf("CHAIN_ID=%v", c.BlockchainID))
s.Env = append(s.Env, fmt.Sprintf("DISPATCHER_HTTP_SERVER_PORT=%v",
getPort(c, portOffsetDispatcher)))
Expand Down
8 changes: 0 additions & 8 deletions offchain/authority-claimer/src/listener.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,19 +84,11 @@ mod tests {
BrokerConfig, BrokerEndpoint, BrokerError, RedactedUrl, RollupsClaim,
Url,
};
use snafu::Snafu;

// ------------------------------------------------------------------------------------------------
// Broker Mock
// ------------------------------------------------------------------------------------------------

#[derive(Clone, Debug, Snafu)]
pub enum MockError {
EndError,
InternalError,
MockError,
}

pub async fn setup_broker(
docker: &Cli,
should_fail: bool,
Expand Down
10 changes: 5 additions & 5 deletions offchain/dispatcher/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ pub struct DispatcherEnvCLIConfig {
#[command(flatten)]
pub blockchain_config: BlockchainCLIConfig,

/// Duration of rollups epoch in seconds, for which dispatcher will make claims.
#[arg(long, env, default_value = "604800")]
pub rd_epoch_duration: u64,
/// Duration of rollups epoch in blocks, for which dispatcher will make claims.
#[arg(long, env, default_value = "7200")]
pub rd_epoch_length: u64,

/// Chain ID
#[arg(long, env)]
Expand All @@ -46,7 +46,7 @@ pub struct DispatcherConfig {
pub log_config: LogConfig,
pub blockchain_config: BlockchainConfig,

pub epoch_duration: u64,
pub epoch_length: u64,
pub chain_id: u64,
}

Expand Down Expand Up @@ -86,7 +86,7 @@ impl Config {
broker_config,
log_config,
blockchain_config,
epoch_duration: dispatcher_config.rd_epoch_duration,
epoch_length: dispatcher_config.rd_epoch_length,
chain_id: dispatcher_config.chain_id,
};

Expand Down
Loading
Loading