Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

如何在CasperLabs上编写Rust智能合约

星火车品
2366 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。
* j. }* N, K! x# M* I' ?7 u基本智能合约
6 s- X1 F4 [  E: M& XCasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。
9 P8 v$ I) S4 u' T#[no_mangle]
9 D  |0 q+ C# \1 t4 vpub extern "C" fn call() {}. F! C) `& ]& c: k5 X6 L9 y
该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call6 x  n1 t* ], B: H$ Y# k9 `3 g9 _
使用错误代码$ l/ m9 x- E3 Z9 W3 O
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:
    3 k0 V8 ]+ ~7 L$ E0 N
  2. use casperlabs_contract::contract_api::runtime;/ i# ^, ^# X+ b  A$ j
  3. use casperlabs_types::ApiError;
    / z( s9 O& u" U# f: P( W
  4. #[no_mangle]
    $ y- W5 V! B0 f
  5. pub extern "C" fn call() {  B9 a: X& P& |% d! b( a" T' G
  6.   runtime::revert(ApiError::PermissionDenied)$ F4 e: {5 ?& S
  7. }
复制代码
+ ?& d/ X9 Q) D; _1 @- _
CasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()* I/ n6 u  G+ f% x
当合约以错误代码退出时,退出代码在“块浏览器”中可见。/ T# o3 ~& r+ w3 X- ^# u+ k- p! i5 f
参数  r, U: H9 k, V4 f, x$ t( [
可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。# }7 \$ q5 h- U% T0 S* Q. F
  1. use casperlabs_contract::contract_api::runtime;+ B8 _8 l0 q# r) }( `
  2. #[no_mangle]; ~: a: [7 B% b
  3. pub extern "C" fn call() {
    5 |* `0 `3 |- @
  4.   let value: String = runtime::get_named_arg("value");
    7 s$ K) i& R9 _2 F# u5 q0 E
  5. }
复制代码

4 h. |+ |2 W+ L存储$ o* W" D% I7 i& u" B
在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:4 ?- Q3 n1 _. }! C* I1 y; b. ?
  1. const KEY: &str = "special_value";4 K4 f& ^3 T9 L; R$ P" \6 [, b
  2. fn store(value: String) {
    ( y& n, |7 K: ?; z4 `3 j
  3.   // Store `value` under a new unforgeable reference.
    ( m5 V5 l7 P  L6 m& @% Y7 \; }; W
  4.   let value_ref = storage::new_turef(value);2 R1 {/ U! P/ a. k  d0 w
  5.   // Wrap the unforgeable reference in a `Key`.
    & r- }' U  G0 R7 t
  6.   let value_key: Key = value_ref.into();- [+ i6 `7 T& q
  7.   // Store this key under the name "special_value" in context-local storage.
    " r/ ?- A8 z( {' Y/ P  p
  8.   runtime::put_key(KEY, value_key);
    5 f: \8 a4 g8 X* H7 T  a
  9. }
复制代码

. k0 ~5 Z% c* h
7 a, s2 `1 W- ^1 g0 b9 C2 P3 C
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12