惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
The Cloudflare Blog
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
T
Tailwind CSS Blog
L
LangChain Blog
Recent Announcements
Recent Announcements
Hugging Face - Blog
Hugging Face - Blog
Microsoft Security Blog
Microsoft Security Blog
F
Fortinet All Blogs
Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
I
InfoQ
博客园 - 司徒正美
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
H
Help Net Security
博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
B
Blog RSS Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - 幽州散人

SQL优化案例 synchronized 为啥会让虚拟线程卸载失效 主线任务和使命 温州3日之旅 CompletableFuture + 异步Servlet:同步的姿势、异步的效果 Snowflake雪花算法与发号器的应用 windows Java 幽灵转发壳进程 也谈MySQL limit offset深翻页问题 SHOW SESSION STATUS 与 Handler 变量 MySQL 5.7 Profiles 执行性能分析 MySQL临时表与文件排序 MySQL 5.7 MRR多范围读优化 MySQL 5.7 ICP索引条件下推优化 MySQL符合索引与最左前缀原则 从I/O 的物理成本理解回表和索引覆盖 第4个电瓶以及补漆 Flink原理:并行度与keyGroup桶 什么是数字批发银行 Java虚拟线程(三)实现原理 Java虚拟线程(二) Java虚拟线程(一) 大模型推理层服务化架构 传奇调查员之路:理智值-99,但我必须听懂深渊的语言 字节与其16进制字符表示转换的bug Redisson分布式锁 交易心得 DexScreener接口初探 某安全软件跑飞了。。 Ed25519算法签名与验签的Java实现 Tendermint拜占庭容错引擎
js里调用智能合约读/写函数的方法的区别
幽州散人 · 2026-05-26 · via 博客园 - 幽州散人

javascript用ethers.js调用evm区块链上的智能合约,合约方法函数有读写区别。

写方法,即会改变合约状态,例如:

let seed = "979202789523";
let tx = await contract.drawWinner("activity1",
                                       seed, 
                                      new Date().getTime());
let receipt = await tx.wait();
if(receipt.status === 1)
      console.log("tx成功: 交易Hash: %s, 区块Hash: %s,区块高度: %s", 
                  receipt.transactionHash, 
                  receipt.blockHash, 
                  receipt.blockNumber);
    else
      console.log("tx失败: %s", receipt);

这里drawWinner是合约的写方法
tx = await contract.drawWinner得到的tx是TransactionResponse,这时候得到这个结果只代表“交易已经广播发出去”,还未最终共识上链完成。
receipt = await tx.wait()表示的是已被区块确认上链完成,receipt是TransactionReceipt、即交易回执,可以获取到交易hash,区块hash,区块高度这些。

但是还是有个误区:
Solidity 的 return 对“交易函数”没意义,return 只在 EVM 内部存在,不会写进链上 receipt,solidity里调用有return的函数当然可以拿到返回值,但是从链下调用、交易回执里却是没有的。
即使drawWinner函数有return返回值,但在js里仍然是获取不到的,需要我们在js里主动去合约里查询。
比如:

let luckyIndex = await contract.luckyIndexOf("activity1");
console.log("索引:%s", luckyIndex);

上面的luckyIndexOf读方法,即viewpure函数,这些是可以有返回值并且可以在js里获取的。

为什么 EVM 这么设计
因为:
交易 return value
不会存链

区块链只保存:
state
logs
receipt

类型 作用
storage 状态数据库
event/log 消息队列/索引
return value 临时执行结果

真正重要的数据
不要只依赖 event