从零开始智能合约引擎
文章平均质量分 74
从零开始,写一个智能合约引擎,包括一门智能合约语言eDSL和一个虚拟机wasm,最后进行并行化升级;
0xweb3q
rust、blockchain、smarcontract、evm、move、wasmtime
展开
-
智能合约语言(eDSL)—— 并行化方案——调度算法
就是验证一个已经执行完交易的读写集,因为我们并发的而执行多个交易的时候,会导致id靠后的交易先于id考前的交易执行完,这样id靠后的交易,依赖的数据,可能会出现问题;这个时候,我们就需要验证tx7,因为存在这样的情况,tx7读了key1的值,虽然tx5写了key1的值,但是tx5执行的慢,导致tx7读取key1的时候,tx5还没有写入,如果按照我们之前的标准,并行执行完整个块与串行执行的结果要一致,那么这种情况下,tx7就需要重新执行,这就是验证任务的意义所在。就是一个交易的正常执行;原创 2024-07-18 10:21:28 · 1141 阅读 · 0 评论 -
智能合约语言(eDSL)—— 并行化方案——缓存&VM
这个并行算法最初其实是在aptos上实现的,aptos上使用的是move虚拟机,后来我把它移植到我们链上了,但是wasm虚拟机。还是费了不少事情。目前evm并行也比较火,像monad,sei等。经过调研发现,其实evm的并行,还是occ的路子,和aptos的方案也差不多,都是在这之上进行各种优化,比较链结果和vm都不一样。原创 2024-05-24 16:56:59 · 482 阅读 · 0 评论 -
智能合约语言(eDSL)—— 并行化方案
Block-STM:一个智能合约并行执行引擎,围绕着软件事务性内存的原则建立的(Software Transactional Memory)。Transaction组成block,每个block在不同的节点执行后都需要具有相同的结果。Block-STM的输入是一个区块(Block),其中包含n个预设了顺序的交易,tx1,tx2…,txn,然后并发执行区块并产生最终状态,但是最终状态与,按顺序执行tx1,tx2,…,txn——每个txj在txj+1开始前执行完成的状态——的状态保持一致。原创 2024-05-16 16:27:56 · 808 阅读 · 0 评论 -
智能合约语言(eDSL)—— 并行化概述
到目前为止,一个简单的合约语言与合约虚拟机已经完成了;接下来,我们让我们的整个系统可以并行化;原创 2024-04-25 14:07:27 · 726 阅读 · 0 评论 -
智能合约语言(eDSL)—— 测试
init_xq这个函数可以看一下合约里,虽然没有这个名字的函数,但是却可以正常调用,这是因为我们用宏修改了名字,让每个合约的初始化函数,都统一为init_xxx.大部分参数没有什么特别的,这里需要注意的是,合约的参数,是json格式,需要提前转换好;如何写合约,与编译之前的文章已经写过了,准备好.wasm文件。预编译需要借助wasmtime,生成一个engine的实例。参数依次是,函数名,上下文,合约字节码,token;2.3准备链的上下文。原创 2024-04-24 14:49:00 · 777 阅读 · 1 评论 -
智能合约语言(eDSL)—— wasmtime实现合约引擎补充
就是我们定义链上下文,这样用户在调用合约中的获取合约地址的接口,就会调用到wasmtime中linker中定义的get_owner,而get_owner中,又会从context中获取到context中的合约地址,返回将他作为返回值返回给用户,其实是写入内存中的,这样合约在运行的过程中,就可以获取到合约地址了。我们在创建wasmtime的时候,可以创建一个监控线程,如果wasmtime执行时间超过了我们设定的时间,就会停止wasmitme,然后返回错误。当我们再次使用的时候,需要调用如下函数解码,原创 2024-04-24 10:30:01 · 870 阅读 · 1 评论 -
智能合约语言(eDSL)—— 如何使用wasmtime运行合约
在我们使用高级语言生成了智能合约——WASM之后,接下来就是对智能合约——WASM的使用。首先,我们需要引入wasmtime库,使用wasmtime运行我们的合约。原创 2024-04-23 15:13:15 · 963 阅读 · 0 评论 -
智能合约语言(eDSL)—— 使用rust实现eDSL的原理
宏在 Rust 语言中是一种功能,能够在编译实际代码之前按照自定义的规则展开原始代码,从而能够达到修改原始代码的目的。通过 Rust 语言的宏系统,不仅能够实现 C语言的宏系统所提供的模式替换功能,甚至还能够控制编译器的行为、设计自己的语法从而实现 eDSL,所以我们正是基于 Rust 语言的宏系统实现的 eDSL。在编译器的广义定义中,编译器是一种能够将以某种编程语言(原始语言)书写的源代码转换成另一种编程语言(目标语言)的计算机程序,因此我们的eDSL在一定程度上扮演了编译器的角色。原创 2024-03-19 14:40:53 · 1815 阅读 · 1 评论 -
智能合约语言(eDSL)—— 实现合约语言中调用链上数据
写合约的时候,我们需要获取链上的数据,但是在你编译合约的时候,合约没有这个能力,所以,我们把它做成一个接口,等到真正在链上执行的时候,wasm就可以帮你把它链接到对应的数据上,wasm的这部分,我们下次介绍wasm虚拟机部分的时候,在介绍。wasm_import_module则是定义wasm的input模块的名字,后边有机会,可以用rust实现版wasm,详细说一下,wasm的构造;实际上他是由contractcontex实现的,它的定义是空,因为我们需要的数据,都在链上,所以这里定义一个空的;原创 2024-03-13 10:20:55 · 625 阅读 · 0 评论 -
智能合约语言(eDSL)—— proc_macro实现合约init函数
我们通过属性宏来实现合约的init函数,call函数其实和init是类似的;构建属性宏,要在cargo.toml里面设置一些参数,这是必须的。一般来说,过程宏必须是一个库,或者作为工程的子库,不能单独作为一个源文件存在。,这个是用来解析语法树(AST)的。各种语法构成,解析语法树,生成rust代码,从而实现你想要的新功能。和。原创 2024-03-08 17:16:45 · 878 阅读 · 0 评论 -
智能合约语言(eDSL)—— 合约函数形式
在智能合约中,一般是需要两类函数。初始化函数——init,调用合约——receive;初始化函数主要作用是为了初始化当前合约的状态,一般在创建合约的时候执行一次;调用函数是在合约初始化之后,用户用来获取或者更新合约的函数;对于获取状态的函数,其实有两种方式,原创 2022-03-03 14:51:38 · 1210 阅读 · 0 评论 -
智能合约语言(eDSL)—— 合约表现形式
我们写智能合约的时候,会发现,合约其实是有一个比较明显的范围限定的。例如solidity中,就有类似于面向对象中的类,将一个合约的属性与方法,都设定在一个合约类当中;而在fabric中链码,更接近我们普通的程序,合约分布在几个文件中,用户将其打包成一个智能合约。所以我们在设计智能合约语言的时候,第一步考虑的就是我们的合约是一个怎么样的形式。 简单一点,一组变量和一组方法,基本可以满足合约的要求了。然后就是我们以什么样子的形式把其组织起来呢?先说一下我们的目标,我们希望这组变...原创 2021-12-15 19:45:50 · 12962 阅读 · 1 评论 -
智能合约引擎
这个专题主要聊聊智能合约相关的最近一直在用rust写区块链底层,又是写合约引擎,现在基本完成了,包括wasm虚拟机和基于rust的eDSL。所以就想着借着这个机会,把一些想法记录一下。首先区块链发展到现在,大部分功能都需要智能合约来完成,不过五花八门的语言,确实增加了老铁们的负担,虽然各位老铁基本都可以左手拿教程,右手拿键盘,直接开整。不过因为合约漏洞,而导致各种新闻也让手握Token的信仰者胆战心惊了。虽然问题多多,当时我依然认为,智能合约和虚拟机,必须是未来的重点,因为它将支撑了整个生态系统原创 2021-12-09 18:17:38 · 1069 阅读 · 0 评论