使用Rust直接编译单个的Solidity合约

这里写自定义目录标题

  • 使用Rust直接编译单个的Solidity合约
    • 前言
    • 预备知识
    • 准备工作
    • 示例

使用Rust直接编译单个的Solidity合约

前言

我们知道,我们平常开发Solidity智能合约时一般使用Hardhat框架,但是如果你是一个Rustacean (这是由 “Rust” 和 “crustacean” -甲壳类动物 结合而来的俏皮称呼),也许你会使用Foundry框架进行开发。开发好了之后,我们要编写相关应用怎么办?通常的做法是将编译好的合约字节码和ABI复制到其它项目中去,然后使用各种框架来编写我们的Dapp。

但是这里有一个问题,如果合约只是简单的合约,或者是一个flatten之后的合约,如果有任何修改,你都必须在Hardhat或者Foundry中进行重新编译,然后重复复制到Dapp目录(偷懒的做法是使用一个sh 脚本自动去做这些事)。那么,作为一个Rustacean来讲,你肯定在想,能否在我的Dapp中使用Rust语言来直接编译这个合约呢?答案是肯定的。

这样做的目的是为我们节省不少工序,如果只是一个简单的没有外部依赖的合约,或者是一个Flatten后的合约,我们直接在Dapp目录进行开发和编译及使用其它库进行交互,不必重新建立hardhat或者foundry工程。

但是这是有前提的,我们直接使用Rust编译并不会自动查找它的外部依赖,因此这是我说的只能编译简单合约或者flatten合约的原因。

预备知识

Rust 语言本身无法编译Solidity或者Vyper智能合约,因此它还是得调用第三方编译工具进行。通常这个工具为solc。其原理就是Rust调用solc,再由solc来编译合约。
但是Rust调用solc这一步已经有第三方库抽象好了,我们不必手动去实现了。
在我们的示例中,我们使用 foundry-compilers这个crate来调用solc进行编译,它其实是Foundry内部工具的一部分。

准备工作

上面提到了,还是得第三方编译工具。因此我们得安装solc,具体方法为:

brew install solc-select
solc-select install 0.8.24
solc-select use 0.8.24

示例

  1. 运行cargo new sol_demo 来新建一个rust 工程

  2. 在项目根目录下建立contracts目录,这是hardhat框架常用的源文件目录。

  3. contracts目录下新建Counter.sol,内容如下:

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.24;
    contract Counter {uint256 public number;function setNumber(uint256 newNumber) public {number = newNumber;}function increment() public {number++;}
    }
    
  4. Cargo.toml中添加如下依赖

    [dependencies]
    foundry-compilers = "0.11.0"
    
  5. main.rs替换为如下内容:

    use foundry_compilers::{Project, ProjectPathsConfig};
    use std::path::Path;
    use std::env;
    fn main() {// 这个环境变量会识别为运行cargo的项目根目录let cargo_manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();// configure the project with all its paths, solc, cache etc.let project = Project::builder().paths(ProjectPathsConfig::hardhat(Path::new(&cargo_manifest_dir)).unwrap()).build(Default::default()) //Default::default()这里其实返回的是MultiCompilers,可以编译vyper和solidity.unwrap();// 这里也可以使用compile()函数编译contracts目录下的所有文件,有外部依赖的得提前导入let output = project.compile_file("contracts/Counter.sol").unwrap();// 如果有任何错误,panicoutput.succeeded();println!("Compilation succeeded.");// Tell Cargo that if a source file changes, to rerun this build script.// project.rerun_if_sources_changed();
    }
    
  6. 打开终端,在项目根目录下运行cargo run,得到Compilation succeeded.输出。

  7. 同时查看项目根目录,会发现多了artifactscache目录,如下图所示:
    在这里插入图片描述

真正使用时,你其实是另外起一个bin目录,在这里面做编译工作,而主main.rs一般做交互工作。

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

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

相关文章

2024年【中级消防设施操作员(考前冲刺)】及中级消防设施操作员(考前冲刺)模拟考试题库

题库来源:安全生产模拟考试一点通公众号小程序 中级消防设施操作员(考前冲刺)根据新中级消防设施操作员(考前冲刺)考试大纲要求,安全生产模拟考试一点通将中级消防设施操作员(考前冲刺&#xf…

设计模式之建造者模式(通俗易懂--代码辅助理解【Java版】)

文章目录 设计模式概述1、建造者模式2、建造者模式使用场景3、优点4、缺点5、主要角色6、代码示例:1)实现要求2)UML图3)实现步骤:1)创建一个表示食物条目和食物包装的接口2)创建实现Packing接口的实体类3&a…

golang 字符串浅析

