Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

星火车品
2314 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。9 n) W/ }& j) ?& A% Z7 o5 e
基本智能合约6 X# C% l8 g% ^9 ~
CasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。
  ^9 l5 ~6 g3 Z" i( c; K#[no_mangle]
/ i7 w2 [5 R7 \) D$ n! o) ?1 M# ]pub extern "C" fn call() {}/ }1 K6 \1 Q) K8 |5 H( f
该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call
" W) V" w* i7 ?使用错误代码# O) h! `4 q2 R; l( {+ w
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:
    # P. A' s% {* a
  2. use casperlabs_contract::contract_api::runtime;: p4 c, ^  w! n. Z$ s
  3. use casperlabs_types::ApiError;
    - a; E- a+ M- u& f$ e0 j
  4. #[no_mangle]
    * @: u* w: A9 K- a0 I$ k6 V  f
  5. pub extern "C" fn call() {7 h: W' Y8 f4 D
  6.   runtime::revert(ApiError::PermissionDenied)% m- y; j) h3 E
  7. }
复制代码

2 R6 l9 B* h2 `+ d& |' o! X6 VCasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()1 y( U& f9 v4 A
当合约以错误代码退出时,退出代码在“块浏览器”中可见。
3 P( q( {- o) ]3 ?8 c参数
. _' L9 [7 V4 V. W可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。
, m; {* \5 |5 K) P' q8 y$ _/ w
  1. use casperlabs_contract::contract_api::runtime;3 r) W: \& k! K! C: F% Z. c# u1 D
  2. #[no_mangle]
    ( m$ u4 r8 O0 N
  3. pub extern "C" fn call() {& P4 o/ U  w1 s5 o! j% k8 _. T, ^$ w
  4.   let value: String = runtime::get_named_arg("value");# w1 D8 {2 Y7 P9 c
  5. }
复制代码

8 A4 \7 H  z: q: C8 S" S存储: `- D( y1 s  d) T
在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:
; B/ L2 @; U+ o; i
  1. const KEY: &str = "special_value";& |  l! z9 e# |" z3 ]! I
  2. fn store(value: String) {/ k8 x0 p; q. C3 t
  3.   // Store `value` under a new unforgeable reference.& W" B$ V4 w+ V7 B& I9 J, u2 e
  4.   let value_ref = storage::new_turef(value);4 w$ \6 H6 r; ?" S2 @- Y% G
  5.   // Wrap the unforgeable reference in a `Key`.
    7 s' r( ^4 i, {# [5 B! q7 U
  6.   let value_key: Key = value_ref.into();( S/ S" C; F& ^4 r' d3 |! Q- `" \4 ]
  7.   // Store this key under the name "special_value" in context-local storage.0 W2 H3 M7 Q7 s+ [  m8 f
  8.   runtime::put_key(KEY, value_key);
    : m9 i3 W. F2 x
  9. }
复制代码
+ k8 d% p% z" c- V$ F

# R" ]" a; S* F& g4 {
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12