Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

星火车品
2344 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。
/ J8 e8 b# N4 g9 w# t9 }7 q基本智能合约2 v* Z( I' L  {0 D: u6 y
CasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。% w9 Y4 I6 Y+ E3 @' P
#[no_mangle]5 I& d9 F5 \! g
pub extern "C" fn call() {}# [& j$ Z/ R& p  }& _
该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call* k8 Z. b+ S9 v4 M& L% t  D  [
使用错误代码( k8 m6 f# c# J9 h8 t
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:, x% \! C4 p" K3 D& ^2 B% o+ d1 c
  2. use casperlabs_contract::contract_api::runtime;
    % P+ W& g. a5 F, n7 L
  3. use casperlabs_types::ApiError;2 }1 r* X  T7 ^0 p
  4. #[no_mangle]" Q  F( H3 Z$ s/ b$ A+ i
  5. pub extern "C" fn call() {
    # y% g* V0 i  Z* j
  6.   runtime::revert(ApiError::PermissionDenied)2 n: v/ E7 p# y0 V0 R1 b! N* {
  7. }
复制代码
5 k  \" ]( I% L2 i) z
CasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()
* o& i% S# q3 I+ e+ {3 X; r当合约以错误代码退出时,退出代码在“块浏览器”中可见。3 \0 h8 v( Q3 a$ y- E: z* T
参数( x+ r9 D1 f8 A1 ~6 h& S0 ~
可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。
- R0 m. ~- u; |/ _4 q0 }
  1. use casperlabs_contract::contract_api::runtime;
    ) ~3 l/ ^6 i4 {! D
  2. #[no_mangle]+ w/ \# A+ P" I+ D$ r6 v
  3. pub extern "C" fn call() {
    9 T% s) ^; `! ?
  4.   let value: String = runtime::get_named_arg("value");
    ' t, R6 B9 ]. y: C$ _6 `
  5. }
复制代码
3 O. A0 \/ `, {% |
存储: I% B! K8 w+ ^% E0 D+ a* ~: z" V$ H
在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:9 |3 i- O* D% y  ?% y4 t
  1. const KEY: &str = "special_value";
    3 [. {8 Q0 k7 F7 d) j5 U$ ~
  2. fn store(value: String) {% }8 Y. a4 k! A. {# O0 p( @
  3.   // Store `value` under a new unforgeable reference.: G3 m* ^4 {+ N
  4.   let value_ref = storage::new_turef(value);
    ' r: `7 n% u/ r: z. G9 y
  5.   // Wrap the unforgeable reference in a `Key`.
    . ^* j2 @5 q9 g+ B+ N3 C5 n( ~
  6.   let value_key: Key = value_ref.into();
    2 f7 Z: c2 `7 ?% @  ^
  7.   // Store this key under the name "special_value" in context-local storage.( u) \( `/ \/ I7 j& h- o0 W
  8.   runtime::put_key(KEY, value_key);
    + T9 \& |2 h  C  Z4 \; B. {
  9. }
复制代码
6 U- ~0 C. H7 P

0 \* L1 V8 [3 d% H  t  i
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12