Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

星火车品
2337 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。
, M* ]+ {" z6 S* E# ?# l基本智能合约
9 f6 G( Q. N; O: JCasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。+ S+ D; o2 j/ e4 \
#[no_mangle]
3 H% g1 y+ `6 E3 o( X- H* Rpub extern "C" fn call() {}
4 c1 D, T6 `9 T5 @& S/ O该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call
: v  \: @( I# Q- u  a9 _! a使用错误代码
0 J- F% {, m2 P: C1 ^$ O9 a) d
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:
    + d# }, [" Z& A
  2. use casperlabs_contract::contract_api::runtime;' g6 c2 i5 o" D
  3. use casperlabs_types::ApiError;( e4 p" j5 Q0 O" ~9 X4 c
  4. #[no_mangle]! c  i1 y1 q6 P" s. T: F5 l3 a% l; J
  5. pub extern "C" fn call() {
    0 P7 V4 T0 `. K6 p4 J3 ^4 t
  6.   runtime::revert(ApiError::PermissionDenied)
    9 O" p; H7 q" Y, h" C
  7. }
复制代码

* Z( I) Y( m6 Q3 ^CasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()
1 @8 ?6 u6 W( h1 ~: v1 X, O当合约以错误代码退出时,退出代码在“块浏览器”中可见。3 z* p# I. ^5 ^$ y# D, D
参数, t* o  p! }' T2 Z, S3 u' `0 w
可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。; C% t* p4 [. B; _
  1. use casperlabs_contract::contract_api::runtime;1 g% S2 z1 U- i2 z( l! ~
  2. #[no_mangle]
    , _' U7 Z7 [# ~$ \) f$ R9 z
  3. pub extern "C" fn call() {, @( m3 @% x4 L+ |
  4.   let value: String = runtime::get_named_arg("value");) @6 O/ b# N$ C; v. v$ D* ?- C4 E
  5. }
复制代码

, {2 _" L$ k' L$ v) P5 `- p9 B存储
% |! [7 s. p  n: f+ v- a( m在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:5 R2 H" W8 f( [/ O) ?5 i, R2 b, I
  1. const KEY: &str = "special_value";+ H6 P+ J8 ~1 E. d: f
  2. fn store(value: String) {
    6 Z  C3 H: e) L  K2 C
  3.   // Store `value` under a new unforgeable reference.# A* n: y5 f" V8 c
  4.   let value_ref = storage::new_turef(value);
    7 p8 Q6 ~1 U  l* K
  5.   // Wrap the unforgeable reference in a `Key`.* b" P6 Y( u- I' r5 v4 Q
  6.   let value_key: Key = value_ref.into();
    / \* \0 O2 d3 s
  7.   // Store this key under the name "special_value" in context-local storage.4 T$ P7 y: G: b0 t$ L1 F7 j/ `
  8.   runtime::put_key(KEY, value_key);  z! P8 G6 T0 [1 g5 N
  9. }
复制代码
) k  u+ m+ n2 B! H. m# x0 e

; r" [0 ^- i8 m. r( p/ ~* ^) o& @
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12