Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

星火车品
2391 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。
! l5 w, w/ B  V基本智能合约: I7 ?: s  l1 P+ a# X8 y( p  _
CasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。9 a! k: K, A" j/ e- I
#[no_mangle]7 j! j) n0 p  V2 p, R
pub extern "C" fn call() {}
' u# Y$ s% C) P/ b: ^该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call
, Z- n+ [8 J) j: j! p使用错误代码
8 Q) }( h" T8 e
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:8 |) c+ T1 U7 W- p8 [# ^6 l
  2. use casperlabs_contract::contract_api::runtime;
    : E" d4 C- M; y: }2 @$ E
  3. use casperlabs_types::ApiError;
    6 w4 k& w. Y* L0 L0 a: s
  4. #[no_mangle]
    / o6 R  [! u2 f) F, ]3 r
  5. pub extern "C" fn call() {
    + K0 n7 Z1 h6 T" ]
  6.   runtime::revert(ApiError::PermissionDenied)$ e8 E- z  M1 I, U" r& W
  7. }
复制代码

( `/ F( g; ]( ~' a* \CasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()4 V7 G5 |* p- ~
当合约以错误代码退出时,退出代码在“块浏览器”中可见。
; T9 w3 H, J1 N, Y2 y7 r参数( y; t% ^! K. p% N! Z  Z0 v
可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。' w1 Z3 Z2 A/ F- C+ ~
  1. use casperlabs_contract::contract_api::runtime;. m/ R. z! H: v
  2. #[no_mangle]
    9 m7 s, f% I* z' M  d
  3. pub extern "C" fn call() {
    % p1 k  M% c& V1 }' z% S3 T9 J
  4.   let value: String = runtime::get_named_arg("value");
    $ `  l# T3 n" m, O
  5. }
复制代码
1 Q+ Y3 e% q# U  U
存储
( U% y) ~& ], s3 d; k% r( M在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:* r3 d+ ^0 f8 G" ]5 _
  1. const KEY: &str = "special_value";
    4 q* o7 @) i$ p0 `; w
  2. fn store(value: String) {" q* M0 @3 J. s) |4 }
  3.   // Store `value` under a new unforgeable reference.! I/ Q. g! ?! @1 f, F
  4.   let value_ref = storage::new_turef(value);& p' @4 I* _. p2 q9 p1 A4 S. Q
  5.   // Wrap the unforgeable reference in a `Key`.
    % A, a  e; x% J: u
  6.   let value_key: Key = value_ref.into();
    ( O/ k+ M9 h( l0 k7 k) U
  7.   // Store this key under the name "special_value" in context-local storage.' x# G: Y6 y( w1 `
  8.   runtime::put_key(KEY, value_key);5 d3 _2 g' m* X: J/ j
  9. }
复制代码
; Z! o% M+ x% y4 D1 a; E4 [
; M3 q- x/ o$ {8 s& R
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12