Solidity——pure 不消耗gas的情況、call和sendTransaction區別

/ pure: 純純牛馬 function addPure(uint256 _number) external pure returns(uint256 new_number){ new_number = _number + 1; }不會消耗gas對吧。傳的不是狀態變量

你的理解基本對了,但我們來更嚴謹、深入地回答這個問題。


? 你這段 pure 函數代碼:

function addPure(uint256 _number) external pure returns(uint256 new_number) {new_number = _number + 1;
}

這是一個非常典型的 pure 函數:

  • ? 不讀取任何鏈上狀態變量

  • ? 不寫入鏈上狀態變量

  • ? 只是計算輸入值 _number + 1,然后返回


?會不會消耗 gas?

場景是否消耗 gas原因解釋
用 call 調用(比如 Remix 藍色按鈕、本地調用)? 不消耗函數在本地執行,不上鏈,不發交易
用 sendTransaction 發交易調用? 會消耗雖然函數是 pure,但只要發了交易、上了鏈,就會消耗 gas(因為 EVM 要執行它)

? 舉例說明:

1. 使用 Remix 調用(或 web3/ethers call):
const result = await contract.addPure(123); // ? 不消耗 gas

這是 本地仿真運行,不發交易,完全不花錢。適合做鏈下計算。


2. 使用 sendTransaction 方式調用:
await contract.addPure(123, { from: user });

就算函數是 pure,因為你發了交易,EVM 還是要執行它、打包進區塊,所以:

  • ? 會消耗 gas(比如 21,000 ~ 30,000)

  • ? 不會改鏈上狀態

  • ?? 不推薦這么用,沒意義還浪費 gas


🧠 小結:

函數類型pure
是否能讀狀態? 不行
是否能改狀態? 不行
是否消耗 gas?? 發交易才消耗;? 用 call 就不消耗

🚀 一句話總結:
只要你調用 pure/view 函數時用的是 call,不發交易,就不花 gas。


需要我幫你寫一個對比:pure、view、write 三種函數并觀察 Remix 上 gas 消耗差異的完整演示代碼嗎?

二、call和sendTransaction區別

你問得非常好!這是很多 Solidity 初學者在實際調用合約時都會混淆的核心概念。我們現在來徹底講清楚什么是 sendTransaction 方式,以及為什么你寫的那種方式就是。


? 先定義:什么是 sendTransaction?

在以太坊中:

sendTransaction 是指:向區塊鏈發起一筆真實交易(transaction),從一個地址調用一個合約函數,消耗 gas,可能改變鏈上狀態。


🔍 舉個類比說明:

操作方式類似于做什么會不會上鏈會不會花 gas使用函數類型
call查看數據、模擬執行? 否? 否view / pure
sendTransaction正式簽名 + 發交易 + 廣播? 是? 是(一定會)non-view/任意

? 回到你的例子:

await contract.addPure(123, { from: user });

這行代碼,在 web3.jsethers.js 中,如果你用 await 調用了一個合約的函數,并且它不是 .call().staticCall(),那么默認行為就是發起一筆真實交易,也就是 sendTransaction


🧨 它其實等價于這樣:

await contract.methods.addPure(123).send({ from: user });
  • 這就會觸發一筆鏈上交易

  • 即使 addPure()pure 函數

  • 你也會花 gas(比如 21,000)

  • 但結果你無法直接拿到返回值,因為鏈上交易不返回值


?? 非常重要的對比:

用法是否發交易(sendTransaction)能不能返回結果是否消耗 gas
contract.methods.foo().call()? 否(只讀模擬)? 可以獲取結果? 不花錢
contract.methods.foo().send()? 是(發交易)? 無法直接獲取? 要花 gas

? 正確方式:調用 pureview 函數推薦用 .call()

const result = await contract.methods.addPure(123).call(); // ? 推薦方式
console.log(result); // 124
  • .call() 是本地調用,不會發交易

  • 不會花錢

  • 可以立刻獲取返回值


? 總結一句話:

只要你用的是 .send() 或不帶 .call() 的 await 函數調用,并且指定了 { from: ... },那就是發了交易(sendTransaction),會 上鏈、花 gas、不直接返回結果


如果你想,我可以再寫一段完整的 ethers.js 示例,對比 .call.sendTransaction 兩種方式的執行行為。需要嗎?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913302.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

柔性電路芯片賦能腦機接口:技術融合、應用突破與前景展望

柔性電路芯片賦能腦機接口:技術融合、應用突破與前景展望 一、引言 1.1 研究背景與意義 在科技飛速發展的時代,柔性電路芯片與腦機接口的融合展現出巨大的潛力,為醫療、科研等多個領域帶來了新的機遇與變革。 從醫療領域來看,隨著人口老齡化的加劇以及神經系統疾病患者…

全面解析存儲芯片:從Flash到DDR、鐵電、內存條與SD卡

一、存儲芯片分類概述 存儲芯片是電子設備中用于數據存儲的核心組件,根據數據保存方式可分為 易失性存儲器(Volatile Memory) 和 非易失性存儲器(Non-Volatile Memory)。 類型代表芯片特點典型應用易失性存儲器DRAM、…

編譯ADI NO-OS工程

1,先在WINdows下安裝git bush 可以參考下面博客 https://blog.csdn.net/Natsuago/article/details/145647536 2.安裝make 工具 可參考一下鏈接 https://blog.csdn.net/weixin_40727233/article/details/110353240 3,參考ADI官方鏈接 https://wiki.analo…

自存bro code java course 筆記(2025 及 2020)

