智能合约语言(eDSL)—— 如何使用wasmtime运行合约

     在我们使用高级语言生成了智能合约——WASM之后,接下来就是对智能合约——WASM的使用。首先,我们需要引入wasmtime库,使用wasmtime运行我们的合约。我们的Rust程序为:

use anyhow::Result;
use std::fs;
use wasmtime::*;fn main() -> Result<()> {let wasm_bytes = fs::read("./adder.wasm")?;let engine = Engine::default();let mut store = Store::new(&engine, ());let module = Module::new(&engine, wasm_bytes)?;let instance = Instance::new(&mut store, &module, &[])?;let add = instance.get_typed_func::<(u32, u32), u32>(&mut store, "add")?;let sum = add.call(&mut store, (1, 2))?;println!("Sum is {sum}");Ok(())
}
读取合约

首先,我们通过Rust标准库,将WASM程序的字节码读入了内存wasm_bytes中,此时wasm_bytes的类型是Vec<u8>。这是因为我们后续在使用Module::new解析WASM时,会要求参数满足AsRef<[u8]>,因此我们一般都是直接读入内存即可。

store

随后,我们创建了一个默认的Store类型变量。Store实际上是一个通用的wasm的概念,但是放在Rust的代码里讲,就直观很多。我们知道,Rust是一个非常强调所有权和生命周期的编程语言。在一个WASM程序运行的过程中,会有很多全局的状态。例如,WASM程序中的函数本身,其生命周期理应是全局的。用来托管这些全局状态的,就称为Store。

模块

一个WASM程序就是一个module。可以看到,这个变量创建的过程中,需要store作为参数。这是因为需要引擎提供加持,所以要从store中提取目前的引擎。创建Module类型的变量,就完成了之前提到的WASM语义阶段中的「解码」和「验证」两个阶段(wasm规范中提及)。所以module中是编译后的wasm模块。这些结构包含来自wasm二进制文件的编译后的可执行代码,这些代码在实例化后准备执行。

instance

当我们创建Instance类型的变量时,就是真正执行WASM程序的过程。创建这个变量,就会初始化WASM程序,形成一个WASM实例。也就是说,我们WASM程序从现在开始正式进入执行阶段。

调用函数(相当于用户调用合约)

接下来,我们使用了get_typed_function来获得我们在WASM程序中导出的"add"函数,然后使用call来调用这个函数。我们知道,Rust是强类型的语言,所以需要提供这个函数的类型信息。TypedFunction<(u32, u32), u32>就提示编译器,这个add函数接收两个u32类型的参数,返回一个u32类型的值。

这只是一个demo实例,简单的介绍了一下如何使用wasmtime。具体实现可以看下这里。

xwasm/wasm/src/vm.rs at main · XuHugo/xwasm · GitHub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/2464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android openGL ES详解

