Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

星火车品
2341 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。: w% r0 s5 o: t, U# R- u
基本智能合约
, d2 x% E0 S* O5 b, r. lCasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。
4 d0 |7 Z, z+ Y' K4 T* D1 Z#[no_mangle]5 ^, o/ g& ?1 i2 Q* _
pub extern "C" fn call() {}5 F2 z+ U3 ]5 Z- @5 l5 Q: @+ ~
该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call
7 @% X) \$ l/ I. y使用错误代码- i1 n. z$ M' R1 L% ]% `% C
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:
    2 J% {0 R! a( R/ q
  2. use casperlabs_contract::contract_api::runtime;
    + m& |# l. P3 e
  3. use casperlabs_types::ApiError;
    4 r1 c# G- U" r; t+ c8 X1 Y
  4. #[no_mangle]$ Q3 e' A- p& y
  5. pub extern "C" fn call() {
    * y2 _; [/ R7 [
  6.   runtime::revert(ApiError::PermissionDenied)
    * C8 r2 K% R2 ]1 n2 r& x) s
  7. }
复制代码
1 Q: t- ^$ }" p2 p7 D6 n
CasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()
6 v' ^  Y; R, v8 s. V当合约以错误代码退出时,退出代码在“块浏览器”中可见。! F; O- e. V+ y$ a
参数4 u% W0 W" l# S- o: Z6 i
可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。) R( s: i; S/ v" ]& l9 v) g
  1. use casperlabs_contract::contract_api::runtime;  Q0 U1 U' q2 Y4 u% w+ H& W
  2. #[no_mangle]3 l" P! m) m4 W+ H6 Q
  3. pub extern "C" fn call() {1 K0 Z9 W, b/ o* l4 L& e
  4.   let value: String = runtime::get_named_arg("value");: e0 ?" F0 S3 J( b
  5. }
复制代码

8 S! m, _/ ^+ x4 I存储: ~% V" g& k$ S2 z$ O- k
在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:
0 c/ i8 u' h" {
  1. const KEY: &str = "special_value";% Y2 W$ f- ^( ~: E
  2. fn store(value: String) {# q6 K& u' K% t5 Y# w
  3.   // Store `value` under a new unforgeable reference.
    0 L* o2 ~: R, Q1 l! c3 D6 F
  4.   let value_ref = storage::new_turef(value);- }" ^7 ?# x3 D8 L( ]
  5.   // Wrap the unforgeable reference in a `Key`.: e5 ]+ o, h5 Y" ~; m: a* g
  6.   let value_key: Key = value_ref.into();
    7 K( S7 x  |2 S9 U
  7.   // Store this key under the name "special_value" in context-local storage.
    2 j6 z0 d2 s. T7 H6 v
  8.   runtime::put_key(KEY, value_key);, i2 H  t- Y8 E8 L! D* m5 ~, _
  9. }
复制代码

7 O6 A  ?% s  I% u
5 o6 e! m7 {. Q% B( |9 }
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12