Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

星火车品
2355 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。
. F! a. P2 t6 f/ [5 j3 V5 q基本智能合约
4 a6 U! Y- J/ v8 z: r+ eCasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。
0 X- S; i; ~$ X1 ~# X6 V1 h: N#[no_mangle]1 N" q! ~: w* j
pub extern "C" fn call() {}1 I7 M( B6 u1 Y# i
该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call% [* k! n# ]! F  g& y0 l/ h
使用错误代码
/ l4 J2 K  a9 j5 q9 K2 G
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:4 v' `  v" V  A# t5 v0 M0 t
  2. use casperlabs_contract::contract_api::runtime;) |# z( w+ g* f# \$ ]) \
  3. use casperlabs_types::ApiError;7 A6 q- D2 {3 r1 F8 W
  4. #[no_mangle]$ p$ L& {5 F6 @3 I3 T
  5. pub extern "C" fn call() {
    & K9 I& j- _* G) l. \, k3 E
  6.   runtime::revert(ApiError::PermissionDenied)
    2 S0 S! T, d: l+ e- R  u7 s  N' x
  7. }
复制代码
. H7 O4 _% ?0 j2 P$ c1 y
CasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()
, q5 J6 L, c! u! v$ l当合约以错误代码退出时,退出代码在“块浏览器”中可见。
* y+ X) Y$ v, ^' X9 M参数
# C% i! p& C! |4 Z# U: _可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。
8 A1 z8 U* q: E/ k7 a% I
  1. use casperlabs_contract::contract_api::runtime;$ v; m* _7 z  k
  2. #[no_mangle]+ |3 A5 \- S- s' L  X
  3. pub extern "C" fn call() {# k4 ~! _1 u/ A( c, O
  4.   let value: String = runtime::get_named_arg("value");
    * {/ N7 V/ g7 y( Z; N
  5. }
复制代码
$ c: }3 |+ B0 V4 Y1 m
存储* C, d$ P* r- x
在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:
6 O# e' u  }4 e* L4 r# x7 F- O+ U
  1. const KEY: &str = "special_value";" t" S' e& g3 n/ N2 d
  2. fn store(value: String) {
    7 r& x! j  C; o' O0 E
  3.   // Store `value` under a new unforgeable reference.
    6 i* v" i. g) \
  4.   let value_ref = storage::new_turef(value);
    ) Z; ?" h7 a% K8 g' @6 O: i  z: g
  5.   // Wrap the unforgeable reference in a `Key`.
    8 y; K: N' o, y! K- B7 R9 n
  6.   let value_key: Key = value_ref.into();. a1 b' p7 D* R) s- |$ Z8 h
  7.   // Store this key under the name "special_value" in context-local storage.
    ) P7 _$ X; ^2 w1 A
  8.   runtime::put_key(KEY, value_key);
    . J8 w6 K8 W7 O3 K2 X. F; @
  9. }
复制代码
; v8 l7 R  p' Z0 E

2 m8 _5 Q1 s# J; @# C
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12