casper-ecosystem / cep18

Implementation of ERC20 token for the CasperLabs platform.
https://casper.network/docs/dapp-dev-guide
Apache License 2.0
27 stars 46 forks source link

Disable integer sign extensions #139

Closed rafal-ch closed 4 months ago

rafal-ch commented 4 months ago

This PR modifies the build script to build WASM without the unuspported opcodes. It also updates the pinned nightly to 2024-05-28 to show that this solution works with nightly toolchains based on Rust newer than 1.69.

Fixes: https://github.com/casper-network/casper-node/issues/4574

Running:

make prepare
make test

should result in

test result: ok. 29 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.39s

Rationale: This is caused by the sign extension feature in code generator (LLVM)

12:04:22 ~/Casper/cep18 (dev*) $ wasm2wat target/wasm32-unknown-unknown/release/cep18.wasm | grep i32.extend8_s
                i32.extend8_s

i32.extend8_s is the opcode number 192 (0xc0).

These are enabled by default in LLVM 16 which is used in Rust starting from 1.70.

$ rustc +1.69 --version --verbose
rustc 1.69.0 (84c898d65 2023-04-16)
LLVM version: 15.0.7
$ rustc +1.70 --version --verbose
rustc 1.70.0 (90c541806 2023-05-31)
LLVM version: 16.0.2

We can dodge that by setting the target-cpu=mvp flag, but since this affects std which comes as a prebuilt package, we also need to rebuild std ourselves.

Hence we need sources: rustup component add rust-src

and appropriately modified build script.


Actually, it should be enough to set -C target-feature=-sign-ext, but this still produces the i32.extend8_s opcode (as can be seen in the compiler explorer here (not my link, though) - https://godbolt.org/z/Te5fczPhM Could be an issue in the LLVM itself, we should keep an eye on this.

deuszex commented 4 months ago

@ACStoneCL this might be worth a doc