最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用Rust直接編譯單個(gè)的Solidity合約

 更新時(shí)間:2024年09月20日 14:28:10   作者:AiMateZero  
本文介紹了如何使用Rust語言直接編譯Solidity智能合約,特別適用于沒有外部依賴或flatten后的合約,一般情況下,Solidity開發(fā)者使用Hardhat或Foundry框架,本文給大家介紹如何使用Rust直接編譯單個(gè)的Solidity合約,感興趣的朋友一起看看吧

使用Rust直接編譯單個(gè)的Solidity合約

前言

我們知道,我們平常開發(fā)Solidity智能合約時(shí)一般使用Hardhat框架,但是如果你是一個(gè)Rustacean (這是由 “Rust” 和 “crustacean” -甲殼類動(dòng)物 結(jié)合而來的俏皮稱呼),也許你會(huì)使用Foundry框架進(jìn)行開發(fā)。開發(fā)好了之后,我們要編寫相關(guān)應(yīng)用怎么辦?通常的做法是將編譯好的合約字節(jié)碼和ABI復(fù)制到其它項(xiàng)目中去,然后使用各種框架來編寫我們的Dapp。

但是這里有一個(gè)問題,如果合約只是簡(jiǎn)單的合約,或者是一個(gè)flatten之后的合約,如果有任何修改,你都必須在Hardhat或者Foundry中進(jìn)行重新編譯,然后重復(fù)復(fù)制到Dapp目錄(偷懶的做法是使用一個(gè)sh 腳本自動(dòng)去做這些事)。那么,作為一個(gè)Rustacean來講,你肯定在想,能否在我的Dapp中使用Rust語言來直接編譯這個(gè)合約呢?答案是肯定的。

這樣做的目的是為我們節(jié)省不少工序,如果只是一個(gè)簡(jiǎn)單的沒有外部依賴的合約,或者是一個(gè)Flatten后的合約,我們直接在Dapp目錄進(jìn)行開發(fā)和編譯及使用其它庫進(jìn)行交互,不必重新建立hardhat或者foundry工程。

但是這是有前提的,我們直接使用Rust編譯并不會(huì)自動(dòng)查找它的外部依賴,因此這是我說的只能編譯簡(jiǎn)單合約或者flatten合約的原因。

預(yù)備知識(shí)

Rust 語言本身無法編譯Solidity或者Vyper智能合約,因此它還是得調(diào)用第三方編譯工具進(jìn)行。通常這個(gè)工具為solc。其原理就是Rust調(diào)用solc,再由solc來編譯合約。
但是Rust調(diào)用solc這一步已經(jīng)有第三方庫抽象好了,我們不必手動(dòng)去實(shí)現(xiàn)了。
在我們的示例中,我們使用 foundry-compilers這個(gè)crate來調(diào)用solc進(jìn)行編譯,它其實(shí)是Foundry內(nèi)部工具的一部分。

準(zhǔn)備工作

上面提到了,還是得第三方編譯工具。因此我們得安裝solc,具體方法為:

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

示例

運(yùn)行cargo new sol_demo 來新建一個(gè)rust 工程

在項(xiàng)目根目錄下建立contracts目錄,這是hardhat框架常用的源文件目錄。

contracts目錄下新建Counter.sol,內(nèi)容如下:

// 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++;
	}
}

Cargo.toml中添加如下依賴

[dependencies]
foundry-compilers = "0.11.0"

main.rs替換為如下內(nèi)容:

use foundry_compilers::{Project, ProjectPathsConfig};
use std::path::Path;
use std::env;
fn main() {
	// 這個(gè)環(huán)境變量會(huì)識(shí)別為運(yùn)行cargo的項(xiàng)目根目錄
	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()這里其實(shí)返回的是MultiCompilers,可以編譯vyper和solidity
	    .unwrap();
	// 這里也可以使用compile()函數(shù)編譯contracts目錄下的所有文件,有外部依賴的得提前導(dǎo)入
	let output = project.compile_file("contracts/Counter.sol").unwrap();
	// 如果有任何錯(cuò)誤,panic
	output.succeeded();
	println!("Compilation succeeded.");
	// Tell Cargo that if a source file changes, to rerun this build script.
	// project.rerun_if_sources_changed();
}

打開終端,在項(xiàng)目根目錄下運(yùn)行cargo run,得到Compilation succeeded.輸出。

同時(shí)查看項(xiàng)目根目錄,會(huì)發(fā)現(xiàn)多了artifactscache目錄,如下圖所示:

真正使用時(shí),你其實(shí)是另外起一個(gè)bin目錄,在這里面做編譯工作,而主main.rs一般做交互工作。

