Skip to main content

amadeus_runtime/consensus/bic/
contract.rs

1use crate::Result;
2use crate::bcat;
3use crate::consensus::consensus_apply::ApplyEnv;
4use crate::consensus::consensus_kv::{kv_get, kv_put};
5
6/// Validate WASM bytecode - basic validation of magic number and version
7pub fn validate(wasm: &[u8]) -> Result<()> {
8    // Check WASM magic number (0x00, 0x61, 0x73, 0x6d)
9    if wasm.len() < 8 {
10        return Err("wasm_too_small");
11    }
12    if &wasm[0..4] != b"\x00asm" {
13        return Err("invalid_wasm_magic");
14    }
15    // Check version (0x01, 0x00, 0x00, 0x00)
16    if &wasm[4..8] != b"\x01\x00\x00\x00" {
17        return Err("invalid_wasm_version");
18    }
19    Ok(())
20}
21
22pub fn call_deploy(env: &mut ApplyEnv, args: Vec<Vec<u8>>) -> Result<()> {
23    if args.len() != 1 {
24        return Err("invalid_args");
25    }
26    let wasmbytes = args[0].as_slice();
27
28    // Validate WASM before storing
29    validate(wasmbytes)?;
30
31    kv_put(env, &bcat(&[b"account:", env.caller_env.account_caller.as_slice(), b":attribute:bytecode"]), wasmbytes)?;
32    Ok(())
33}
34
35pub fn bytecode(env: &mut ApplyEnv, account: &[u8]) -> Result<Option<Vec<u8>>> {
36    kv_get(env, &bcat(&[b"account:", &account, b":attribute:bytecode"]))
37}
38
39/// Dispatch contract module calls
40pub fn call(env: &mut ApplyEnv, function: &str, args: &[Vec<u8>]) -> Result<()> {
41    match function {
42        "deploy" => call_deploy(env, args.to_vec()),
43        _ => Err("invalid_function"),
44    }
45}