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

news2024/9/20 12:41:00

这里写自定义目录标题

  • 使用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();
    	// 如果有任何错误,panic
    	output.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.coloradmin.cn/o/2148916.html

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

相关文章

Cloudera安装不再复杂:基础环境设置详解

Cloudera Manager是CDH市场领先的管理平台。它以其强大的数据管理和分析能力,帮助企业能够轻松驾驭海量数据,实现数据的实时分析与洞察。 作为业界第一的端到端 Apache Hadoop 的管理应用,Cloudera Manager对CDH的每个部件都提供了细粒度的可…

windows10 ipv4设置(多个)网段同时连接

注意另一个网段的测试设备必须插在你现在用的电脑上 如果没用那就换几个网口试试,换几个转接器试试,理论是可以的,如果不行那就是硬件坏了 二、如果还不行那就这样 注意:pcie是网线接在主机上,usb是转接器的网络 把你…

《ElementUI/Plus 踩坑》el-table + sortablejs 拖拽顺序错乱(Vue2/3适用)

如图所示: 把第一行拖到最后一行,鼠标up;该行莫名其妙的跳到倒数第二行; 最后发现没有设置 el-table 属性 row-key ,即行数据的 Key,用来优化 table 的渲染; 属性 row-key 描述如下&#xf…

Java发送Outlook邮件:从设置到发送攻略!

Java发送Outlook邮件详细步骤!如何使用Java发邮件? Java作为一种广泛使用的编程语言,提供了强大的功能来实现自动化邮件发送。AokSend将详细介绍如何使用Java发送Outlook邮件,从基本的设置到最终的发送过程。 Java发送Outlook邮…

一个实用的贴图工具Snipaste

Snipaste贴图工具操作指南 Snipaste 是一个简单但强大的贴图工具,同时也可以执行截屏、标注等功能。 一、安装与启动 下载Snipaste:访问 Snipaste 的官方网站下载合适的安装包。 安装:双击下载的安装包,按照提示完成安装过程。…

虎先锋,你也喜欢线程控制嘛

讲讲线程控制捏 线程创建 这是创建线程调用的接口&#xff1a; #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 这个接口上一篇文章已经介绍过了 线程等待 那么我们来看看…

什么是“云原生”

什么是“云原生” K8s已经成为一线大厂分布式平台的标配技术 CNCF&#xff0c;全称为Cloud Native Computing Foundation&#xff0c;中文译为“云原生计算基金会” CNCF是云原生领域影响力最大最有话语权的组织 云原生技术有利于各组织在公有云、私有云和混合云等新型动态…

Flask 实现用户登录功能的完整示例:前端与后端整合(附Demo)

目录 前言Demo 前言 对于python用户的登录&#xff0c;以下只是提供一个Demo用于学习 更多的python知识点可从我的专栏中进行学习 python专栏详细分析Flask中的蓝图Blueprint&#xff08;附Demo&#xff09;详细分析Flask部署云服务器&#xff08;图文介绍&#xff09;构建F…

HarmonyOS开发实战(5.0)实现二楼上划进入首页效果详解

鸿蒙HarmonyOS开发实战往期必看文章&#xff1a; HarmonyOS NEXT应用开发性能实践总结 一分钟了解”纯血版&#xff01;鸿蒙HarmonyOS Next应用开发&#xff01; 最新版&#xff01;“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门…

完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法,亲测有效!!!

完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01;…

算法-深度拷贝链表(138)

深度拷贝一个链表可以分以下几个步骤&#xff1a; 步骤 1&#xff1a;插入新节点 目标&#xff1a;在每个节点后面插入一个复制的节点。步骤&#xff1a; 遍历整个链表。对于每个节点 current&#xff0c;创建一个新节点 newNode&#xff0c;其值为 current.val。将 newNode …

深入探讨IDSIPS:信息安全的未来趋势与应用

引言 在信息技术飞速发展的今天&#xff0c;网络安全问题愈发突出。随着数据泄露、网络攻击等事件频发&#xff0c;企业和个人对信息安全的重视程度不断提高。IDSIPS&#xff08;Intrusion Detection System and Intrusion Prevention System&#xff09;作为信息安全领域的重…

在Spring项目中,两个实用的工具(生成类与映射文件、API自动生成)

尊贵的Spring玩家&#xff0c;是不允许动脑思考的&#xff0c;所以我们要学会复制粘贴 1.生成类与映射文件 背景&#xff1a;在项目编写初期&#xff0c;我们已经设计好了表&#xff0c;后面就需要根据表来撰写实体类(model)和对应的sql语句(dao和mapper)。如果一个项目中&…

【动态规划】两个数组的 dp 问题一

两个数组的 dp 问题 1.最长公共子序列2.不相交的线3.不同的子序列4.通配符匹配 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.最长公共子序…

深度学习水印网络架构学习笔记

目前学习到的一些网络架构&#xff0c;简单整理如下。 1、END框架【嵌入器-噪声层-提取器】 HiDDeN: Hiding Data With Deep Networks. ECCV, 2018.END框架&#xff0c;对噪声层的设计。用可导操作模拟JPEG压缩的过程。 2、噪声层图像增强【Noise Layer】 MBRS: Enhancing R…

设计模式之外观设计模式

一、外观设计模式概念 外观模式 (Facade) 是一种结构型设计模式&#xff0c; 为子系统中的一组接口提供一个一致的界面&#xff0c;此模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。 外观模式为复杂子系统提供了一个简单接口&#xff0c;并不为子系统…

[Python]案例驱动最佳入门:Python数据可视化在气候研究中的应用

在全球气候问题日益受到关注的今天&#xff0c;气温变化成为了科学家、政府、公众讨论的热门话题。然而&#xff0c;全球气温究竟是如何变化的&#xff1f;我们能通过数据洞察到哪些趋势&#xff1f;本文将通过真实模拟的气温数据&#xff0c;结合Python数据分析和可视化技术&a…

鸿蒙HarmonyOS开发:一次开发,多端部署(界面级)天气应用案例

文章目录 一、布局简介二、典型布局场景三、侧边栏 SideBarContainer1、子组件2、属性3、事件 四、案例 天气应用1、UX设计2、实现分析3、主页整体实现4、具体代码 五、运行效果 一、布局简介 布局可以分为自适应布局和响应式布局&#xff0c;二者的介绍如下表所示。 名称简介…

828华为云征文|华为云Flexus X实例docker部署最新Appsmith社区版,搭建自己的低代码平台

828华为云征文&#xff5c;华为云Flexus X实例docker部署最新Appsmith社区版&#xff0c;搭建自己的低代码平台 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Ng…

SQL优化-MySQL Explain中出现Select tables optimized away

文章目录 前言相关解释总结 前言 今天在做SQL优化的时候&#xff0c;在使用explain执行SQL时&#xff0c;出现了以下情况&#xff1a; EXPLAIN SELECT m1.id from station m1 INNER JOIN site s ON m1.codes.stationcode where receivetime(SELECT MAX(m2.receivetime) FROM…