智能合约语言(eDSL)—— wasmtime实现合约引擎补充

news/2024/10/9 3:23:37/

1、链上下文

        由于我们是应用到区块链中,所以我们需要把链的环境传递给wasmtime,这样wasmtime在运行合约的时候,就可以获取到链上数据;我们运行合约当时的环境,打包成一个变量context,传递给wasmtime。context的结果如下:

rust">pub struct Context {pub(crate) func_name: String, //调用函数名称pub(crate) state: String,//合约状态pub(crate) param: String,//调用函数的参数pub(crate) invoker: Address, //调用者地址pub(crate) owner: Address,//合约拥有者地址pub(crate) self_address: Address,//合约地址pub(crate) event: Vec<String>,//合约产生的事件pub(crate) self_balance: u64,//合约余额pub(crate) output_data: String,//合约返回数据pub(crate) metadata: Metadata,//链数据,例如高度、时间等pub(crate) gas: bool, //是否启动gaspub(crate) gas_counter: u64,//gas计数pub(crate) gas_limit: u64,//gas限制pub(crate) gas_outof: bool,//gas是否超了}

        我们可以看到,都是当前交易和链的情况,例如调用函数,调用者地址,链高度,时间等这些都是当前链的情况,还有一部分数据其实正好相反,是合约产生的,要反馈给链或者用户,例如合约产生的事件,调用函数产生的返回值。

        那我们是在什么时候,传递给wasmtime呢?

rust"> let mut store = Store::new(&engine, context);

        就是在创建store,我们将我们context存入store中,存入的这些数据,我们后续还会继续用到

2、死循环

        如果有人编写了一个死循环的合约,然后不小心调用了,怎么办?

        我们在创建wasmtime的时候,可以创建一个监控线程,如果wasmtime执行时间超过了我们设定的时间,就会停止wasmitme,然后返回错误。

rust">let engine = Engine::new(Config::new().epoch_interruption(true))?;std::thread::spawn(move || {std::thread::sleep(std::time::Duration::from_secs(1));engine_clone.increment_epoch();});

        这里,我们将每次运行的时间设置为1s,超过这个时间,就会报错。

3、合约的存储格式

        如果合约编译完之后,直接存储使用,效率还是差一点;我们可以提前(AOT)编译WebAssembly模块。

rust">​
pub fn precompile_module(&self, bytes: &[u8]) -> Result<Vec<u8>>​

        存储之前,使用此方法会输出是一个编译过的模块。当我们再次使用的时候,需要调用如下函数解码,

rust">​
pub unsafe fn deserialize( engine: &Engine, bytes: impl AsRef<[u8]> ) -> Result<Module>​

        运行现在字节码,性能会极大的提高。

4、添加linker

        给wasmtime提供一系列的链环境接口,与之前合约部分,链接口是一一对应的,同样的模块鱼函数;例如获取,合约的拥有者,

 

rust">    linker.func_wrap("xq","get_owner",|mut caller: Caller<'_, Context>, ptr: i32| {charge_gas(&mut caller, GAS_ENV_FUNC_BASE);//let owner:&[u8] = caller.data_mut().owner.deref();let addr = caller.data_mut().owner; //let owner = &addr.0;let mem = match caller.get_export("memory") {Some(Extern::Memory(mem)) => mem,_ => anyhow::bail!("get_owner:failed to find memory"),};match mem.write(caller, ptr as usize, owner) {Ok(_) => (),Err(_) => anyhow::bail!("get_owner:MemoryAccessError"),};Ok(())},)?;

        我们可以看到闭包中参数,有一个Caller<'_, Context> context就是我们定义链上下文,这样用户在调用合约中的获取合约地址的接口,就会调用到wasmtime中linker中定义的get_owner,而get_owner中,又会从context中获取到context中的合约地址,返回将他作为返回值返回给用户,其实是写入内存中的,这样合约在运行的过程中,就可以获取到合约地址了。

其他接口也是类的,需要我们自己去完成。

https://github.com/XuHugo/xwasm/blob/main/wasm/src/vm.rs


http://www.ppmy.cn/news/1435123.html

相关文章

面向对象三大特征(python)

目录 1. 封装 为什么使用封装&#xff1f; 如何实现封装&#xff1f; 一个简单的封装示例 二.继承 为什么使用继承&#xff1f; 如何实现继承&#xff1f; 一个简单的继承示例 使用继承的好处 三.多态 为什么使用多态&#xff1f; 如何实现多态&#xff1f; 一个简…

STM32学习和实践笔记(20):定时器

1.定时器介绍 STM32F1的定时器一共有8个&#xff0c;由2个基本定时器&#xff08;TIM6、TIM7&#xff09;、4个通用定时器&#xff08;TIM2-TIM5&#xff09;和2个高级定时器&#xff08;TIM1、TIM8&#xff09;组成。 基本定时器的功能最为简单&#xff0c;类似于51单片机内定…

C#编程模式之原型模式

模式介绍&#xff1a;各位朋友&#xff0c;我们继续探讨C#的编程模式&#xff0c;本文介绍原型模式。原型模式的本质&#xff0c;其实就拷贝加创建一个新的实例。那可能就会由朋友问了&#xff0c;这么简单的原理&#xff0c;直接New一个新的实例&#xff0c;然后把原型类赋值给…

n-gram模型

N-gram是一种基于统计的语言模型&#xff0c;它基于一个假设&#xff0c;即一个词的出现仅与它前面的N-1个词有关&#xff0c;而与更远的词无关。 N-gram模型通常用于自然语言处理(NLP)任务&#xff0c;如文本生成、文本分类、机器翻译、拼写检查和语音识别等。在N-gram模型中…

NL2SQL技术方案系列(6):金融领域知识检索,NL2SQL技术方案以及行业案例实战讲解4

NL2SQL技术方案系列(6):金融领域NL2SQL技术方案以及行业案例实战讲解4 NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL] NL2SQL基础系列(2):主流大模型与微调方法精选集,Text2SQL经典算法技术回顾七…

PHP+MYSQL多条件选一通用搜索系统功能单文件7KB

通用功能: 快速填写参数用于自己的mysql数据表搜索,ajax载入数据 <?php header("content-Type: text/html; charsetUTF-8"); //error_reporting(0);$dbhost "localhost"; //数据库地址本地localhost $dbuser "chalidecom"; //数据库账号 …

yarn 会从npm config registry 下载依赖吗

Yarn 通常会使用自己配置的 registry 来下载依赖包&#xff0c;但如果在 Yarn 中没有专门配置 registry&#xff0c;它有时会默认继承 npm 的全局配置。当你执行 npm config set registry <registry-url> 设置了 npm 的 registry 后&#xff0c;若 Yarn 没有单独设置 reg…

就业班 第三阶段(负载均衡) 2401--4.19 day3

二、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 ​ keepalived工作原理keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundan…