Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

星火车品
2343 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。
0 V; I; x  \* i, g基本智能合约& y) w$ P) o# k7 N/ O1 y/ z1 y
CasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。) x' W" M! j. T$ w2 [2 Z( |, ^  h
#[no_mangle]
& h: ^. x! q9 C0 `3 e9 Xpub extern "C" fn call() {}
1 F; w0 y9 T9 s该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call
; o  j8 ?5 d) J9 B9 _' h, A使用错误代码
5 s/ X+ ~# `* ]
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:
    5 W1 E" R: x' C3 N+ F" I" c
  2. use casperlabs_contract::contract_api::runtime;( u, b8 P" ?. l* n
  3. use casperlabs_types::ApiError;: Y% ~. O  k  m, x4 U
  4. #[no_mangle]
    7 R7 @7 \: _4 z( c4 |0 g
  5. pub extern "C" fn call() {. j; p3 L' _6 d" T2 X+ w: U! X
  6.   runtime::revert(ApiError::PermissionDenied)" N- N3 j1 O. P1 v1 Z8 A
  7. }
复制代码
( o$ M- d7 K) `/ C. z# c
CasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()
: f7 d7 m3 H/ E当合约以错误代码退出时,退出代码在“块浏览器”中可见。
4 t( ]8 V; G" e) E( q+ J5 x" k/ w$ h参数5 m4 C, {- y- o- H
可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。! S6 }& x- S' u! w6 X, `/ R
  1. use casperlabs_contract::contract_api::runtime;1 H. t$ `) A* ~  [
  2. #[no_mangle]( |: l) g( p4 @0 u" h* B
  3. pub extern "C" fn call() {( B( x8 g+ k* Y1 [, V" o% `& [
  4.   let value: String = runtime::get_named_arg("value");
    1 h( [' M7 \, v8 w9 @, p! I% H
  5. }
复制代码

8 |- Z" I2 z" E( e& \1 u' ^9 J* ~存储
: ^9 `; ^' A+ U8 h/ v% O在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:
  f- B9 D9 ~! q. q8 W
  1. const KEY: &str = "special_value";/ i3 ^" h" j4 t+ L/ e+ p/ E
  2. fn store(value: String) {& b7 k) A. x1 k9 Y/ g7 ?
  3.   // Store `value` under a new unforgeable reference.
    % O  o; R. N2 X3 r+ l
  4.   let value_ref = storage::new_turef(value);
    6 E4 j+ s# [, \& s# L: V
  5.   // Wrap the unforgeable reference in a `Key`.
    4 \8 L) C. n- O* A, K/ u" \
  6.   let value_key: Key = value_ref.into();9 `3 S: [# d8 A2 T/ k
  7.   // Store this key under the name "special_value" in context-local storage.1 l5 H4 I, z( g& V  W+ z- o
  8.   runtime::put_key(KEY, value_key);
    ( k% w$ O( V: a1 |
  9. }
复制代码
( V5 M( m0 [1 b/ n5 |, B! Q. [

. X4 S7 j2 P0 s6 w0 z( V
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12