Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

星火车品
2389 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。/ e1 m1 J' c# O: s8 }/ j1 Y
基本智能合约# f2 \9 ~" h! a2 a+ t" O! a
CasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。# d5 a" q% y9 H
#[no_mangle]
: v+ a3 }0 I+ F# opub extern "C" fn call() {}
" A/ G, s+ F$ c, V8 l2 k' |1 d3 J该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call
' t% x' Z2 u: b7 Z' U使用错误代码- Y2 _9 N* W0 W! o5 M0 Z
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:8 M1 |4 p  l9 n) B8 b
  2. use casperlabs_contract::contract_api::runtime;/ D! ~" H) L* }3 s2 r! x
  3. use casperlabs_types::ApiError;- p; U6 y  B- Y1 s) M: c; q( P% {, ~
  4. #[no_mangle]
    7 ^: ]1 k+ m1 X" g5 h
  5. pub extern "C" fn call() {
    $ H9 d4 K+ n+ J# k) I6 H% y3 j& w
  6.   runtime::revert(ApiError::PermissionDenied)
    5 M- [& W9 l$ j! h7 A* \
  7. }
复制代码
% M) U' y- Z( F% n
CasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()
2 y  h- v9 I+ ^* w当合约以错误代码退出时,退出代码在“块浏览器”中可见。
$ o! D/ u4 t6 C' ~5 f7 G% \) A5 L参数. }2 i5 l: n! g. F+ T
可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。8 K% W+ q. \( J
  1. use casperlabs_contract::contract_api::runtime;. E7 Y, c. ?6 p0 w8 w- y7 l
  2. #[no_mangle]! k9 |& O( }/ {0 n- \# K9 c! F
  3. pub extern "C" fn call() {
    7 \1 K& _4 A$ C  _7 O
  4.   let value: String = runtime::get_named_arg("value");$ T( {! c& J# Y" a5 J+ u) E
  5. }
复制代码
7 B# w# \- q2 v2 s
存储
; }. B8 E0 H) m; _" h在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:
2 \4 T# O- {- K  Q# M" y1 `
  1. const KEY: &str = "special_value";9 l9 W4 Q  C6 I+ m8 y3 N
  2. fn store(value: String) {
    4 \5 g% i. @( P
  3.   // Store `value` under a new unforgeable reference.
    7 {+ p9 L! @  O7 K; s9 \5 f
  4.   let value_ref = storage::new_turef(value);) i' x4 b; G- @  k; Y; g, K
  5.   // Wrap the unforgeable reference in a `Key`.+ [7 u2 O6 i6 f7 Y' p
  6.   let value_key: Key = value_ref.into();
    ( H( e- e# P9 [. K( u5 w
  7.   // Store this key under the name "special_value" in context-local storage.
    * Q  ?5 L/ J) J% R7 z8 A0 U- c
  8.   runtime::put_key(KEY, value_key);/ N4 a# y9 i1 _$ h2 ~1 h
  9. }
复制代码
7 g, ]3 y" |7 o& E, n) J. H2 }" V
# O9 f5 I  \5 [7 v: h
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12