Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

星火车品
2342 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。" A' ?6 K1 p2 |' M& ^+ ^6 o) `
基本智能合约1 u- E; T+ v5 k! E" S/ P
CasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。9 i9 {7 f6 Y) r& a  P
#[no_mangle]
( K0 S8 P9 O, b7 A' W* W+ npub extern "C" fn call() {}
% {7 f4 I' I: r  u+ q该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call
6 M- q7 `2 |: A1 s; v  l使用错误代码5 X; Q' ?0 G0 y  I
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:
    & N: s) l7 K3 J( n0 ?
  2. use casperlabs_contract::contract_api::runtime;( j3 E5 S1 l' G& R2 F
  3. use casperlabs_types::ApiError;
      ~1 H2 S" Y& W# D  B: Q. B
  4. #[no_mangle]
    4 f& C+ j* L0 k. D' x
  5. pub extern "C" fn call() {
    4 e6 x7 R4 A6 q) z) c' `8 [' [7 ~
  6.   runtime::revert(ApiError::PermissionDenied)
    ) Z8 Q* X4 Q2 W; a+ C* d
  7. }
复制代码
! i' ^2 G% t7 F2 M: k
CasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()- J! L( [( p1 T
当合约以错误代码退出时,退出代码在“块浏览器”中可见。
# p5 D1 q) N' [- Z0 W参数' U. x3 I" g% o+ I4 }8 \
可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。
3 h3 G$ }  a& F( U5 M
  1. use casperlabs_contract::contract_api::runtime;
    3 Y" `  [0 @8 ~) T3 y; K! M5 K
  2. #[no_mangle]- s/ ^. P8 I6 v. d
  3. pub extern "C" fn call() {2 S8 _, _% q& r! }
  4.   let value: String = runtime::get_named_arg("value");
    5 z% E$ q  g$ B: ^) S/ [2 s% j3 o# o$ \
  5. }
复制代码
. |0 t0 E1 ?- b
存储6 h! q- k. b7 V/ ?! `+ l
在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:
; y% G; K3 h% M2 i) t) S
  1. const KEY: &str = "special_value";2 v4 B+ R7 \4 L
  2. fn store(value: String) {
    ) f0 S+ ^" J% a. V
  3.   // Store `value` under a new unforgeable reference.3 ?5 m* x# l9 N) h- J* b  @) D3 Z: a
  4.   let value_ref = storage::new_turef(value);! }/ @! |) N& Q* Z% J* |. j0 S% Q
  5.   // Wrap the unforgeable reference in a `Key`.
    ) o& Y# h- z. }* C3 [
  6.   let value_key: Key = value_ref.into();* S* R" F, @, N: k8 Q
  7.   // Store this key under the name "special_value" in context-local storage.
    & a- E! w% o1 D; N
  8.   runtime::put_key(KEY, value_key);
    & W' C/ x, a0 F, G# G/ U( m! C% i
  9. }
复制代码
. e8 S; M" s& m. C' c
, @( p! }) j6 D8 d) M/ a$ q5 B2 T
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12