对智能合约的读方法和写方法的调用
Contents
介绍了调用智能合约中"读方法"与"写方法"的区别
方法(函数)的分类
智能合约中的方法可以粗暴的分为两类:
- 不会改变虚拟机状态的方法
- 会改变虚拟机状态的方法
假设我们将他们称为"读方法"和"写方法", 那么读方法而言, 其是不会创建交易和花费GAS
的, 是免费的. 对于写方法而言, 需要收取’手续费’进行挖矿的.
关键字 | 描述 | 改变虚拟机状态? |
---|---|---|
pure | 不读数据, 也不写数据 | NO |
view | 读数据, 但不写数据 | NO |
payable | 支付以太, 肯定写数据 | YES |
未明确指示的 | 其它可能写数据的 | YES |
Web3.js的 call() 与Send()
对于上面两类方法, Web3.js
中分别对应Call
方法和Send
方法来进行调用
创建交易 | 改变虚拟机状态 | |
---|---|---|
Call() | NO | NO |
Send() | YES | YES |
实际上从语法层面上而言, 无论是读方法还是写方法, 都可以调用 call
, 但对于写方法, 调用call
虚拟机状态并不会改变, 并且不会报错.
举例
|
|
调用代码
|
|
输出
|
|
可以看到使用
call
调用add()
后 值并没有变, 而用send
调用add()
后, 值被累加1
web3.py
web3.py
中对应的是 call()
和transact()