Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

星火车品
2345 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。! _' g4 q7 b0 i( c. X6 @( ]. t0 y
基本智能合约# A/ A: ~' \& k& |% I" z) m$ b
CasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。# g# {  m( X; @/ Y+ c' j5 N
#[no_mangle]
; r* s/ J, T- f3 L% a0 opub extern "C" fn call() {}
4 y- ]. n' L. D  g7 k( e; K该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call
+ G. _! ~5 R4 t7 u使用错误代码+ I: M- L0 y3 B2 c0 V5 L! D, C$ v# J
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:
    " g; w7 d% d% ?/ x; A2 W
  2. use casperlabs_contract::contract_api::runtime;
    / K. E& v! q5 I# r9 V
  3. use casperlabs_types::ApiError;
    % u8 q: X/ r( v
  4. #[no_mangle]
    # N1 c: R" U: C3 q7 h" b' N: \
  5. pub extern "C" fn call() {" Y, o0 W5 H5 K( n4 B1 A% d. @
  6.   runtime::revert(ApiError::PermissionDenied)
    + S8 T0 g' \7 G. o5 P
  7. }
复制代码
, Y- J+ k5 I6 p! `5 T2 u
CasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()
9 l& e: h% W' M' Q当合约以错误代码退出时,退出代码在“块浏览器”中可见。
) V, i& v1 R7 C* m, _+ J& g- ]! H参数
( l- @7 t* w# t; [2 f$ F0 [可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。6 d9 U7 A  m. b+ m& @0 \
  1. use casperlabs_contract::contract_api::runtime;0 v4 D' k5 V. A! {" A
  2. #[no_mangle]! C1 h$ Z( h/ r& Y
  3. pub extern "C" fn call() {5 g- ]3 _. M+ M" v, [: }% J) T
  4.   let value: String = runtime::get_named_arg("value");2 V; }! E: O$ ~. x+ Q
  5. }
复制代码

7 t# [6 r' [% P存储2 u! J" v$ g9 Z" ^. H/ k
在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:6 f. r  z+ S6 p5 P% t" `
  1. const KEY: &str = "special_value";3 s" ]5 v/ X7 _! Y' j
  2. fn store(value: String) {
    9 h4 S/ b5 |; {# p* V
  3.   // Store `value` under a new unforgeable reference.7 _6 A6 l' [" c! J
  4.   let value_ref = storage::new_turef(value);+ r  }# x; ^" [: W9 N
  5.   // Wrap the unforgeable reference in a `Key`.( B0 x5 w% U5 F+ u' C
  6.   let value_key: Key = value_ref.into();
    / B( ~/ c$ m; x9 L
  7.   // Store this key under the name "special_value" in context-local storage.* _! X, w) G, e
  8.   runtime::put_key(KEY, value_key);
    1 h3 P6 ?" q* b9 \3 S" R
  9. }
复制代码

7 X* ]/ V9 C1 K
5 a, j, I( m) t! C9 X3 b& v  L5 P
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12