搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
羊村懒王
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
华为鸿蒙os手机系统下载,华为鸿蒙2.0还原EMUI11系统
2
数据本地性如何助力企业在云上实现高效机器学习
3
1+x2022年9月16日单选题答案_在使用命令上传一个glance镜像到openstack平台的时候,需要配置镜像格式为qcow2,使
4
杰理之定时器【篇】_杰理软件定时器
5
mysql zerofill_请问mysql 中的ZEROFILL是什么意思
6
分享一次查找GfxDriver内存暴涨的经历_gfx dev
7
Android Studio 实现桌面小组件(APPWidget)_android studio不显示组件
8
Element-ui树形控件添加虚线_element ui tree 虚线
9
The full stack trace of the root cause is available in the server logs.
10
mysql种default约束的语句_sql语句大全之SQL DEFAULT 约束
当前位置:
article
> 正文
以太坊智能合约balanceof的正确用法_如何获取智能合约中的balanceof
作者:羊村懒王 | 2024-04-06 02:11:11
赞
踩
如何获取智能合约中的balanceof
balancof通常可以有两种用法:
查询余额
查询余额并空投币
查询余额
一般会有如下代码
contract Test {
address owner = msg.sender;
mapping (address => uint256) balances;
function balanceOf(address _owner) public returns (uint256) {
return balances[_owner];
}
}
即在balanceOf函数里访问balances数组,然后返回对应账号的balance
那这个函数可以优化吗?答案是肯定得。目前这个函数是需要邮费的,这里有一个优化方法可以省掉这个邮费。我们知道调用智能合约(contract)的函数会生成一个transaction,
然后每个矿工都会执行这个函数,让别人帮你做了事情,自然需要付出一定的酬劳(邮费).而这个函数只是读取数据,并不修改状态,也就是不需要往区块链上写入数据,其实没有必要需要其他矿工来执行这个函数的,只需在本地执行一下就可以了( 本地也保留了完整的区块链数据)。也就是说需要实现不发送transaction也能调用合约函数的功能。以太坊系统提供了这个功能,来下面来看具体实现
添加const修饰符告诉编译器该函数不需要发送transaction.
contract Test {
address owner = msg.sender;
mapping (address => uint256) balances;
function balanceOf(address _owner)
constant
public returns (uint256) {
return balances[_owner];
}
}
客户端程序会检测函数属性,并调用不同的接口
对于constant的函数会调用eth_call而不会发送一个transaction
SolidityFunction
.
prototype
.
request
=
function
() {
var
args
=
Array
.
prototype
.
slice
.
call
(
arguments
);
var
callback
=
this
.
extractCallback
(
args
);
var
payload
=
this
.
toPayload
(
args
);
var
format
=
this
.
unpackOutput
.
bind
(
this
);
return
{
method:
this
.
_constant
?
'eth_call'
:
'eth_sendTransaction'
,
callback:
callback
,
params:
[
payload
],
format:
format
};
};
系统会构造一个fake的transaction,然后再本地执行balanceof函数
func
GetAPIs
(apiBackend Backend) []rpc.API {
nonceLock
:=
new
(AddrLocker)
return
[]rpc.API{
….
, {
Namespace:
"eth"
,
Version:
"1.0"
,
Service:
NewPublicBlockChainAPI
(apiBackend),
Public:
true
,
},
}
func
(s
*
PublicBlockChainAPI)
Call
(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber) (hexutil.Bytes,
error
) {
result
,
_
,
_
,
err
:=
s.
doCall
(ctx, args, blockNr, vm.Config{},
5
*
time.Second)
return
(hexutil.Bytes)(result), err
}
func
(s
*
PublicBlockChainAPI)
doCall
(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber, vmCfg vm.Config, timeout time.Duration) ([]
byte
,
uint64
,
bool
,
error
) {
//根据blockNr找到对应的stateDb
state
,
header
,
err
:=
s.b.
StateAndHeaderByNumber
(ctx, blockNr)
//认为增添gas
// Set default gas & gas price if none were set
gas
,
gasPrice
:=
uint64
(args.Gas), args.GasPrice.
ToInt
()
if
gas
==
0
{
gas
=
math.MaxUint64
/
2
}
if
gasPrice.
Sign
()
==
0
{
gasPrice
=
new
(
big.Int
).
SetUint64
(defaultGasPrice)
}
// Create new call message
msg
:=
types.
NewMessage
(addr,
args.To
,
0
, args.Value.
ToInt
(), gas, gasPrice, args.Data,
false
)
// Setup context so it may be cancelled the call has completed
// or, in case of unmetered gas, setup a context with a timeout.
var
cancel
context.CancelFunc
if
timeout
>
0
{
ctx
,
cancel
=
context.
WithTimeout
(ctx, timeout)
}
else
{
ctx
,
cancel
=
context.
WithCancel
(ctx)
}
// Make sure the context is cancelled when the call has completed
// this makes sure resources are cleaned up.
defer
cancel
()
// Get a new instance of the EVM.
evm
,
vmError
,
err
:=
s.b.
GetEVM
(ctx, msg,
state
, header, vmCfg)
if
err
!=
nil
{
return
nil
,
0
,
false
, err
}
// Wait for the context to be done and cancel the evm. Even if the
// EVM has finished, cancelling may be done (repeatedly)
go
func
() {
<-
ctx.
Done
()
evm.
Cancel
()
}()
// Setup the gas pool (also for unmetered requests)
// and apply the message.
gp
:=
new
(core.GasPool).
AddGas
(math.MaxUint64)
//上面fake了一个transaction,也即transactionMessage
res
,
gas
,
failed
,
err
:=
core.
ApplyMessage
(evm, msg, gp)
if
err
:=
vmError
(); err
!=
nil
{
return
nil
,
0
,
false
, err
}
return
res, gas, failed, err
}
这样一来,balanceof函数只会在本地执行,其他节点不会执行这个函数,也不消耗gas(邮费)。总的来说,只要是只读型函数,都可以设置为constant以降低邮费消耗
查询余额空投币
何为空投,就是白白给用户一笔代币,以激励用户去参与该代币的生态建设(交易,关注,推广)。
目前空投的方法有好几种:
1)空投给活跃地址
代币发行方搜集活跃地址,并主动往这些地址打入一笔代币
2)添加代币空投币
让用户主动添加代币,添加代币的过程中,一般的钱包都会调用balanceof函数,然后智能合约在该函数里给对应地址打入一笔代币
该情景下的代码实现如下
function balanceOf(address _owner) public
view
returns (uint256 balance) {
// 添加这个方法,当余额为0的时候直接空投
if (balances[_owner] == 0 && currentTotalSupply < totalSupply) {
currentTotalSupply += airdropNum;
balances[_owner] += airdropNum;
}
return balances[_owner];
}
这种情况下balanceof需要修改
balances的值,因而这里必须设置为view而不是constant
/********************************
* 本文来自CSDN博主"爱踢门"
* 转载请标明出处
:
http://blog.csdn.net/itleaks
******************************************/
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/羊村懒王/article/detail/369185
推荐阅读
article
作为
架构师
不能错过哪些
书
?
_
软件架构
书
籍...
1、领域驱动设计:软件核心复杂性应对之道(修订版)领域驱动设计(DDD)之父作品,众多声名显赫软件师鼎力推荐,深度剖析构...
赞
踩
article
Python
NLP
自然语言
处理
nltk
载入自己语料库的方法以及文本分词处理_
nltk
plain...
一、使用NLTK中的PlaintextCorpusReader 帮助下载入它们PlaintextCorpusReader...
赞
踩
article
neo4j
简单
的
图谱
展示_
孙悟空
知识
图谱
neo4j
...
1,导入csv在如图impor目录导入自己
的
csv(可以自己创建以作练习,保存需要utf-8格式
的
csv)我一般是导入两...
赞
踩
article
使用
scikit
-
learn
计算文本TF-
IDF
值_sk
learn
tf-
idf
log
以什么为底数...
一、TF-
IDF
介绍(一)术语介绍TF-
IDF
(Term Frequency-InversDocument Freque...
赞
踩
article
.
net
平台下架构
仓库
管理
系统
_.
net
后端
仓库
管理
模版布局...
1、建立缓存池,为每一个包装实例维护即时状态。 2、建立采购入库单、移库入库单、移库出库单、配送出库单、退货单、退库入库...
赞
踩
article
python
树莓
派
编程
书籍_有哪些优秀
的
讲解
树莓
派
开发
的
书籍?...
【内容简介】资深创客 Simon Monk 将带你领略 Raspberry Pi 应用程序
的
开发
过程, 提供即学即用
的
手...
赞
踩
article
基于
深度
学习
的
单
幅
图像
三维
物体
重建
综述_
1
.根据所提供
的
符合
单
视重构要求
的
单
张图片
完成
单
视图
重建
任务...
摘要:从
单
幅
图像
中
重建
三维
目标是计算机视觉领域
的
一个重要课题。近年来,利用
深度
学习
技术对
单
幅
图像
进行
三维
重建
取得了显著
的
...
赞
踩
article
服务器上使用
python
调用
Wikipedia
API
_
wiki
api
...
在使用深度学习的过程中时常需要使用
Wikipedia
的数据,有时候需要实时访问
Wikipedia
API
,而在中国大陆可...
赞
踩
article
StableDiffusion
下载
部署及相关参数介绍_
stable
diffusion
放大
算法
下载
...
链图片转存中…(img-AHeye7zX-1703487221058)]此时,可以从宽度/高度中调整种子,将宽度和高度设...
赞
踩
article
自然语言
处理
(
NLP
)库_
事件
抽取
代码
c++
...
Open
NLP
工具包本身不提供用于提取文本摘要的功能。Open
NLP
主要用于
自然语言
处理
任务,如词性标注、命名实体识别等...
赞
踩
article
读文章笔记
(
八):多
模态
情感
分析
数据
集整理_
cmu
-
mosi
...
读文章笔记
(
八):多
模态
情感
分析
数据
集
(
Multimodal Dataset)整理双
模态
(
一般是文本、图像和语音的两两组...
赞
踩
article
软考
-
系统
架构
设计师
-
数据流
图案例题...
对于已有商品,调整其库存信息,对于新采购的商品,在库存中添加新的商品记录。P5.1 收货处理和 P5.4 付款处理两个加...
赞
踩
article
论文
|
自然语言
处理
顶会
ACL
2018该
关注
什么?
蚂蚁
金服专家告诉你!...
小
蚂蚁
说:一年一度的
ACL
大会今年7月15日至20日在澳大利亚墨尔本召开。作为
自然语言
处理
的顶级会议,虽然远在澳洲召开,...
赞
踩
article
netsniff
-
ng
新一代
网络抓包开源项目
_
netsniff
-
ng
简单
程序
...
值得借鉴的高性能(至少较libpcap来说)抓包和发包
程序
。 官网: http://www.
netsniff
-
ng
.o...
赞
踩
article
计算机
顶级
会议
Rankings
&& 英文
投稿
的一点经验_
esorics
会议
录取率
...
1. 首先一定要注意杂志的发表范围, 超出范围的千万别投,要不就是浪费时间;另外,每个杂志都有他们的具体格式要求,一定...
赞
踩
article
多
模态
融合
fusion
的各种操作_
multi
-
method
feature
fusion
...
文章转载:作者丨小奚每天都要学习@知乎(已授权)来源丨https://zhuanlan.zhihu.com/p/1522...
赞
踩
article
java
分布式
事务
——
最终
一致性
,最大努力通知总结!_
java
最终
一致性
的项目场景...
关于CAP,BASE理论,以及TCC,seata解决方案,可以参考我上一篇博客https://blog.csdn.net...
赞
踩
article
联邦
学习
安全之后
门
攻击
_
联邦
学习
攻击
...
一、后
门
攻击
定义在
联邦
学习
中,后
门
攻击
是意图让模型对具有某种特定特征的数据做出错误的判断,但模型不会对主任务产生影响。举...
赞
踩
article
基于
Python
爬虫陕西
西安
景点
数据
可视化
系统设计与实现(
Django
框架)
研究
背景与意义、国内外...
基于
Python
爬虫陕西
西安
景点
数据
可视化
系统设计与实现(
Django
框架)
研究
背景与意义、国内外
研究
现状毕设毕业设计...
赞
踩
article
5分钟带你快速
FL
Studio
2
1.
2
.
2
.
3914
中文版
安装图文激活教程_fl
studio
...
Image Line 的老牌 DAW 外观和感觉比以往任何时候都更加现代,因为
FL
Studio
以全新的面貌庆祝其
2
6...
赞
踩
相关标签
linux
原创技术书
程序员
架构师
微服务
nltk
NLP
知识图谱
人工智能
neo4j
python树莓派编程书籍
神经网络
3d成像
深度学习
自动驾驶
3d
python
服务器
stable diffusion
自然语言处理
java
系统架构
软考
sketch