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

推荐订阅源

爱范儿
爱范儿
MyScale Blog
MyScale Blog
Recent Announcements
Recent Announcements
N
Netflix TechBlog - Medium
GbyAI
GbyAI
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
Visual Studio Blog
Martin Fowler
Martin Fowler
腾讯CDC
大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
云风的 BLOG
云风的 BLOG
J
Java Code Geeks
WordPress大学
WordPress大学
P
Proofpoint News Feed
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
有赞技术团队
有赞技术团队
人人都是产品经理
人人都是产品经理
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Y
Y Combinator Blog

博客园 - 幽州散人

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