到此這篇關(guān)于如何使用Rust直接編譯單個(gè)的Solidity合約的文章就介紹到這了,更多相關(guān)Rust Solidity合約內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust?Atomics?and?Locks?源碼解讀

    Rust?Atomics?and?Locks?源碼解讀

    這篇文章主要為大家介紹了Rust?Atomics?and?Locks?源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • rust延遲5秒鎖屏的實(shí)現(xiàn)代碼

    rust延遲5秒鎖屏的實(shí)現(xiàn)代碼

    這篇文章主要介紹了rust延遲5秒鎖屏的實(shí)現(xiàn)代碼,文中通過實(shí)例代碼也介紹了rust計(jì)算程序運(yùn)行時(shí)間的方法,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Rust搭建webserver的底層原理與應(yīng)用實(shí)戰(zhàn)技巧

    Rust搭建webserver的底層原理與應(yīng)用實(shí)戰(zhàn)技巧

    本文介紹Rust在HTTP編程中的應(yīng)用,涵蓋協(xié)議基礎(chǔ)、標(biāo)準(zhǔn)庫與第三方庫(如hyper、reqwest)的使用,以及多線程服務(wù)器和線程池的實(shí)現(xiàn)與關(guān)閉機(jī)制,展示Rust在性能、安全和并發(fā)方面的優(yōu)勢(shì),感興趣的朋友跟隨小編一起看看吧
    2025-06-06
  • Rust調(diào)用C程序的實(shí)現(xiàn)步驟

    Rust調(diào)用C程序的實(shí)現(xiàn)步驟

    本文主要介紹了Rust調(diào)用C程序的實(shí)現(xiàn)步驟,包括創(chuàng)建C函數(shù)、編譯C代碼、鏈接Rust和C代碼等步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 一文帶你掌握Rust中的字符串與切片

    一文帶你掌握Rust中的字符串與切片

    字符串與切片是所有新手遇到的第一個(gè)門檻,不同于?Java、Python?等語言對(duì)字符串的高度封裝,Rust?的字符串與切片深度綁定了所有權(quán)、借用、生命周期與?UTF-8?編碼,下面小編就和大家詳細(xì)介紹一下吧
    2026-03-03
  • Rust 中解析 JSON的方法

    Rust 中解析 JSON的方法

    要開始在 Rust 中使用 JSON,您需要安裝一個(gè)可以輕松操作 JSON 的庫,目前可用的流行crate之一是 serde-json,在本文中,我們將討論如何在 Rust 中使用 JSON 解析庫,以及比較最流行的庫及其性能
    2024-03-03
  • rust中間件actix_web在項(xiàng)目中的使用實(shí)戰(zhàn)

    rust中間件actix_web在項(xiàng)目中的使用實(shí)戰(zhàn)

    這篇文章主要介紹了rust中間件在項(xiàng)目中的使用實(shí)戰(zhàn),包括自定義中間件,日志中間件,Default?headers,用戶會(huì)話,錯(cuò)誤處理的用法實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Rust 標(biāo)準(zhǔn)庫的結(jié)構(gòu)及模塊路徑詳解

    Rust 標(biāo)準(zhǔn)庫的結(jié)構(gòu)及模塊路徑詳解

    在 Rust 中,標(biāo)準(zhǔn)庫提供了一組核心功能,以幫助開發(fā)者執(zhí)行常見的編程任務(wù),這個(gè)路徑樹可以作為參考,幫助你更好地理解 Rust 標(biāo)準(zhǔn)庫的結(jié)構(gòu)和模塊之間的關(guān)系,本文介紹 Rust 標(biāo)準(zhǔn)庫的結(jié)構(gòu),并提供相應(yīng)的 use 路徑,感興趣的朋友一起看看吧
    2024-05-05
  • 基于Rust構(gòu)建一個(gè)Git提交歷史可視化工具

    基于Rust構(gòu)建一個(gè)Git提交歷史可視化工具

    在軟件開發(fā)中,版本控制系統(tǒng)的歷史記錄往往承載著項(xiàng)目的演進(jìn)脈絡(luò),本文主要介紹了如何基于Rust構(gòu)建一個(gè)Git提交歷史可視化工具,感興趣的小伙伴可以了解下
    2025-11-11
  • 詳解rust?自動(dòng)化測(cè)試、迭代器與閉包、智能指針、無畏并發(fā)

    詳解rust?自動(dòng)化測(cè)試、迭代器與閉包、智能指針、無畏并發(fā)

    這篇文章主要介紹了rust?自動(dòng)化測(cè)試、迭代器與閉包、智能指針、無畏并發(fā),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

新竹市| 孟连| 西峡县| 腾冲县| 安平县| 泰来县| 安平县| 衡阳县| 商城县| 大理市| 乐平市| 丹寨县| 翼城县| 永顺县| 葫芦岛市| 韶山市| 苍南县| 靖西县| 双鸭山市| 云龙县| 甘孜| 娱乐| 怀柔区| 呈贡县| 四子王旗| 上高县| 汨罗市| 吴堡县| 聂拉木县| 商都县| 灌南县| 达尔| 麻江县| 清远市| 肇庆市| 连云港市| 东辽县| 柯坪县| 桑植县| 托克逊县| 阿合奇县|