Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

星火车品
2353 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。
9 z+ c8 A& x( z% W5 s( |基本智能合约, t: v5 v" p8 Z
CasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。
  t& s- H8 G! e#[no_mangle]
) D% P- r/ M. ?7 V) q- W" s3 c. l! fpub extern "C" fn call() {}
* R: h3 Y2 D! C) j2 i. U9 N该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call
$ H6 i1 D  _& C/ s/ L6 ?% E使用错误代码
" {! R  I9 z' e. X' f
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:
    , y: W3 j& ^  J/ E; `# g" Y
  2. use casperlabs_contract::contract_api::runtime;
    - S5 `9 K6 g4 ^
  3. use casperlabs_types::ApiError;
    2 d; H/ J; |0 s
  4. #[no_mangle]
    ( f+ n  ]) @( h, @9 v2 J* Q2 |
  5. pub extern "C" fn call() {
    2 J5 J% b0 y' z, t6 \
  6.   runtime::revert(ApiError::PermissionDenied)
    + w( E( F5 J- @5 m
  7. }
复制代码

" U; H# J, i! z7 i4 ICasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User(). m& L/ M! b: B# M2 x5 z
当合约以错误代码退出时,退出代码在“块浏览器”中可见。( k7 }9 M2 i( N) f
参数
- m9 I3 a3 r# ~$ v% u可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。
- e+ f! s- d8 M0 x* _
  1. use casperlabs_contract::contract_api::runtime;3 M% X, t5 r9 b
  2. #[no_mangle]
    " R; k% v* e9 W/ e4 H
  3. pub extern "C" fn call() {
    2 I: K* S, o/ w6 w2 O8 n
  4.   let value: String = runtime::get_named_arg("value");. x% E. O: n# O( b
  5. }
复制代码
& m3 R' V$ U2 S  }3 A9 ]1 q
存储
9 W- y4 Q8 R% x. J, B在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:
& `- `7 Y" t  I1 H
  1. const KEY: &str = "special_value";( E' L$ N! `& C# |8 a
  2. fn store(value: String) {1 e3 K1 m4 g+ I/ T$ p# K$ E1 P
  3.   // Store `value` under a new unforgeable reference.
    + ^* n9 ]( V% w: }4 K+ q
  4.   let value_ref = storage::new_turef(value);
    ! _  f" n2 n5 J/ o0 x! R% H
  5.   // Wrap the unforgeable reference in a `Key`.1 |: R* V4 a7 ~+ u2 h4 c
  6.   let value_key: Key = value_ref.into();% r+ P- E8 x8 j9 D  e8 h. N
  7.   // Store this key under the name "special_value" in context-local storage.
    " m: n: M- R/ m$ I5 [; l
  8.   runtime::put_key(KEY, value_key);
    + X! ^) Y5 b- ^& M" V& W( a
  9. }
复制代码
8 L# ~8 M1 d( K! A

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

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12