Skip to content

Commit c31b7dd

Browse files
mishkMikhailKfedosovPaulSff
authored
EVM integration
* EVM w/o rpc * EVM client * Impl self contaned calls * Add eth preruntime * Add balance precompile * Quick fix * Set ETH chain id to 1333 * Switch on asset-erc20 precompile * Chg decimals for erc20 * Add call-permit precompile * Add batch precompile * Fix asset id parsing * Add proxy precompile * feat: evm assets * Update precompiles.rs decimals places 12 for P3Dt in EVM * Update README.md EVM interaction * Update README.md Validator set description * Update README.md spelling * Update README.md deterministic finality link * Update comments Copyright * fix: metamask tokens compatibility * Create README.md validator set description * Fake frontier import * Add evm chain_id in runtime * fix: evm address into account id * Remove foreign asset pallet * Chg decimals for P3D token * check frontier preruntime * Fix find preruntime digests * Check frontier inherents and preruntime * Stop old nodes * Accept two preruntime before upgrade * Chg Erc20 metadata * Bump spev version (130) * Cleanup precompiles utils --------- Co-authored-by: MikhailK <mkornotmk@gmail.com> Co-authored-by: Mikhail Fedosov <tbs.micle@gmail.com> Co-authored-by: Paul <107915078+PaulSff@users.noreply.github.com>
1 parent 90e3fd0 commit c31b7dd

File tree

268 files changed

+48947
-401
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

268 files changed

+48947
-401
lines changed

Cargo.lock

Lines changed: 2272 additions & 287 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ members = [
55
]
66
[profile.release]
77
panic = 'unwind'
8+
9+
workspace.resolver = "2"

README.md

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,19 @@
77

