mirror of
https://github.com/pezkuwichain/revive.git
synced 2026-06-14 03:01:04 +00:00
implement the coinbase opcode (#179)
Signed-off-by: xermicus <cyrill@parity.io>
This commit is contained in:
@@ -2,6 +2,15 @@
|
|||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
This is a development pre-release.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Support for the `coinbase` opcode.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
## v0.1.0-dev.9
|
## v0.1.0-dev.9
|
||||||
|
|
||||||
This is a development pre-release.
|
This is a development pre-release.
|
||||||
|
|||||||
Generated
+360
-357
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -73,7 +73,7 @@ assert_fs = "1.1.2"
|
|||||||
# polkadot-sdk and friends
|
# polkadot-sdk and friends
|
||||||
codec = { version = "3.6.12", default-features = false, package = "parity-scale-codec" }
|
codec = { version = "3.6.12", default-features = false, package = "parity-scale-codec" }
|
||||||
scale-info = { version = "2.11.6", default-features = false }
|
scale-info = { version = "2.11.6", default-features = false }
|
||||||
polkadot-sdk = { git = "https://github.com/paritytech/polkadot-sdk", rev = "4302f74f7874e6a894578731142a7b310a1449b0" }
|
polkadot-sdk = { git = "https://github.com/paritytech/polkadot-sdk", rev = "2d53238a186ac1161ca9998471694eb1833efb1d" }
|
||||||
|
|
||||||
# llvm
|
# llvm
|
||||||
[workspace.dependencies.inkwell]
|
[workspace.dependencies.inkwell]
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
"terminalTotalDifficulty": 0,
|
"terminalTotalDifficulty": 0,
|
||||||
"terminalTotalDifficultyPassed": true
|
"terminalTotalDifficultyPassed": true
|
||||||
},
|
},
|
||||||
"coinbase": "0x0000000000000000000000000000000000000000",
|
"coinbase": "0xffffffffffffffffffffffffffffffffffffffff",
|
||||||
"difficulty": "0x20000",
|
"difficulty": "0x20000",
|
||||||
"extraData": "",
|
"extraData": "",
|
||||||
"gasLimit": "0xffffffff",
|
"gasLimit": "0xffffffff",
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
pragma solidity ^0.8;
|
||||||
|
|
||||||
|
/* runner.json
|
||||||
|
{
|
||||||
|
"differential": true,
|
||||||
|
"actions": [
|
||||||
|
{
|
||||||
|
"Instantiate": {
|
||||||
|
"code": {
|
||||||
|
"Solidity": {
|
||||||
|
"contract": "Coinbase"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
contract Coinbase {
|
||||||
|
constructor() payable {
|
||||||
|
address coinbase = address(0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF);
|
||||||
|
assert(block.coinbase == coinbase);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -50,6 +50,7 @@ test_spec!(gas_price, "GasPrice", "GasPrice.sol");
|
|||||||
test_spec!(gas_left, "GasLeft", "GasLeft.sol");
|
test_spec!(gas_left, "GasLeft", "GasLeft.sol");
|
||||||
test_spec!(gas_limit, "GasLimit", "GasLimit.sol");
|
test_spec!(gas_limit, "GasLimit", "GasLimit.sol");
|
||||||
test_spec!(base_fee, "BaseFee", "BaseFee.sol");
|
test_spec!(base_fee, "BaseFee", "BaseFee.sol");
|
||||||
|
test_spec!(coinbase, "Coinbase", "Coinbase.sol");
|
||||||
|
|
||||||
fn instantiate(path: &str, contract: &str) -> Vec<SpecsAction> {
|
fn instantiate(path: &str, contract: &str) -> Vec<SpecsAction> {
|
||||||
vec![Instantiate {
|
vec![Instantiate {
|
||||||
|
|||||||
@@ -122,12 +122,20 @@ where
|
|||||||
|
|
||||||
/// Translates the `coinbase` instruction.
|
/// Translates the `coinbase` instruction.
|
||||||
pub fn coinbase<'ctx, D>(
|
pub fn coinbase<'ctx, D>(
|
||||||
_context: &mut Context<'ctx, D>,
|
context: &mut Context<'ctx, D>,
|
||||||
) -> anyhow::Result<inkwell::values::BasicValueEnum<'ctx>>
|
) -> anyhow::Result<inkwell::values::BasicValueEnum<'ctx>>
|
||||||
where
|
where
|
||||||
D: Dependency + Clone,
|
D: Dependency + Clone,
|
||||||
{
|
{
|
||||||
todo!()
|
let pointer = context.build_alloca_at_entry(
|
||||||
|
context.integer_type(revive_common::BIT_LENGTH_ETH_ADDRESS),
|
||||||
|
"coinbase_output",
|
||||||
|
);
|
||||||
|
context.build_runtime_call(
|
||||||
|
revive_runtime_api::polkavm_imports::BLOCK_AUTHOR,
|
||||||
|
&[pointer.to_int(context).into()],
|
||||||
|
);
|
||||||
|
context.build_load_address(pointer)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Translates the `basefee` instruction.
|
/// Translates the `basefee` instruction.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
use frame_support::{runtime, weights::constants::WEIGHT_REF_TIME_PER_SECOND};
|
use frame_support::{runtime, traits::FindAuthor, weights::constants::WEIGHT_REF_TIME_PER_SECOND};
|
||||||
|
|
||||||
use pallet_revive::AccountId32Mapper;
|
use pallet_revive::AccountId32Mapper;
|
||||||
use polkadot_sdk::*;
|
use polkadot_sdk::*;
|
||||||
use polkadot_sdk::{
|
use polkadot_sdk::{
|
||||||
@@ -11,8 +10,6 @@ pub type Balance = u128;
|
|||||||
pub type AccountId = pallet_revive::AccountId32Mapper<Runtime>;
|
pub type AccountId = pallet_revive::AccountId32Mapper<Runtime>;
|
||||||
pub type Block = frame_system::mocking::MockBlock<Runtime>;
|
pub type Block = frame_system::mocking::MockBlock<Runtime>;
|
||||||
pub type Hash = <Runtime as frame_system::Config>::Hash;
|
pub type Hash = <Runtime as frame_system::Config>::Hash;
|
||||||
pub type EventRecord =
|
|
||||||
frame_system::EventRecord<<Runtime as frame_system::Config>::RuntimeEvent, Hash>;
|
|
||||||
|
|
||||||
#[runtime]
|
#[runtime]
|
||||||
mod runtime {
|
mod runtime {
|
||||||
@@ -26,7 +23,8 @@ mod runtime {
|
|||||||
RuntimeHoldReason,
|
RuntimeHoldReason,
|
||||||
RuntimeSlashReason,
|
RuntimeSlashReason,
|
||||||
RuntimeLockId,
|
RuntimeLockId,
|
||||||
RuntimeTask
|
RuntimeTask,
|
||||||
|
RuntimeViewFunction
|
||||||
)]
|
)]
|
||||||
pub struct Runtime;
|
pub struct Runtime;
|
||||||
|
|
||||||
@@ -88,4 +86,14 @@ impl pallet_revive::Config for Runtime {
|
|||||||
type InstantiateOrigin = EnsureSigned<AccountId32>;
|
type InstantiateOrigin = EnsureSigned<AccountId32>;
|
||||||
type CodeHashLockupDepositPercent = CodeHashLockupDepositPercent;
|
type CodeHashLockupDepositPercent = CodeHashLockupDepositPercent;
|
||||||
type ChainId = ConstU64<420_420_420>;
|
type ChainId = ConstU64<420_420_420>;
|
||||||
|
type FindAuthor = Self;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FindAuthor<<Runtime as frame_system::Config>::AccountId> for Runtime {
|
||||||
|
fn find_author<'a, I>(_digests: I) -> Option<<Runtime as frame_system::Config>::AccountId>
|
||||||
|
where
|
||||||
|
I: 'a + IntoIterator<Item = (frame_support::ConsensusEngineId, &'a [u8])>,
|
||||||
|
{
|
||||||
|
Some([0xff; 32].into())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,6 +72,8 @@ POLKAVM_IMPORT(void, balance_of, uint32_t, uint32_t)
|
|||||||
|
|
||||||
POLKAVM_IMPORT(void, base_fee, uint32_t)
|
POLKAVM_IMPORT(void, base_fee, uint32_t)
|
||||||
|
|
||||||
|
POLKAVM_IMPORT(void, block_author, uint32_t)
|
||||||
|
|
||||||
POLKAVM_IMPORT(void, block_hash, uint32_t, uint32_t)
|
POLKAVM_IMPORT(void, block_hash, uint32_t, uint32_t)
|
||||||
|
|
||||||
POLKAVM_IMPORT(void, block_number, uint32_t)
|
POLKAVM_IMPORT(void, block_number, uint32_t)
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ pub static BALANCE_OF: &str = "balance_of";
|
|||||||
|
|
||||||
pub static BASE_FEE: &str = "base_fee";
|
pub static BASE_FEE: &str = "base_fee";
|
||||||
|
|
||||||
|
pub static BLOCK_AUTHOR: &str = "block_author";
|
||||||
|
|
||||||
pub static BLOCK_HASH: &str = "block_hash";
|
pub static BLOCK_HASH: &str = "block_hash";
|
||||||
|
|
||||||
pub static BLOCK_NUMBER: &str = "block_number";
|
pub static BLOCK_NUMBER: &str = "block_number";
|
||||||
@@ -80,13 +82,14 @@ pub static WEIGHT_TO_FEE: &str = "weight_to_fee";
|
|||||||
|
|
||||||
/// All imported runtime API symbols.
|
/// All imported runtime API symbols.
|
||||||
/// Useful for configuring common attributes and linkage.
|
/// Useful for configuring common attributes and linkage.
|
||||||
pub static IMPORTS: [&str; 34] = [
|
pub static IMPORTS: [&str; 35] = [
|
||||||
SBRK,
|
SBRK,
|
||||||
MEMORY_SIZE,
|
MEMORY_SIZE,
|
||||||
ADDRESS,
|
ADDRESS,
|
||||||
BALANCE,
|
BALANCE,
|
||||||
BALANCE_OF,
|
BALANCE_OF,
|
||||||
BASE_FEE,
|
BASE_FEE,
|
||||||
|
BLOCK_AUTHOR,
|
||||||
BLOCK_HASH,
|
BLOCK_HASH,
|
||||||
BLOCK_NUMBER,
|
BLOCK_NUMBER,
|
||||||
CALL,
|
CALL,
|
||||||
|
|||||||
Reference in New Issue
Block a user