Compare commits

..

8 Commits

Author SHA1 Message Date
alvicsam 199b6145f2 try parity runner 2024-10-25 09:51:09 +02:00
Alexander Samusev 36f9345c22 Update .github/Dockerfile-llvm
Co-authored-by: Alexander Theißen <alex.theissen@me.com>
2024-10-25 09:49:13 +02:00
Evgeny Snitko 33d589ea7f COPY build-llvm.sh 2024-10-25 06:55:30 +04:00
Evgeny Snitko fdc44db1be checkout 2024-10-25 06:51:58 +04:00
Evgeny Snitko 76f815f33b -f 2024-10-25 06:50:24 +04:00
Evgeny Snitko a293264028 docker context 2024-10-25 06:48:46 +04:00
Evgeny Snitko 7bf9d49166 stop build for tests 2024-10-25 06:47:55 +04:00
Evgeny Snitko d5b9c489ea gha test 2024-10-25 06:46:25 +04:00
15 changed files with 689 additions and 614 deletions
+6
View File
@@ -0,0 +1,6 @@
FROM revive-llvm
WORKDIR /app
COPY . .
RUN RUSTFLAGS='-L /app/llvm18.0/lib/unknown -L /usr/lib -L /app/llvm18.0/lib' REVIVE_INSTALL_DIR='/app/release/revive/' make install-revive
+16
View File
@@ -0,0 +1,16 @@
FROM alpine:3.20.3
ARG RUST_VERSION=stable
RUN apk add bash git cmake make ninja python3 ncurses-static curl
RUN ninja --version
COPY build-llvm.sh .
RUN bash -c ./build-llvm.sh
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain ${RUST_VERSION}
ENV PATH=/root/.cargo/bin:/llvm18.0/bin:${PATH}
WORKDIR /app
RUN REVIVE_INSTALL_DIR=$(pwd)/target/release
+40
View File
@@ -0,0 +1,40 @@
name: Release
run-name: Release ${{ github.ref_name }}
on:
push:
tags:
- "[0-9]+.[0-9]+.[0-9]+"
- "[0-9]+.[0-9]+.[0-9]+-[a-zA-Z0-9]+"
jobs:
CreateRelease:
permissions:
contents: write
runs-on: ubuntu-20.04
steps:
- name: Release
uses: softprops/action-gh-release@v2
with:
draft: true
make_latest: true
Release:
needs: [CreateRelease]
permissions:
contents: write
runs-on: ubuntu-20.04
env:
GH_TOKEN: ${{ github.token }}
steps:
- name: build llvm
run: docker build -t revive-llvm:latest --progress=plain -f --build-arg RUST_VERSION=1.80 .github/Dockerfile-llvm
- name: build revive
run: docker build -t revive:latest --progress=plain -f .github/Dockerfile
- name: get binary
run: docker run --rm revive:latest -v output:/app/output cp /app/release/revive/resolc /app/output
# docker push revive:latest
- run: gh release upload ${{ github.ref_name }} output/resolc --clobber
-2
View File
@@ -3,8 +3,6 @@ name: Build
on:
push:
branches: ["main"]
pull_request:
branches: ["main"]
env:
CARGO_TERM_COLOR: always
+30
View File
@@ -0,0 +1,30 @@
name: Test
run-name: Test ${{ github.ref_name }}
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
Release:
# runs-on: ubuntu-20.04
runs-on: parity-large
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: build llvm
run: docker build -t revive-llvm:latest --progress=plain --build-arg RUST_VERSION=1.80 -f .github/Dockerfile-llvm .
- name: build revive
run: docker build -t revive:latest --progress=plain -f .github/Dockerfile
- name: get binary
run: docker run --rm revive:latest -v output:/app/output cp /app/release/revive/resolc /app/output .
# docker push revive:latest
- run: gh release upload ${{ github.ref_name }} output/resolc
Generated
+521 -521
View File
File diff suppressed because it is too large Load Diff
+2 -3
View File
@@ -67,12 +67,11 @@ log = { version = "0.4" }
# polkadot-sdk and friends
codec = { version = "3.6.12", default-features = false, package = "parity-scale-codec" }
scale-info = { version = "2.11.1", default-features = false }
polkadot-sdk = { git = "https://github.com/paritytech/polkadot-sdk", rev = "35535efb3d9f4d3b3be63c3c2bcf963883ab6af1" }
polkadot-sdk = { git = "https://github.com/paritytech/polkadot-sdk", rev = "aeebf2f383390f2f86527d70212162d5dbea8b93" }
# llvm
[workspace.dependencies.inkwell]
git = "https://github.com/TheDan64/inkwell.git"
rev = "7b410298b6a93450adaa90b1841d5805a3038f12"
version = "0.5"
default-features = false
features = ["serde", "llvm18-0", "no-libffi-linking", "target-riscv"]
+2 -2
View File
@@ -2,9 +2,9 @@
"Baseline": 989,
"Computation": 4153,
"DivisionArithmetics": 40614,
"ERC20": 47348,
"ERC20": 47343,
"Events": 1781,
"FibonacciIterative": 3035,
"Flipper": 3448,
"Flipper": 3393,
"SHA1": 33553
}
+4 -45
View File
@@ -4,27 +4,11 @@ pragma solidity ^0.8;
/* runner.json
{
"differential": true,
"actions": [
{
"Upload": {
"code": {
"Solidity": {
"contract": "ERC20"
}
}
}
},
{
"Instantiate": {
"code": {
"Solidity": {
"contract": "ERC20Tester"
}
}
}
}
]
{
"Instantiate": {}
}
]
}
*/
@@ -98,28 +82,3 @@ contract ERC20 is IERC20 {
emit Transfer(msg.sender, address(0), amount);
}
}
contract ERC20Tester {
constructor() {
address BOB = address(0xffffffffffffffffffffffffffffffffffffff);
ERC20 token = new ERC20();
assert(token.decimals() == 18);
// use call directly when code_size is implemented on pallet-revive
address(token).call(abi.encodeWithSignature("mint(uint256)", 300));
assert(token.balanceOf(address(this)) == 300);
token.transfer(BOB, 100);
assert(token.balanceOf(address(this)) == 200);
assert(token.balanceOf(BOB) == 100);
token.approve(address(this), 100);
token.transferFrom(address(this), BOB, 100);
assert(token.balanceOf(BOB) == 200);
assert(token.balanceOf(address(this)) == 100);
address(token).call(abi.encodeWithSignature("burn(uint256)", 100));
assert(token.balanceOf(address(this)) == 0);
}
}
+1 -17
View File
@@ -22,14 +22,6 @@ pragma solidity ^0.8;
},
"data": "fabc9efaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
}
},
{
"Call": {
"dest": {
"Instantiated": 0
},
"data": "558b9f9bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
}
}
]
}
@@ -38,18 +30,10 @@ pragma solidity ^0.8;
contract Storage {
function transient(uint value) public returns (uint ret) {
assembly {
let slot := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
let slot := 123
tstore(slot, value)
let success := call(0, 0, 0, 0, 0, 0, 0)
ret := tload(slot)
}
}
function persistent(uint value) public returns (uint ret) {
assembly {
let slot := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
sstore(slot, value)
ret := sload(slot)
}
}
}
+30 -4
View File
@@ -669,10 +669,22 @@ where
self.build_byte_swap(value)
}
AddressSpace::Storage | AddressSpace::TransientStorage => {
let storage_key_value = self.builder().build_ptr_to_int(
pointer.value,
self.word_type(),
"storage_ptr_to_int",
)?;
let storage_key_pointer = self.build_alloca(self.word_type(), "storage_key");
let storage_key_pointer_casted = self.builder().build_ptr_to_int(
storage_key_pointer.value,
self.xlen_type(),
"storage_key_pointer_casted",
)?;
self.builder()
.build_store(storage_key_pointer.value, storage_key_value)?;
let storage_value_pointer =
self.build_alloca(self.word_type(), "storage_value_pointer");
self.build_store(storage_value_pointer, self.word_const(0))?;
let storage_value_length_pointer =
self.build_alloca(self.xlen_type(), "storage_value_length_pointer");
self.build_store(
@@ -686,7 +698,7 @@ where
revive_runtime_api::polkavm_imports::GET_STORAGE,
&[
self.xlen_type().const_int(transient as u64, false).into(),
pointer.to_int(self).into(),
storage_key_pointer_casted.into(),
self.xlen_type().const_all_ones().into(),
storage_value_pointer.to_int(self).into(),
storage_value_length_pointer.to_int(self).into(),
@@ -755,6 +767,18 @@ where
self.word_type().as_basic_type_enum()
);
let storage_key_value = self.builder().build_ptr_to_int(
pointer.value,
self.word_type(),
"storage_ptr_to_int",
)?;
let storage_key_pointer = self.build_alloca(self.word_type(), "storage_key");
let storage_key_pointer_casted = self.builder().build_ptr_to_int(
storage_key_pointer.value,
self.xlen_type(),
"storage_key_pointer_casted",
)?;
let storage_value_pointer = self.build_alloca(self.word_type(), "storage_value");
let storage_value_pointer_casted = self.builder().build_ptr_to_int(
storage_value_pointer.value,
@@ -762,6 +786,8 @@ where
"storage_value_pointer_casted",
)?;
self.builder()
.build_store(storage_key_pointer.value, storage_key_value)?;
self.builder()
.build_store(storage_value_pointer.value, value)?;
@@ -771,7 +797,7 @@ where
revive_runtime_api::polkavm_imports::SET_STORAGE,
&[
self.xlen_type().const_int(transient as u64, false).into(),
pointer.to_int(self).into(),
storage_key_pointer_casted.into(),
self.xlen_type().const_all_ones().into(),
storage_value_pointer_casted.into(),
self.integer_const(crate::polkavm::XLEN, 32).into(),
+33 -16
View File
@@ -1,6 +1,7 @@
//! Translates the storage operations.
use crate::polkavm::context::address_space::AddressSpace;
use crate::polkavm::context::pointer::Pointer;
use crate::polkavm::context::Context;
use crate::polkavm::Dependency;
@@ -12,10 +13,14 @@ pub fn load<'ctx, D>(
where
D: Dependency + Clone,
{
let mut slot_ptr = context.build_alloca_at_entry(context.word_type(), "slot_pointer");
slot_ptr.address_space = AddressSpace::Storage;
context.builder().build_store(slot_ptr.value, position)?;
context.build_load(slot_ptr, "storage_load_value")
let position_pointer = Pointer::new_with_offset(
context,
AddressSpace::Storage,
context.word_type(),
position,
"storage_load_position_pointer",
);
context.build_load(position_pointer, "storage_load_value")
}
/// Translates the storage store.
@@ -27,10 +32,14 @@ pub fn store<'ctx, D>(
where
D: Dependency + Clone,
{
let mut slot_ptr = context.build_alloca_at_entry(context.word_type(), "slot_pointer");
slot_ptr.address_space = AddressSpace::Storage;
context.builder().build_store(slot_ptr.value, position)?;
context.build_store(slot_ptr, value)?;
let position_pointer = Pointer::new_with_offset(
context,
AddressSpace::Storage,
context.word_type(),
position,
"storage_store_position_pointer",
);
context.build_store(position_pointer, value)?;
Ok(())
}
@@ -42,10 +51,14 @@ pub fn transient_load<'ctx, D>(
where
D: Dependency + Clone,
{
let mut slot_ptr = context.build_alloca_at_entry(context.word_type(), "slot_pointer");
slot_ptr.address_space = AddressSpace::TransientStorage;
context.builder().build_store(slot_ptr.value, position)?;
context.build_load(slot_ptr, "transient_storage_load_value")
let position_pointer = Pointer::new_with_offset(
context,
AddressSpace::TransientStorage,
context.word_type(),
position,
"transient_storage_load_position_pointer",
);
context.build_load(position_pointer, "transient_storage_load_value")
}
/// Translates the transient storage store.
@@ -57,9 +70,13 @@ pub fn transient_store<'ctx, D>(
where
D: Dependency + Clone,
{
let mut slot_ptr = context.build_alloca_at_entry(context.word_type(), "slot_pointer");
slot_ptr.address_space = AddressSpace::TransientStorage;
context.builder().build_store(slot_ptr.value, position)?;
context.build_store(slot_ptr, value)?;
let position_pointer = Pointer::new_with_offset(
context,
AddressSpace::TransientStorage,
context.word_type(),
position,
"transient_storage_store_position_pointer",
);
context.build_store(position_pointer, value)?;
Ok(())
}
+1 -1
View File
@@ -72,7 +72,7 @@ impl ExtBuilder {
Self {
balance_genesis_config: value
.iter()
.map(|(address, balance)| (AccountId::to_fallback_account_id(address), *balance))
.map(|(address, balance)| (AccountId::to_account_id(address), *balance))
.collect(),
}
}
+2 -3
View File
@@ -1,6 +1,5 @@
use frame_support::runtime;
use pallet_revive::AccountId32Mapper;
use polkadot_sdk::*;
use polkadot_sdk::{
polkadot_sdk_frame::{log, runtime::prelude::*},
@@ -8,7 +7,7 @@ use polkadot_sdk::{
};
pub type Balance = u128;
pub type AccountId = pallet_revive::AccountId32Mapper<Runtime>;
pub type AccountId = pallet_revive::DefaultAddressMapper;
pub type Block = frame_system::mocking::MockBlock<Runtime>;
pub type Hash = <Runtime as frame_system::Config>::Hash;
pub type EventRecord =
@@ -75,7 +74,7 @@ impl pallet_revive::Config for Runtime {
type ChainExtension = ();
type DepositPerByte = DepositPerByte;
type DepositPerItem = DepositPerItem;
type AddressMapper = AccountId32Mapper<Self>;
type AddressMapper = AccountId;
type RuntimeMemory = ConstU32<{ 512 * 1024 * 1024 }>;
type PVFMemory = ConstU32<{ 1024 * 1024 * 1024 }>;
type UnsafeUnstableInterface = UnstableInterface;
+1
View File
@@ -1,5 +1,6 @@
use std::time::Instant;
use pallet_revive::AddressMapper;
use serde::{Deserialize, Serialize};
use crate::*;