In addition to deploying and testing on the Fuel Testnet, you can also run a local Fuel Node.
There are two types of Fuel networks that can be run:
An in-memory node does not persist the blockchain state anywhere, it is only stored in memory as long as the node is active and running.
To spin-up a local in-memory Fuel node, run the following command:
fuel-core run --db-type in-memory --debug
To deploy a contract to the local node, run the following command:
forc deploy <signing-key> --node-url 127.0.0.1:4000/graphql
Or to deploy without using a signing key:
forc deploy --unsigned --node-url 127.0.0.1:4000/graphql
To modify the initial state of the chain, you must configure a chainConfig.json
file.
Here is an example of what that looks like using version 0.22.0
of fuel-core
:
{
"chain_name": "Testnet",
"block_gas_limit": 1000000000,
"initial_state": {
"coins": [
{
"owner": "0x6b63804cfbf9856e68e5b6e7aef238dc8311ec55bec04df774003a2c96e0418e",
"amount": "0x1000000000000000",
"asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"owner": "0x54944e5b8189827e470e5a8bacfc6c3667397dc4e1eef7ef3519d16d6d6c6610",
"amount": "0x1000000000000000",
"asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"owner": "0xe10f526b192593793b7a1559a391445faba82a1d669e3eb2dcd17f9c121b24b1",
"amount": "0x1000000000000000",
"asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"owner": "0x577e424ee53a16e6a85291feabc8443862495f74ac39a706d2dd0b9fc16955eb",
"amount": "0x1000000000000000",
"asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"owner": "0xc36be0e14d3eaf5d8d233e0f4a40b3b4e48427d25f84c460d2b03b242a38479e",
"amount": "0x1000000000000000",
"asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"owner": "0xa1184d77d0d08a064e03b2bd9f50863e88faddea4693a05ca1ee9b1732ea99b7",
"amount": "0x1000000000000000",
"asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"owner": "0xb5566df884bee4e458151c2fe4082c8af38095cc442c61e0dc83a371d70d88fd",
"amount": "0x1000000000000000",
"asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"owner": "0x9da7247e1d63d30d69f136f0f8654ee8340362c785b50f0a60513c7edbf5bb7c",
"amount": "0x1000000000000000",
"asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"owner": "0x4b2ca966aad1a9d66994731db5138933cf61679107c3cde2a10d9594e47c084e",
"amount": "0x1000000000000000",
"asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"owner": "0x26183fbe7375045250865947695dfc12500dcc43efb9102b4e8c4d3c20009dcb",
"amount": "0x1000000000000000",
"asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"owner": "0x81f3a10b61828580d06cc4c7b0ed8f59b9fb618be856c55d33decd95489a1e23",
"amount": "0x1000000000000000",
"asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"owner": "0x587aa0482482efea0234752d1ad9a9c438d1f34d2859b8bef2d56a432cb68e33",
"amount": "0x1000000000000000",
"asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"owner": "0x53a9c6a74bee79c5e04115a007984f4bddaafed75f512f68766c6ed59d0aedec",
"amount": "0x0004000000000000",
"asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
],
"contracts": [
{
"contract_id": "0x7777777777777777777777777777777777777777777777777777777777777777",
"code": "0x9000000994318e6e453f30e85bf6088f7161d44e57b86a6af0c955d22b353f91b2465f5e6140000a504d00205d4d30001a4860004945048076440001240400005050c0043d51345024040000",
"salt": "0x1bfd51cb31b8d0bc7d93d38f97ab771267d8786ab87073e0c2b8f9ddc44b274e"
}
]
},
"consensus_parameters": {
"tx_params": {
"max_inputs": 255,
"max_outputs": 255,
"max_witnesses": 255,
"max_gas_per_tx": 1000000000,
"max_size": 17825792
},
"predicate_params": {
"max_predicate_length": 1048576,
"max_predicate_data_length": 1048576,
"max_message_data_length": 1048576,
"max_gas_per_predicate": 1000000000
},
"script_params": {
"max_script_length": 1048576,
"max_script_data_length": 1048576
},
"contract_params": {
"contract_max_size": 16777216,
"max_storage_slots": 131072
},
"fee_params": {
"gas_price_factor": 92,
"gas_per_byte": 63
},
"chain_id": 0,
"gas_costs": {
"add": 2,
"addi": 2,
"aloc": 1,
"and": 2,
"andi": 2,
"bal": 366,
"bhei": 2,
"bhsh": 2,
"burn": 33949,
"cb": 2,
"cfei": 2,
"cfsi": 2,
"croo": 40,
"div": 2,
"divi": 2,
"eck1": 3347,
"ecr1": 46165,
"ed19": 4210,
"eq": 2,
"exp": 2,
"expi": 2,
"flag": 1,
"gm": 2,
"gt": 2,
"gtf": 16,
"ji": 2,
"jmp": 2,
"jne": 2,
"jnei": 2,
"jnzi": 2,
"jmpf": 2,
"jmpb": 2,
"jnzf": 2,
"jnzb": 2,
"jnef": 2,
"jneb": 2,
"lb": 2,
"log": 754,
"lt": 2,
"lw": 2,
"mint": 35718,
"mlog": 2,
"mod": 2,
"modi": 2,
"move": 2,
"movi": 2,
"mroo": 5,
"mul": 2,
"muli": 2,
"mldv": 4,
"noop": 1,
"not": 2,
"or": 2,
"ori": 2,
"poph": 3,
"popl": 3,
"pshh": 4,
"pshl": 4,
"ret_contract": 733,
"rvrt_contract": 722,
"sb": 2,
"sll": 2,
"slli": 2,
"srl": 2,
"srli": 2,
"srw": 253,
"sub": 2,
"subi": 2,
"sw": 2,
"sww": 29053,
"time": 79,
"tr": 46242,
"tro": 33251,
"wdcm": 3,
"wqcm": 3,
"wdop": 3,
"wqop": 3,
"wdml": 3,
"wqml": 4,
"wddv": 5,
"wqdv": 7,
"wdmd": 11,
"wqmd": 18,
"wdam": 9,
"wqam": 12,
"wdmm": 11,
"wqmm": 11,
"xor": 2,
"xori": 2,
"call": {
"LightOperation": {
"base": 21687,
"units_per_gas": 4
}
},
"ccp": {
"LightOperation": {
"base": 59,
"units_per_gas": 20
}
},
"csiz": {
"LightOperation": {
"base": 59,
"units_per_gas": 195
}
},
"k256": {
"LightOperation": {
"base": 282,
"units_per_gas": 3
}
},
"ldc": {
"LightOperation": {
"base": 45,
"units_per_gas": 65
}
},
"logd": {
"LightOperation": {
"base": 1134,
"units_per_gas": 2
}
},
"mcl": {
"LightOperation": {
"base": 3,
"units_per_gas": 523
}
},
"mcli": {
"LightOperation": {
"base": 3,
"units_per_gas": 526
}
},
"mcp": {
"LightOperation": {
"base": 3,
"units_per_gas": 448
}
},
"mcpi": {
"LightOperation": {
"base": 7,
"units_per_gas": 585
}
},
"meq": {
"LightOperation": {
"base": 11,
"units_per_gas": 1097
}
},
"retd_contract": {
"LightOperation": {
"base": 1086,
"units_per_gas": 2
}
},
"s256": {
"LightOperation": {
"base": 45,
"units_per_gas": 3
}
},
"scwq": {
"HeavyOperation": {
"base": 30375,
"gas_per_unit": 28628
}
},
"smo": {
"LightOperation": {
"base": 64196,
"units_per_gas": 1
}
},
"srwq": {
"HeavyOperation": {
"base": 262,
"gas_per_unit": 249
}
},
"swwq": {
"HeavyOperation": {
"base": 28484,
"gas_per_unit": 26613
}
},
"contract_root": {
"LightOperation": {
"base": 45,
"units_per_gas": 1
}
},
"state_root": {
"HeavyOperation": {
"base": 350,
"gas_per_unit": 176
}
},
"new_storage_per_byte": 63,
"vm_initialization": {
"LightOperation": {
"base": 1645,
"units_per_gas": 14
}
}
},
"base_asset_id": "0000000000000000000000000000000000000000000000000000000000000000"
},
"consensus": {
"PoA": {
"signing_key": "f65d6448a273b531ee942c133bb91a6f904c7d7f3104cdaf6b9f7f50d3518871"
}
}
}
To start the node with a custom configuration, you can use the command below:
fuel-core run --chain ./chainConfig.json --db-type in-memory --debug
To find an example chain configuration file for a specific fuel-core
version, refer to the fuel-core
repo.
You can edit the coins
array inside the inital_state
object to modify the initial assets owned by a given address.
The owner
address must be a B256
type address (begins with 0x
) instead of a Bech32
type (begins with fuel
).
The amount
is a hex value. In this example, the value translates to 1,125,899.9 ETH
.
This node does persist the blockchain state locally. To run a local node with persistence a chain configuration file is required.
To start the node, run the following command:
fuel-core run --ip 127.0.0.1 --port 4000 --chain ./chainConfig.json --db-path ./.fueldb --debug
To connect to the local node using a browser wallet, import the network address as:
http://127.0.0.1:4000/graphql