基本智能合约
CasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。
#[no_mangle]
pub extern "C" fn call() {}
该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call
使用错误代码
- CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:
- use casperlabs_contract::contract_api::runtime;
- use casperlabs_types::ApiError;
- #[no_mangle]
- pub extern "C" fn call() {
- runtime::revert(ApiError::PermissionDenied)
- }
CasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()
当合约以错误代码退出时,退出代码在“块浏览器”中可见。
参数
可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。
- use casperlabs_contract::contract_api::runtime;
- #[no_mangle]
- pub extern "C" fn call() {
- let value: String = runtime::get_named_arg("value");
- }
存储
在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:
- const KEY: &str = "special_value";
- fn store(value: String) {
- // Store `value` under a new unforgeable reference.
- let value_ref = storage::new_turef(value);
- // Wrap the unforgeable reference in a `Key`.
- let value_key: Key = value_ref.into();
- // Store this key under the name "special_value" in context-local storage.
- runtime::put_key(KEY, value_key);
- }