go的字符串是只读的 测试源代码 package mainimport ("fmt""unsafe" )func swap(x, y string) (string, string) {return y, x }func print_string(obj *string, msg string) {string_ptr : (*[2]uintptr)(unsafe.Pointer(obj))first_obj_addr : string_…

MySQL系列—13.事务

1、事务 事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务控制语法 - 事务开始 begin; - 事务提交,提交后就会写入物理磁盘中去 commit; - 事务回滚,事务提交后,无法回滚 rollback;事务的四大特性&#xff0…

基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,通过DS18B20检测温度,滑动变阻器连接数模转换器模拟电流、电压,通过LCD1602显示,程序里设置温度阈值为40,电流阈值为60&am…

六西格玛咨询:石油机械制造企业的成本控制与优化专家

一、石油机械制造行业现状及主要困扰 随着全球能源需求的日益增长,石油开采和生产设备需求不断增加,石油机械制造行业在过去数十年里得到了迅猛发展。然而,石油机械制造作为一个高度复杂且技术密集的行业,也面临着多重挑战。首先…

【Vue】- 路由及传参

文章目录 知识回顾前言源码分析1. 声明式导航2. 路由传参3. 可选符4. 重定向5. 4046. 跳转及传参7. 路由懒加载拓展知识总结router-link静态传参和动态路由的对比知识回顾 前言 什么是单页面应用程序? ● 所有功能在一个html页面上实现 单页面应用优缺点? ● 优点:按需更新…

大模型时代的 AI 产品经理何去何从?

每天 LLM 相关的资讯都让人过载。作为 AI 产品经理,你是更兴奋呢,还是更担忧呢?整理了一下个人近期的思考,欢迎感兴趣的朋友一起交流。不管答案如何,相信我们都不应置身事外。 1 关于大模型‍‍ 大模型的各种原理讲…

OpenAI O1热度己过-如此快速的冷场带来的是人们更多对现今“AI”的思考

引入o1的瞬间辉煌 o1如耀眼的新星,闪耀于科技天空。发布时,因其思考能力而备受瞩目。它能在回答问题之前进行更多的思考,尤其擅长复杂推理。这种能力引发了众多用户的好奇与热情。诸如“9.8和9.11哪个大?”的简单问题被广泛地验证…

上海人工智能实验室开源视频生成模型Vchitect 2.0 可生成20秒高清视频

上海人工智能实验室日前推出的Vchitect2.0视频生成模型正在悄然改变视频创作的游戏规则。这款尖端AI工具不仅简化了视频制作流程,还为创作者提供了前所未有的灵活性和高质量输出。 Vchitect2.0的核心优势在于其强大的生成能力和高度的可定制性。用户只需输入文字描…

Java获取随机数

在Java中获取随机数通常会使用java.util.Random类或者Math.random()方法 1.java.util.Random java.util.Random类用于生成伪随机数。 // 使用无参构造方法创建Random对象Random rand new Random();// 生成一个[0, 100)范围内的随机整数int randomInt rand.nextInt(100);Sys…

算法练习题26——多项式输出(模拟)

输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数。 第二行有 n1 个整数,其中第 i 个整数表示第 n−i1 次项的系数,每两个整数之间用空格隔开。 输出格式 输出共 1 行,按题目所述格式输出多项式。…

【ARM】中断的处理

ARM的异常向量表 如果发生异常后并没有exception level切换,并且发生异常之 前使用的栈指针是SP_EL0,那么使用第一组异常向量表。如果发生异常后并没有exception level切换,并且发生异常之 前使用的栈指针是SP_EL1/2/3,那么使用第…

雷朋太阳镜和AEG的制胜法宝是:音乐节以及数据驱动的品牌推广

图片来源:Photo by Ethan Robertson on Unsplash 几十年来,我们见证了流行文化偶像对大众的影响。雷朋一直是一个深受偶像和大众喜爱的品牌。借助这股浪潮,雷朋与全球最大的娱乐公司之一AEG合作,吸引消费者,并以沉浸式…

JAVA-集合相关

HashMap如何解决哈希冲突的? 计算hash值,基于hashCode计算冲突之后,先是使用链式寻址法当链表长度大于8,且hash表的容量大于60的时候,再添加元素则转化成红黑树 为什么计算hash值是,是将hash地址的值右移1…

推荐10款最佳的电脑监控软件,知名电脑监控软件推荐

随着互联网和科技的飞速发展,电脑监控软件成为企业和个人用户管理和保护信息安全的必备工具。这些软件可以帮助你实时了解电脑的使用情况、保护隐私、优化工作效率,甚至防止潜在的安全威胁。在这篇文章中,我们将为你推荐10款最佳的电脑监控软…

k8s的搭建

一、安装环境 准备三台主机: 192.168.1.66 k8s-master 192.168.1.77 k8s-node01 192.168.1.88 k8s-node02 网段: Pod ⽹段 172.16.0.0/16 Service ⽹段 10.96.0.0/16 注:宿主机⽹段、Pod…

乱弹篇(52)旁观者说

众所周知,地球人都晓得“股市是经济的晴雨表”这个定律,那么中秋节后的中国内地股市,为何在节后的9月18日首个交易日,上证指数仍继续下行,盘中还一度跌破2700点创7个多月以来新低,整体市场数千个股下跌呢&a…

c#进度条实现方法

在使用c#做WinFrom开发时,经常会用到进度条(ProgressBar)。那么如何才能实现winfrom进度条及进度信息提示呢? 方法一:多线程 使用c#做WinFrom开发,要实现进度条效果就需要用到多线程,如果不采…

CH1-2 误差分析

一、误差的概念 用计算机进行实际问题的数值计算时,往往求得的是问题的近似解,都存在误差。 模型误差:在建立数学模型过程中,要将复杂的现象抽象归结为数学模型,往往要忽略一些次要因素的影响,而对问题作一些简化&am…