88
[Proof of Scan](https://3dpass.org/proof-of-scan) is a hybrid decentralized protocol "[PoW](https://github.com/3Dpass/3DP/wiki/Proof-of-Scan:-PoW-component-(ASIC%E2%80%90resistant)) `ASIC-resistant, CPU-oriented` + [PoA](https://github.com/3Dpass/3DP/wiki/Proof-of-Scan:-PoA-component) (Proof of Authority)", which is based on recognition technology. Every object, transformed by 3DPass, obtains its own unique and sustainable identity ([HASH ID](https://3dpass.org/features#recognition-hash-id)) the object can be recognized by. This will prevent the copying of digital assets and thus open a door for the entire blockchain space to potentially trillions in deals all over the globe.
99

10-
[Grid2d](https://3dpass.org/grid2d) is 3D shape recognition algorithm, which is utilized as one of hash functions in the Proof of Scan protocol. The implementations of the algorithm are the [pass3d](https://github.com/3Dpass/pass3d) recognition toolkit and its WASM analog [p3d](https://github.com/3Dpass/p3d).
10+
[Grid2d](https://3dpass.org/grid2d) is 3D shape recognition algorithm, which is utilized as one of hash functions in the Proof of Scan protocol. The implementations of the algorithm are the [pass3d](https://github.com/3Dpass/pass3d) recognition toolkit and its WASM analog [p3d](https://github.com/3Dpass/p3d).
1111

1212
[3DPRC-2](https://github.com/3Dpass/whitepaper/blob/main/3DPRC-2.md) (3Dpass Request for Comments) is a standard p2p protocol for the tokenization of the User objects operating within “The Ledger of Things”, by which the most useful aspect of the "Proof of Scan" consensus is getting uncovered. 3DPRC-2 provides decentralized [PoScan API](https://github.com/3Dpass/3DP/wiki/3DPRC%E2%80%902-PoScan-API) available for customers.
1313

1414
The scope of potential 3Dpass applications goes way beyond 3D object recognition and not limited to. Being naturally organized and still cultivating this community driven spirit, 3Dpass is here to encourage developers from all around the globe to upgrade the pass3d open source toolkit with new fascinating recognition algorithms and make it even more useful for human civilization. Learn more about the [algorithm requirements](http://localhost:3000/proof-of-scan#object).
1515

1616
[3DPass Coin (P3D)](https://3dpass.org/coin) is a native utility token, operating within "The Ledger of Things" eco-system, which aims to incentivize the efforts of community members maintaining the network infrastructure. Such aspects as: Storage fee, Gas fee, The object authentication fee, Transaction fee, The validator collaterals, Penalties - are all being counted in P3D.
1717

18+
<<<<<<< HEAD
1819
[AI dev deepWiKi](https://deepwiki.com/3Dpass/3DP) | [Contribution Grant Program](https://3dpass.org/grants) | [Contributing guidelines](https://github.com/3Dpass/3DP/blob/main/CONTRIBUTING.md) | [Discord](https://discord.gg/u24WkXcwug)
20+
=======
21+
[Contribution Grant Program](https://3dpass.org/grants) | [Contributing guidelines](https://github.com/3Dpass/3DP/blob/main/CONTRIBUTING.md) | [Discord](https://discord.gg/u24WkXcwug)
22+
>>>>>>> b6e057cb (Update README.md)
1923
2024
## Getting started with 3Dpass Node
2125

@@ -82,7 +86,7 @@ sh keygen_seed.sh
8286
The keys will be imported into `~/3dp-chain/chains/3dpass/keystore`
8387

8488
#### Manual set up
85-
- Follow [manual set up guidelines](https://3dpass.org/mainnet#manual), if you'd like to set up your keys manually.
89+
- Follow [manual set up guidelines](https://3dpass.org/mainnet#manual), if you'd like to set up your keys manually.
8690
Learn more about [addresses and keys](https://3dpass.org/mainnet#addresses).
8791

8892
### Run the Node
@@ -129,19 +133,50 @@ version: "3.9"
129133
- ADDRESS=PLACE MINER ADDRESS HERE
130134

131135
```
132-
You can generate your ADDRESS and MEMO_SEED phrase in the [wallet](https://wallet.3dpass.org/).
136+
You can generate your ADDRESS and MEMO_SEED phrase in the [wallet](https://wallet.3dpass.org/).
133137
Follow this [tutorial](https://3dpass.org/mainnet#docker) for more details.
134138

139+
## Validator set (Masternodes)
140+
Validators represent a set of the most reliable Nodes (authorities) eligible to vote for Best chain finalization in accordance with the GRANDPA [deterministic finality](https://github.com/3Dpass/3DP/wiki/Proof-of-Scan:-PoA-component#deterministic-blockchain-finality) protocol rules. The validator set is open to join for any Node that meets the [SLA](https://3dpass.org/mainnet#validator-requirements) requirements. Current members are automatically selected and managed by the validator set module, which exploits a [collateral-based mechanism](https://3dpass.org/mainnet#validator-threshold) to prevent the protocol rules violations. Follow [this](https://3dpass.org/mainnet#validator) tutorial to set up Validator.
135141

136-
## Connect to the wallet Front-end
142+
## Connect to the web3 wallet Front-end
137143
Open the wallet page: https://wallet.3dpass.org/. In order to connect your Node to the wallet in local you need to set up your local API endpoint as `ws://127.0.0.1:9944` in the Settings.
138144
Follow this [guidelines](https://3dpass.org/mainnet#wallet) for more details.
139145

140-
## Validator set (Masternodes)
141-
Validators represent a set of the most reliable Nodes (authorities) eligible to vote for Best chain finalization in accordance with the GRANDPA [deterministic finality](https://github.com/3Dpass/3DP/wiki/Proof-of-Scan:-PoA-component#deterministic-blockchain-finality) protocol rules. The validator set is open to join for any Node that meets the [SLA](https://3dpass.org/mainnet#validator-requirements) requirements. Current members are automatically selected and managed by the validator set module, which exploits a [collateral-based mechanism](https://3dpass.org/mainnet#validator-threshold) to prevent the protocol rules violations. Follow [this](https://3dpass.org/mainnet#validator) tutorial to set up Validator.
146+
## EVM and cross-platform options
147+
The Node is equipped with EVM compatibility layer comprised of the [EVM pallet](/pallets/evm) (Solidity code executor) as well as eth blockchain emulator with full client on top of the Substrate based master chain.
148+
149+
### Connect to Metamask and Remix in Local
150+
- Run the Node with the `--rpc-port 9978` flag (any port can be set up)
151+
- Add a custom chain to the Metamask wallet:
152+
- Name: `3dpass - The Ledger of Things (testnet)`
153+
- Testnet chain id: `1333`
154+
- RPC provider: `https://127.0.0.1:9978`
155+
- Open [Remix](https://remix.ethereum.org) and connect it through the Metamask to be able to deploy and run Solidity smart contracts
156+
157+
### EVM accounts
158+
There is a cross-platform mapping in place between the Substrate (H256) and EVM (H160) accounts, which allows for cross
159+
platfom actions - native token transfers, assets methods, etc. E.g. you can transfer tokens from EVM to any Substrate account and vice versa.
160+
And every account must have its `H256` version.
161+
162+
- H256 -> H160 (derived by cutting the tail 20 bytes)
163+
- e.g. `0xc6006fea43ccce14f9432f8e6b9403113c935cc17160cd438af2e7a02624124c` -> `0xc6006fea43ccce14f9432f8e6b9403113c935cc1`
164+
- H160 (private key) -> H256 address (mapped, **irreversible**)
165+
- e.g. `0xc6006fea43ccce14f9432f8e6b9403113c935cc1` -> `0xceb75620b9f3bc3a039b8e78efed58fa3c7422d18c97f1fd44abf3f2499d0760` (prefix 72: d7fJyRyHivFfDXsDs14oYgtqCt3scfHgaLT5NxHs5f6e5ycsN)
142166

143-
## Assets
144-
The [poScan](/pallets/poscan/) module serves as a mean of users' [objects authentication](https://3dpass.org/features#3dprc-2) within The Ledger of Things.
167+
Use this [converter](https://hoonsubin.github.io/evm-substrate-address-converter/) to create a cross-platform alias for either Substrate or EVM account (testnet address prefix:`72`).
168+
169+
### Custom precompiles
170+
Although the EVM exploits the [standard ethereum precompiles](https://github.com/3Dpass/3DP/tree/test/pallets/evm/precompile), there is a buch of
171+
[custom precompiles](/precompiles/), of which each one serves as a cross-platform `EVM -> Substrate` interface, so that native substrate functions can be called from Solidity.
172+
173+
- Interaction with native token (P3Dt): [balances-erc20](/precompiles/balances-erc20) precompile, Contract address: `0x0000000000000000000000000000000000000802`
174+
- Interaction with Local assets 3DPRC2 - [assets-erc20](https://github.com/3Dpass/3DP/tree/test/precompiles/assets-erc20) precompile,
175+
Contract address format: `0xFBFBFBFA + <assetid in hex>`, where the `assetid` is the asset index in [poscanAssets]() runtime module.
176+
e.g. You have created an asset with the `assetid 222`. The hex value of `222` is `DE` . So, the `H160` address to run the contract at is going to be as follows: `0xFBFBFBFA000000000000000000000000000000DE`.
177+
178+
## Assets
179+
The [poScan](/pallets/poscan/) module serves as a mean of users' [objects authenication](https://3dpass.org/features#3dprc-2) within The Ledger of Things.
145180

146181
Additionally, the Node is equipped with the [poscanAssets](/pallets/poscan-assets/) module, which allows for Real World Objects (RWA) tokenization. Either [3DPRC2](https://3dpass.org/assets#3dprc-2) tokens or conventional [fungible tokens](https://3dpass.org/assets#conventional-assets) and NFTs can be issued.
147182

@@ -151,7 +186,7 @@ The [assetConversion](/pallets/asset-conversion) module is a custom version of a
151186
## "Ink" smart contracts
152187
The Node supports native Substrate Smart contract trait using [ink](https://use.ink/), a Rust-based embedded domain specific language (eDSL) for writing [WebAssembly](https://webassembly.org/) smart contracts. Learn [how ink can be compared to Solidity](https://use.ink/ink-vs-solidity/). Follow these [guidelines](https://3dpass.org/assets#smart-contracts) to run your smart contract on LoT.
153188

154-
## Development
189+
## Development mode
155190

156191
### Single-Node Development Chain
157192

@@ -194,15 +229,18 @@ target/release/poscan-consensus --base-path /tmp/bob --chain local --bob --port
194229
```
195230
# Integration
196231

197-
- NODE - the Node is based on [Substrate](https://substrate.io/) framework and implemented as two-piece design the `Rust native` part and the `Runtime` component ([WASM](https://webassembly.org/)-based), which is upgradable online and allows for multiple useful modules to operate (see more [forkless upgrade](https://3dpass.org/proof-of-scan#forkless-upgrade)).
232+
# Integration
233+
234+
- NODE - the Node is based on [Substrate](https://substrate.io/) framework and implemented as two-piece design the `Rust native` part and the `Runtime` component ([WASM](https://webassembly.org/)-based), which is upgradable online and allows for multiple useful modules to operate (see more [forkless upgrade](https://3dpass.org/proof-of-scan#forkless-upgrade)).
198235
- RPC (remote procedure call) - the capabilities that allow blockchain users to interact with the network. The NODE provides HTTP and [WebSocket](https://github.com/3Dpass/3DP/wiki/Set-up-WSS-for-Remote-Connections) RPC servers.
199236
- CORE Networking - the [`libp2p`](https://libp2p.io/) is used as as networking stack for the Nodes to communicate with each other.
200237
- [3Dpass light wallet](https://github.com/3Dpass/wallet) - desktop users and 3D printing labs integration
201238
- [Pass3d mobile](https://github.com/3Dpass/threedpass) - smartphone and tablets users integration
202239

203240
<img width="719" alt="Node_integration" src="https://github.com/user-attachments/assets/93f186eb-c9db-4fd8-96b7-efc3b451a6b8">
204-
205-
### Responsibility disclaimer
241+
242+
243+
## Responsibility disclaimer
206244
This is an open source free p2p software. Use it at your own risk. 3dpass platform is non-profit and community-supported.
207245

208-
Copyright (C) 2022-2025 3Dpass
246+
Copyright (C) 2002-2025 3Dpass https://3dpass.org/

consensus/frontier/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Changelog for `fc-consensus`
2+
3+
## Unreleased
4+
* Bump `fc-db` to `2.0.0-dev`

consensus/frontier/Cargo.toml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
[package]
2+
name = "fc-consensus"
3+
version = "2.0.0-dev"
4+
authors = ["Parity Technologies <admin@parity.io>"]
5+
edition = "2021"
6+
license = "GPL-3.0-or-later WITH Classpath-exception-2.0"
7+
description = "Frontier consensus for substrate"
8+
repository = "https://github.com/paritytech/frontier/"
9+
10+
[package.metadata.docs.rs]
11+
targets = ["x86_64-unknown-linux-gnu"]
12+
13+
[dependencies]
14+
async-trait = "0.1"
15+
thiserror = "1.0"
16+
17+
# Substrate
18+
sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", rev = "b0777b4c7f7" }
19+
sc-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", rev = "b0777b4c7f7" }
20+
sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", rev = "b0777b4c7f7" }
21+
sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", rev = "b0777b4c7f7" }
22+
sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", rev = "b0777b4c7f7" }
23+
sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate", rev = "b0777b4c7f7" }
24+
sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate", rev = "b0777b4c7f7" }
25+
26+
# Frontier
27+
fc-db = { version = "2.0.0-dev", path = "../../frontier/db" }
28+
fp-consensus = { version = "2.0.0-dev", path = "../../primitives/consensus/evm" }
29+
fp-rpc = { version = "3.0.0-dev", path = "../../primitives/rpc" }

consensus/frontier/src/lib.rs

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
// This file is part of 3DPass.
2+
//
3+
// Copyright (c) 2020-2022 Parity Technologies (UK) Ltd.
4+
// Copyright (c) 2025 3DPass
5+
//
6+
// This program is free software: you can redistribute it and/or modify
7+
// it under the terms of the GNU General Public License as published by
8+
// the Free Software Foundation, either version 3 of the License, or
9+
// (at your option) any later version.
10+
//
11+
// This program is distributed in the hope that it will be useful,
12+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
// GNU General Public License for more details.
15+
//
16+
// You should have received a copy of the GNU General Public License
17+
// along with this program. If not, see <https://www.gnu.org/licenses/>.
18+
19+
use std::{collections::HashMap, marker::PhantomData, sync::Arc};
20+
21+
// Substrate
22+
use sc_client_api::{backend::AuxStore, BlockOf};
23+
use sc_consensus::{BlockCheckParams, BlockImport, BlockImportParams, ImportResult};
24+
use sp_api::{ProvideRuntimeApi, BlockId, Core};
25+
use sp_block_builder::BlockBuilder as BlockBuilderApi;
26+
use sp_blockchain::{well_known_cache_keys::Id as CacheKeyId, HeaderBackend};
27+
use sp_consensus::Error as ConsensusError;
28+
use sp_runtime::traits::{Block as BlockT, Header as HeaderT};
29+
// Frontier
30+
use fp_consensus::{ensure_log, FindLogError};
31+
use fp_rpc::EthereumRuntimeRPCApi;
32+
33+
#[derive(Debug, thiserror::Error)]
34+
pub enum Error {
35+
#[error("Multiple runtime Ethereum blocks, rejecting!")]
36+
MultipleRuntimeLogs,
37+
#[error("Runtime Ethereum block not found, rejecting!")]
38+
NoRuntimeLog,
39+
#[error("Cannot access the runtime at genesis, rejecting!")]
40+
RuntimeApiCallFailed,
41+
}
42+
43+
impl From<Error> for String {
44+
fn from(error: Error) -> String {
45+
error.to_string()
46+
}
47+
}
48+
49+
impl From<FindLogError> for Error {
50+
fn from(error: FindLogError) -> Error {
51+
match error {
52+
FindLogError::NotFound => Error::NoRuntimeLog,
53+
FindLogError::MultipleLogs => Error::MultipleRuntimeLogs,
54+
}
55+
}
56+
}
57+
58+
impl From<Error> for ConsensusError {
59+
fn from(error: Error) -> ConsensusError {
60+
ConsensusError::ClientImport(error.to_string())
61+
}
62+
}
63+
64+
pub struct FrontierBlockImport<B: BlockT, I, C> {
65+
inner: I,
66+
client: Arc<C>,
67+
backend: Arc<fc_db::Backend<B>>,
68+
_marker: PhantomData<B>,
69+
}
70+
71+
impl<Block: BlockT, I: Clone + BlockImport<Block>, C> Clone for FrontierBlockImport<Block, I, C> {
72+
fn clone(&self) -> Self {
73+
FrontierBlockImport {
74+
inner: self.inner.clone(),
75+
client: self.client.clone(),
76+
backend: self.backend.clone(),
77+
_marker: PhantomData,
78+
}
79+
}
80+
}
81+
82+
impl<B, I, C> FrontierBlockImport<B, I, C>
83+
where
84+
B: BlockT,
85+
I: BlockImport<B, Transaction = sp_api::TransactionFor<C, B>> + Send + Sync,
86+
I::Error: Into<ConsensusError>,
87+
C: ProvideRuntimeApi<B> + Send + Sync + HeaderBackend<B> + AuxStore + BlockOf,
88+
C::Api: EthereumRuntimeRPCApi<B>,
89+
C::Api: BlockBuilderApi<B>,
90+
{
91+
pub fn new(inner: I, client: Arc<C>, backend: Arc<fc_db::Backend<B>>) -> Self {
92+
Self {
93+
inner,
94+
client,
95+
backend,
96+
_marker: PhantomData,
97+
}
98+
}
99+
}
100+
101+
#[async_trait::async_trait]
102+
impl<B, I, C> BlockImport<B> for FrontierBlockImport<B, I, C>
103+
where
104+
B: BlockT,
105+
I: BlockImport<B, Transaction = sp_api::TransactionFor<C, B>> + Send + Sync,
106+
I::Error: Into<ConsensusError>,
107+
C: ProvideRuntimeApi<B> + Send + Sync + HeaderBackend<B> + AuxStore + BlockOf,
108+
C::Api: EthereumRuntimeRPCApi<B>,
109+
C::Api: BlockBuilderApi<B>,
110+
{
111+
type Error = ConsensusError;
112+
type Transaction = sp_api::TransactionFor<C, B>;
113+
114+
async fn check_block(
115+
&mut self,
116+
block: BlockCheckParams<B>,
117+
) -> Result<ImportResult, Self::Error> {
118+
119+
let parent_id: BlockId<B> = BlockId::hash(block.parent_hash);
120+
121+
let ver = self.client
122+
.runtime_api()
123+
.version(&parent_id)
124+
.map_err(|_err| Error::RuntimeApiCallFailed)?;
125+
126+
if ver.spec_version <= 128u32 {
127+
return Ok(ImportResult::imported(true))
128+
}
129+
130+
self.inner.check_block(block).await.map_err(Into::into)
131+
}
132+
133+
async fn import_block(
134+
&mut self,
135+
block: BlockImportParams<B, Self::Transaction>,
136+
new_cache: HashMap<CacheKeyId, Vec<u8>>,
137+
) -> Result<ImportResult, Self::Error> {
138+
139+
let parent_id: BlockId<B> = BlockId::hash(*block.header.parent_hash());
140+
141+
let ver = self.client
142+
.runtime_api()
143+
.version(&parent_id)
144+
.map_err(|_err| Error::RuntimeApiCallFailed)?;
145+
146+
if ver.spec_version <= 128u32 {
147+
return Ok(ImportResult::imported(true))
148+
}
149+
150+
// We validate that there are only one frontier log. No other
151+
// actions are needed and mapping syncing is delegated to a separate
152+
// worker.
153+
ensure_log(block.header.digest()).map_err(Error::from)?;
154+
155+
self.inner
156+
.import_block(block, new_cache)
157+
.await
158+
.map_err(Into::into)
159+
}
160+
}

consensus/poscan/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name = "sc-consensus-poscan"
33
version = "0.9.0"
44
authors = ["Parity Technologies <admin@parity.io>"]
55
description = "PoW consensus algorithm for substrate"
6-
edition = "2018"
6+
edition = "2021"
77
license = "GPL-3.0-or-later WITH Classpath-exception-2.0"
88
homepage = "https://substrate.dev"
99
repository = "https://github.com/paritytech/substrate/"
@@ -29,6 +29,7 @@ sp-consensus = { default-features = false, git = "https://github.com/paritytech/
2929
sp-application-crypto = { default-features = false, git = "https://github.com/paritytech/substrate", rev = "b0777b4c7f7" }
3030
sp-timestamp = { default-features = false, git = "https://github.com/paritytech/substrate", rev = "b0777b4c7f7" }
3131
sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", rev = "b0777b4c7f7" }
32+
fp-consensus = { version = "2.0.0-dev", path="../../primitives/consensus/evm" }
3233
async-trait = "0.1.50"
3334
log = "0.4"
3435
futures = { version = "0.3", features = ["compat"] }

0 commit comments

Comments
 (0)