欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何使用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中的&和ref使用解讀

    Rust中的&和ref使用解讀

    在Rust中,`&`和`ref`都可以用來定義指針,但它們的使用位置不同,`&`通常放在等號(hào)右邊,而`ref`放在左邊,`&`主要用于函數(shù)參數(shù)和模式匹配中,而`ref`主要用于模式匹配中,Rust通過`&`和`ref`提供了靈活的指針操作,使得代碼更加安全和高效
    2025-02-02
  • Rust實(shí)現(xiàn)AES加解密詳解

    Rust實(shí)現(xiàn)AES加解密詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Rust語言實(shí)現(xiàn)AES加解密算法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下
    2022-10-10
  • Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解

    Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解

    這篇文章主要為大家介紹了Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Rust調(diào)用Windows API 如何獲取正在運(yùn)行的全部進(jìn)程信息

    Rust調(diào)用Windows API 如何獲取正在運(yùn)行的全部進(jìn)程信息

    本文介紹了如何使用Rust調(diào)用WindowsAPI獲取正在運(yùn)行的全部進(jìn)程信息,通過引入winapi依賴并添加相應(yīng)的features,可以實(shí)現(xiàn)對(duì)不同API集的調(diào)用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • RUST語言函數(shù)的定義與調(diào)用方法

    RUST語言函數(shù)的定義與調(diào)用方法

    定義一個(gè)RUST函數(shù)使用fn關(guān)鍵字,下面通過本文給大家介紹RUST語言函數(shù)的定義與調(diào)用方法,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Rust常用功能實(shí)例代碼匯總

    Rust常用功能實(shí)例代碼匯總

    通過一系列實(shí)用示例展示了Rust在文件操作、網(wǎng)絡(luò)請(qǐng)求、并發(fā)編程、命令行工具以及數(shù)據(jù)庫操作等方面的應(yīng)用,這些示例不僅展示了 Rust 的強(qiáng)大功能,還提供了實(shí)際開發(fā)中的指導(dǎo)和參考,通過這些示例,您可以更好地理解 Rust 的特性,并將其應(yīng)用于您的項(xiàng)目中
    2024-12-12
  • Rust字符串類型全解析(最新推薦)

    Rust字符串類型全解析(最新推薦)

    Rust語言中,字符串類型眾多,設(shè)計(jì)初衷是為了確保程序的安全、高效和靈活性,本文詳細(xì)解釋了Rust中不同的字符串類型,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Rust中的方法與關(guān)聯(lián)函數(shù)使用解讀

    Rust中的方法與關(guān)聯(lián)函數(shù)使用解讀

    在Rust中,方法是定義在特定類型(如struct)的impl塊中,第一個(gè)參數(shù)是self(可變或不可變),方法用于描述該類型實(shí)例的行為,而關(guān)聯(lián)函數(shù)則不包含self參數(shù),常用于構(gòu)造新實(shí)例或提供一些與實(shí)例無關(guān)的功能,Rust的自動(dòng)引用和解引用特性使得方法調(diào)用更加簡(jiǎn)潔
    2025-02-02
  • Rust語言中的哈希表

    Rust語言中的哈希表

    哈希表也是集合中的一種,也是最常用的集合形式,目前Rust語言核心部分沒有對(duì)哈希表進(jìn)行實(shí)現(xiàn),是使用標(biāo)準(zhǔn)庫提供的,這篇文章主要介紹了Rust語言之哈希表,需要的朋友可以參考下
    2024-02-02
  • 利用rust編一個(gè)靜態(tài)博客工具

    利用rust編一個(gè)靜態(tài)博客工具

    這篇文章主要為大家詳細(xì)介紹了如何利用rust編一個(gè)靜態(tài)博客工具,這個(gè)靜態(tài)博客的工具主要是把md文檔轉(zhuǎn)為html靜態(tài)網(wǎng)站/博客,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12

最新評(píng)論