1 个稳定版本

1.0.0 2023年2月7日

#13#fvm


用于 fvm-macros

Apache-2.0

93KB
2K SLoC

fvm-mock

fvm-mock 是开发者用于本地检查合约逻辑是否正确的工具,适用于 hyperchain。

示例合约

use macros::contract;
use macros::storage;
use fvm_std::runtime;
use scale::{Decode, Encode};

#[storage]
pub struct TestHello {}

#[contract]
impl TestHello {
    fn new() -> Self {
        Self {}
    }

    // 将键值对的键名加上test前缀再存入
    pub fn set(&mut self, key: String, value: String) {
        runtime::storage_write(key.as_bytes(), "test".as_bytes(), value.as_bytes())
    }

    // 读取存入的数据
    pub fn get(&mut self, key: String) -> Vec<u8> {
        return if let Some(res) = runtime::storage_read(key.as_bytes(), "test".as_bytes()) {
            res
        } else {
            vec![]
        };
    }
}

为了本地测试,我们需要做以下操作

  • cargo.toml 中添加依赖项
[dev-dependencies]
# ... other dependencies
fvm-mock = "xxx"
  • 在单元测试中调用 build_runtime()
#[cfg(test)]
mod tests {
    use scale::{Decode, Encode};
    use crate::TestHello;
    use fvm_mock::build_runtime;

    #[test]
    fn test_set() {
        let mut contract = TestHello::new();
        let handle = build_runtime();
        contract.set("hello".to_string(), "world".to_string());
        assert_eq!("world".as_bytes(), contract.get("hello".to_string()).as_slice())
    }

    #[test]
    fn test_get() {
        let mut contract = TestHello::new();
        let handle = build_runtime();
        handle.storage_write("hello", "test", "world");
        assert_eq!("world".as_bytes(), contract.get("hello".to_string()).as_slice())
    }
}

请注意,如果您能够通过单元测试,这表明逻辑是正确的,但这并不能表示它可以在区块链上良好运行。因为有一些规范WASM核心支持不好,所以开发者应该确保您不使用它们,例如 打印到控制台文件读取 等。

依赖项

~6.5MB
~114K SLoC