Java Full Course for free ? System 是 Java 中的一個 final 類,定義在 java.lang 包中。它的 構造方法是 private 的,意味著你無法通過 new System() 來創建對象。它的所有常用成員(如 System.out, System.in, System.err, currentTimeMil…

opencv基礎的圖像操作

目錄 1.安裝opencv-python 2.基礎的圖像操作 3.繪制幾何圖形 3.1.繪制直線 3.2.繪制矩形 3.3.繪制圓形 3.4.向圖像中添加文字 總結 1.安裝opencv-python pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python 2.基礎的圖像操作 # 導入庫 import c…

Kali制作Linux木馬

環境描述:攻擊機:kali-Linux2025靶機:Linux-Centos8本文章主要介紹怎么通過kali制作Linux木馬控制linux,不要用于非法用途,法律是底線不要觸碰,提升自己的網絡安全技能,如有用于非法用途自行承擔…

常見user agent

常見user agent pc端ua chrome “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36”“Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11”“Mo…

Windows 11 Enterprise LTSC 轉 IoT

Windows 11 Enterprise LTSC 轉 Windows 11 IoT Enterprise LTSC 微軟官方并未給出Windows 11 IoT Enterprise LTSC中文版的鏡像文件,但可以通過Windows 11 Enterprise LTSC版本的進行轉換。 二者主要區別概覽 特性Windows 11 Enterprise LTSCWindows 11 IoT Ent…

【手動安裝并啟動后, 如何查看mysql數據庫密碼以及重置密碼(centos8)】

在 CentOS 8 上手動安裝 MySQL 后,初始密碼的位置取決于安裝方式。以下是查找密碼的步驟: 1. 通過 yum/dnf 安裝的 MySQL 8.0 如果使用官方 RPM 源安裝,初始密碼會在安裝時自動生成并記錄在日志中: # 查看 MySQL 初始密碼 sudo…

STM32第十四天串口

一:串口發送字符和字符串和printf重定向 usart.c #include "stm32f10x.h" #include "usart.h" #include "stdio.h"void my_usart_Init()//千萬不要和32庫里面串口定于的名字一樣,不然會報錯 {GPIO_InitTypeDef my_usart…

ether0 大語言推理模型生成SMILES 的分子

參考: https://huggingface.co/futurehouse/ether0 ether0 是一個 24B 語言模型,用于用英語進行推理并輸出分子結構作為 SMILES。它源自 Mistral-Small-24B-Instruct-2501 的微調和強化學習訓練。用英語提問,但問題中也可以包含指定為 SMILE…

基于AndServer的RPC架構:Android原生SO文件遠程調用實戰指南

引言:企業級原生代碼集成的范式革新 在移動混合架構應用中,原生代碼(SO)調用面臨??三重技術瓶頸??: ??環境強耦合??:依賴應用上下文,復用成本增加200%(Gartner 2023數據)??安全限制…

spring-ai 1.0.0 (3)交互增強:Advisor 顧問模塊

核心組件 API 由非流式處理方案和 和 流式處理方案組成。 在1.0.0版本中,顧問鏈AdvisorChain相關接口已經棄用,可能是老版本的思想不太合倫理吧 可以使用下面的方式實現多個顧問按oder順序訪問模型 public ChatController(ChatClient.Builder chatClien…

【機器學習筆記Ⅰ】2 線性回歸模型

線性回歸(Linear Regression)是機器學習中最基礎、最常用的監督學習模型之一,用于解決回歸問題(預測連續數值輸出)。它的核心思想是通過擬合一條直線(或超平面)來描述輸入特征(自變量…

2025.7.6總結

第天,Morning power 1.四四呼吸,做了10分鐘。 2.感恩環節:有兩周沒去新勵成上課了,感謝今天早上去上了當眾講話,遇到了不少老朋友,聊的還蠻開心滴,滿足了我的社交需求。其次,在臺上做了個小面試…

RabbitMQ 高級特性之死信隊列

1. 簡介 在前面的高級特性中,我們介紹了重試機制和 TTL,那么產生下列問題: 在重試機制中,當消費者消費消息發生異常時,會觸發消息重發機制,由于我們配置了最大的重發次數,那么當超過這個次數后…

如何選擇合適的工業相機快門種類

在工業相機領域,常見的三種快門類型:全局快門(Global Shutter)、卷簾快門(Rolling Shutter)以及全局復位式卷簾快門(Global - reset rolling Shutter)。我們主要來講講全局快門&…

uloop源碼剖析

uloop是libubox庫的核心模塊,libubox是OpenWrt基礎庫之一,用來提供事件驅動、基礎數據結構等。 uloop支持文件描述符監控、超時定時器、子進程管理、信號處理事件、間隔定時器等五大核心功能。 主體框架 uloop循環的主體框架有三個函數構成&#xff0c…

Mac電腦 虛擬機 VMware Fusion13

VMware Fusion mac 不僅能讓你在Mac蘋果電腦上運行Windows或Linux系統、使用非Mac平臺的應用,而且還可以支持各種USB硬件設備。 原文地址:VMware Fusion 13 Mac虛擬機

嵌套容器是隱射宿主機的路徑而不是容器的路徑

嵌套容器是隱射宿主機的路徑而不是容器的路徑 為什么?容器中的 Docker 運行流程 為什么? 這個問題涉及 Docker 的工作原理,特別是嵌套容器的行為。讓我們逐步分析為什么在容器內部啟動其他容器時,文件系統的掛載行為是基于 宿主機…