Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

星火车品
2399 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。
) W7 k6 i- J! V3 B基本智能合约
; u6 K0 m: x! KCasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。6 m8 H/ [3 N6 [* I
#[no_mangle]
' X8 X4 e% H; U: P9 ypub extern "C" fn call() {}0 }% H+ u. y! R2 W7 \
该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call# s) Y. Y9 w% D7 M' I1 @
使用错误代码! B- `7 {1 L6 A) ?  |7 ^) Z
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:
      O- V, Q1 Z4 Y5 p
  2. use casperlabs_contract::contract_api::runtime;' ^1 x$ Q7 Q7 Y6 U
  3. use casperlabs_types::ApiError;# G1 o- }) R3 x- }/ e$ D
  4. #[no_mangle]
    3 i* {" W+ E6 B3 S; b4 r. J! ~
  5. pub extern "C" fn call() {
    0 u* g. D9 _3 q1 r. T: f# _+ s
  6.   runtime::revert(ApiError::PermissionDenied)9 o. n$ K* m4 r( l  P
  7. }
复制代码
/ Y9 L# O2 s6 F* A8 |' `
CasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()& }0 m# m2 t: P8 a! I1 U- L5 X5 F
当合约以错误代码退出时,退出代码在“块浏览器”中可见。. @# a/ \8 c5 J9 `  R; c1 Q3 a  \
参数0 s7 X$ r; S& D, H3 `
可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。
; }: R& b0 C* o: X! H2 f0 r' u
  1. use casperlabs_contract::contract_api::runtime;8 [2 Z# S7 ^7 C
  2. #[no_mangle]/ F" q/ }$ h+ I7 v8 h& b
  3. pub extern "C" fn call() {! d! ^+ `: x, N' w1 g' O( C
  4.   let value: String = runtime::get_named_arg("value");: U2 N/ {& K2 J- {8 y1 e2 z
  5. }
复制代码

( @/ R5 O! d2 }& N/ H, f3 M存储
+ i3 c: g6 k9 b  m; H; S在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:) }  h0 Q% V* m
  1. const KEY: &str = "special_value";
    % F: \7 f# b8 H% w& m" ]
  2. fn store(value: String) {
    ) E' t( M2 P  J% L' K7 V" l5 J" q
  3.   // Store `value` under a new unforgeable reference.
    / i) ?! b) I& I4 @  b! U7 D: K5 d
  4.   let value_ref = storage::new_turef(value);' h, w& s. C, ^6 _! A
  5.   // Wrap the unforgeable reference in a `Key`.
      o8 l0 ]/ V4 M
  6.   let value_key: Key = value_ref.into();
    " E+ x1 m$ R; ~' @- N* D6 Y. Z" b
  7.   // Store this key under the name "special_value" in context-local storage.
    ( ^3 L6 ]; ]' [) W6 P
  8.   runtime::put_key(KEY, value_key);
    : \& y# D" ?( S0 E5 K! o6 p
  9. }
复制代码
6 i7 i& W8 S" d
8 ~! k) @# ?) n8 H1 N
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12