1、渲染线程与主线程的通信 两个线程之间的通信可以用如下方法: 在主线程中的 GLSurfaceView 实例可以调用 queueEvent( &#xff09;方法传递一个 Runnable 给后台渲染线程&#xff0c;渲染线程可以调用 Activity 的 runOnUIThread()来传递事件 (event) 给主线程。 2、顶点…

Redhawk:ATE如何产生top level sta file

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 相关文章链接 redhawk: create STA file 在“redhawk: create STA file”一文中介绍了ate的用法,可以应对block level的设计,但当需要做top level分析时&

构建安全高效的前端权限控制系统

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…

Qt实现XYModem协议(八)

1 概述 XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据&#xff0c;并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K&am…

单片机学习过程

继电器光耦隔离电压转换步进电机直流电机 arduino是最好用的一种&#xff0c;他提供了完整的设备库文件&#xff0c;任何外部设备只要查找相应的库&#xff0c;就可以很方便的使用 &#xff0c; 但是如果不去学习51 或stm32 或 嵌入式玩玩还可以&#xff0c;如果碰到没有实现的…

【深耕 Python】Data Science with Python 数据科学(10)pandas 数据处理(一)

写在前面 关于数据科学环境的建立&#xff0c;可以参考我的博客&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;1&#xff09;环境搭建 往期数据科学博文&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;2&#xf…

使用 IPAM 解决方案简化分布式网络管理

随着组织在数字领域的全球扩张&#xff0c;分布式网络是不可避免的&#xff0c;这意味着&#xff0c;随着 IT 基础设施的发展&#xff0c;组织需要适应&#xff0c;这包括在不断增长的系统需求、应用程序堆栈、各种协议和安全防御中监控、现代化和简化流程和资源。在有效管理现…

常用的正则表达式组成

正则表达式是一种强大的文本处理工具&#xff0c;用于匹配、搜索、替换、分割等多种操作。以下是正则表达式的基本组成和语法&#xff0c;以及如何使用它们来构建复杂的模式。 正则表达式语法 1. 基本字符匹配 - 普通字符: 大多数字符&#xff0c;如a-z、A-Z、0-9&#xff0c…

盲人过马路安全:科技力量赋予“隐形守护者”

作为一名资深记者&#xff0c;我始终关注着社会各群体的生活现状&#xff0c;尤其是那些面临特殊挑战的人群。今天&#xff0c;我想聚焦一个看似平常却对盲人构成重大困扰的日常场景——过马路&#xff0c;以及一款名为蝙蝠避障的辅助应用如何成为他们的盲人过马路安全的守护者…

自制Apache-Doris 2.0.4镜像Docker部署一Fe和一Be集群及遇到的问题解决

自制Apache-Doris 2.0.4镜像Docker部署一Fe和一Be集群及遇到的问题解决 文章目录 1.前言2.doris是什么&#xff1f;2.1简介2.2介绍2.3使用场景2.4架构 3.官网4.构建部署4.1 构建环境4.2 doris2.0.4的fe和be镜像构建4.2.1 fe2.0.4镜像构建脚本4.2.2 be2.0.4镜像构建4.2.3 启动脚…

OSINT技术情报精选·2024年4月第3周

OSINT技术情报精选2024年4月第3周 2024.4.22版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、斯坦福大学&#xff1a;《2024年人工智能指数报告》 最近&#xff0c;由李飞飞联合领导的斯坦福大学以人为本人工智能研究所&#xff08;St…

FebHost:科技企业如何规划并注册.AI域名?

为确保企业使用.AI域名的方式准确反映其对人工智能技术的关注&#xff0c;企业应考虑以下步骤&#xff1a; 了解法律和合规要求&#xff1a; 第一步是了解与 .AI 域名相关的独特法律和合规要求。由于.AI域名源于安圭拉&#xff0c;企业必须遵守安圭拉的限制和法律规定。这包括…

K8S Centos7 安装 K8S 1.26单机版

文章目录 1.机器规划1.设置hostname2.编辑/etc/hosts3.安装ntpdate并同步时间4.关闭防火墙5.关闭selinux 2.安装 Docker1.安装Docker2.安装容器运行时cri-dockerd 3.安装K8S1.禁用swap2.安装Kubernetes相关软件3.所有master节点拉取k8s镜像4.初始化Kubernetes Master节点5.安装…

MySQL-用户管理

MySQL 用户分为 普通用户 和 root用户。root用户即超级管理员&#xff0c;拥有所有权限&#xff0c;包含创建&#xff0c;删除和修改用户等相关权限&#xff1b;普通用户只拥有被root用户授予的各种权限MySQL的安全性需要通过账户管理来实现 1、登录MySQL服务器 命令如下&…

Nginx七层负载均衡

1、七层负载均衡介绍 Nginx七层负载均衡是在应用层&#xff08;HTTP/HTTPS&#xff09;上进行的&#xff0c;可以根据HTTP请求的具体内容&#xff0c;如URL、Cookie、Header等&#xff0c;来决定将请求转发到哪个后端服务器。这种方式不仅能够均衡服务器的计算负载&#xff0c…

基于微信小程序的土地租赁的设计与实现

基于微信小程序的土地租赁的设计与实现 Design and Implementation of Land Leasing Based on WeChat Mini Program 完整下载链接:基于微信小程序的土地租赁的设计与实现 文章目录 基于微信小程序的土地租赁的设计与实现摘要第一章 绪论1.1 研究背景1.2 研究目的1.3 研究内容…

C语言 字符类型

下面 我们来说字符类型 我们来看这个 保险单 金额 和 总额 都可以用数字类型 而性别则需要字符型 字符数据的存储 – ASCI码 字符类型 char 就是专为存储字符(如字母&#xff0c;标点和数字)而设计的类型。 使用单引号包含单个字符或转义字符去表示一个 char 类型的常量。 …

Lua调用函数的方式汇总

在Lua脚本语言中&#xff0c;调用函数是一种基本的操作&#xff0c;它允许代码执行在函数定义中封装的操作。Lua 提供了几种灵活的方式来调用函数&#xff0c;以适应不同的场景和需求。以下是Lua中调用函数的几种常见方式&#xff1a; 1. 基本函数调用 最简单的调用方式是使用…

李沐56_门控循环单元——自学笔记

关注每一个序列 1.不是每个观察值都是同等重要 2.想只记住的观察需要&#xff1a;能关注的机制&#xff08;更新门 update gate&#xff09;、能遗忘的机制&#xff08;重置门 reset gate&#xff09; !pip install --upgrade d2l0.17.5 #d2l需要更新import torch from tor…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别 一、简单介绍 二、简单进行车牌检测和识别实现原理 …