Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

星火车品
2395 0 0
今天一步一步带着大家逐步说明如何在CasperLabs编写新的智能合约。0 V" n3 k0 C. O
基本智能合约
6 Z/ t8 b9 V" c' F9 K* l3 GCasperLabs VM通过调用合约中call指定的功能来执行智能合约。如果缺少该功能,则智能合约无效。最简单的例子是一个空call函数。
. y1 X$ M$ q! r+ ?& V5 b) s#[no_mangle]
0 Q5 \/ ?3 V$ Z' V5 s7 e' c8 k5 Ypub extern "C" fn call() {}
/ d- _( K! [7 h* f% T; ~/ ~; V* n该#[no_mangle]属性可防止编译器在转换为Wasm的二进制格式时更改(更改)函数名称。没有它,VM退出并显示错误消息:。Module doesn't have export call
* b- X2 O$ g/ d使用错误代码
$ D# P7 y; g+ k3 K/ ~7 @7 w0 ]5 u: `
  1. CasperLabs VM支持智能合约中的错误代码。合约可以通过以下runtime::revert函数停止执行并以给定的错误退出:% {5 H; K& o" u! U+ `4 i8 A
  2. use casperlabs_contract::contract_api::runtime;+ C3 i% v) u- {2 q6 ~
  3. use casperlabs_types::ApiError;
    5 J, w! H( L( b1 j8 a) H, }! e
  4. #[no_mangle]
    ' H; A. G4 I, o. ?) x; O4 i$ ^" }
  5. pub extern "C" fn call() {, }/ N- A, x6 ?1 ~' s- J
  6.   runtime::revert(ApiError::PermissionDenied)
    ) V# h$ }! N' R& {: A" R
  7. }
复制代码

: G/ V6 s# i8 |  Y4 ?CasperLabs具有几个内置的错误变体,但是可以为您的智能合约创建一组自定义的错误代码。这些可以传递给runtime::revert通过。ApiError::User()( g5 S4 A: O2 j  M4 m7 Z7 R/ f
当合约以错误代码退出时,退出代码在“块浏览器”中可见。
: S) c2 v9 |1 D; l& e参数
/ s: O& f7 R* p1 \6 I7 n/ L可以将参数传递给智能合约。要使用此功能,请使用runtime::get_named_arg。* u$ U$ ]) D# ^
  1. use casperlabs_contract::contract_api::runtime;# I" U  K: b$ X
  2. #[no_mangle]
    : b$ K, Y! K7 X" {. ~- z
  3. pub extern "C" fn call() {
    : T. ?6 w8 f" p  v) B5 }
  4.   let value: String = runtime::get_named_arg("value");+ p( Z- }6 \; w0 \. J; U  s! [
  5. }
复制代码
$ I* A) Q; o  ]3 N% C
存储" y% ]# Z" N* h& a3 |- f) h  `  x  \
在CasperLabs中,手动在区块链中读取和存储值是一个手动过程。它需要编写更多代码,但也提供了很大的灵活性。存储系统的工作方式类似于操作系统中的文件系统。假设我们有一个需要保存的字符串。为此,请使用文本编辑器,创建一个新文件,将字符串粘贴并保存在某个目录中的名称下。该模式在CasperLabs区块链上相似。首先,您必须使用将值保存到内存中。这将返回对保存该值的内存对象的引用。您可以使用此引用将值更新为其他值。就像一个文件。其次,您必须使用以下命令将引用保存在人类可读的字符串下"Hello CasperLabs"storage::new_turef"Hello CasperLabs"runtime::put_key。就像给文件起一个名字。以下功能实现了此方案:6 @' F9 [' v* X5 K- c, C7 I
  1. const KEY: &str = "special_value";* K9 {) @# @3 g1 `
  2. fn store(value: String) {
    . s7 w/ s; [( K8 z8 v
  3.   // Store `value` under a new unforgeable reference.& k" V  c8 ?6 W( f
  4.   let value_ref = storage::new_turef(value);
    + ~0 K' L/ K1 A, u$ ^2 K
  5.   // Wrap the unforgeable reference in a `Key`.: z. }- E/ ?, A% {( n6 ?# q
  6.   let value_key: Key = value_ref.into();0 O  F0 v6 X5 O! o7 k8 d: e9 o. M
  7.   // Store this key under the name "special_value" in context-local storage.$ D! P9 L9 A0 D# L, ^6 m0 N
  8.   runtime::put_key(KEY, value_key);' B; u/ D$ B8 o
  9. }
复制代码
4 A9 w( @! a8 G1 u+ k+ d2 F" m! A2 A

1 N: U6 C# z* A) J( K6 ?
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

星火车品 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12