Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

星火车品
2396 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。  F) b( S9 w+ B) i  ?
基本智能合约1 P2 O1 r5 a1 l7 i0 ^; z% O
CasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。
1 p! Y! {2 n5 J/ W/ g) I: X* I#[no_mangle]
  `) U# b7 _% y+ [4 n. n/ q: Upub extern "C" fn call() {}4 S/ M3 z8 H9 s8 y5 p
该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call
' x. ~+ a1 {8 v使用错误代码: o+ P; G9 I  X6 r$ z' U
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:
    . U- s+ ?- \& b4 c% f
  2. use casperlabs_contract::contract_api::runtime;
    : x$ _; f' S8 R; L% y
  3. use casperlabs_types::ApiError;
    $ @% C( o* L6 v
  4. #[no_mangle]
    3 k; B5 `# _" G, y+ \6 O5 C. F
  5. pub extern "C" fn call() {' p6 V' M# n) N  I& t% u$ r
  6.   runtime::revert(ApiError::PermissionDenied)( h9 e/ c- a9 j7 T: I
  7. }
复制代码

* T2 E: m8 s' `- OCasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()  T! H( ^( P. r; n
当合约以错误代码退出时,退出代码在“块浏览器”中可见。
% K0 q. P6 e& h! t. T8 q参数; Q& g8 K$ _) l. A* e/ y! X
可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。; @6 q- W0 t' A
  1. use casperlabs_contract::contract_api::runtime;( M; {  P5 d: J
  2. #[no_mangle]
    ' ?# I# ~/ i. k0 z- V$ L8 p. l
  3. pub extern "C" fn call() {2 d& D! O( Q4 r3 B1 {
  4.   let value: String = runtime::get_named_arg("value");3 o  H* B* }9 p5 }: D. }
  5. }
复制代码
/ [4 {' Y# S- r, c
存储- ]& P! r2 ^2 l2 H
在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:
. a! N! C0 X1 C4 D# M$ U& o
  1. const KEY: &str = "special_value";$ n7 X" \, u) E9 x: Q
  2. fn store(value: String) {
    0 r3 c8 l; }. `
  3.   // Store `value` under a new unforgeable reference.% V0 f5 ^6 v0 g9 N7 v. y4 l- X
  4.   let value_ref = storage::new_turef(value);
    $ M, `9 b- F$ J& V
  5.   // Wrap the unforgeable reference in a `Key`.6 c, a8 g% ]# x4 @
  6.   let value_key: Key = value_ref.into();
    6 S3 f- t5 t% e' {3 O5 D& j4 d8 k
  7.   // Store this key under the name "special_value" in context-local storage.
    , [: L& m! @9 A: ~- e+ g9 @
  8.   runtime::put_key(KEY, value_key);
    & [0 w$ s+ J2 K/ m9 h
  9. }
复制代码
6 N+ l3 v/ m8 c1 D  s. V  \( ]
$ H' N5 v  ]8 S- |) H
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12