搜索
查看
编辑修改
首页
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
理解BS期权定价
2
微信公众号对话框回复消息链接跳转小程序_微信公众号消息跳转微信小程序传值
3
Java API文档_java的api文档是什么
4
用通俗易懂的方式讲解:决策树模型及案例(Python 代码)_决策树模型python代码
5
基于Unity默认烘焙系统产出Ambient Occlusion, Sky Occlusion等数据_unity烘焙ao
6
AI术语名词中英文解释_ai术语效应
7
SEO技术大师-论坛网站SEO设置方法_dz论坛好做优化吗
8
面向终客户和设备制造商的Ethernet-APL
9
用Python实现的这五个小游戏,你真的学会了嘛?_用python写一个小游戏
10
经典智能合约案例之发红包_智能合约设计案例
当前位置:
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
asp
.net/c#
仓库
管理系统
_
asp
.net
core
数据库
管理系统
...
出入库记录(主键,出入库单号,
仓库
,产品,出入数量,时间)员工(主键,名称,性别,电话,编号,身份证)管理员(主键,用户...
赞
踩
article
投标文件
医院
弱电
系统
_一套通俗易懂的
数据中心
机房
建设
方案
弱电
新人学习!......
一套数据
数据中心
建设
方案
,具体内容如下:1、
机房
布局划分,消防区规划,
机房
设备规划,
机房
设备规划,
机房
区剖面规划;2、机...
赞
踩
article
AI推介-多模态
视觉
语言
模型
VLMs
论文速览(
arXiv
方向):
20
24.02.
20
-
20
24.02...
配备触摸屏和手写笔的平板电脑越来越多,其中一个关键功能就是将手写转换为文本,从而实现搜索、索引和人工智能辅助功能。与此同...
赞
踩
article
【
Claude3
】
Claude3
来袭
,
如何
注册
使用
?它与
GPT
到底有何不同?...
一个带有规则的人工智能指出
,
入侵邻居的Wi-Fi网络是一种“侵犯隐私”和“可能是非法的”行为。随后
,
Claude 2.1...
赞
踩
article
区块
链及
以太
坊
常用概念整理(一)_
以太
坊
公私钥用
的
是
什么
加密算法
...
本文整理了
区块
链及
以太
坊
上
的
一些常见概念,基本上全部来源于网络上各种定义及解释。_
以太
坊
公私钥用
的
是
什么
加密算法
以太
坊
公...
赞
踩
article
数据库
技术
新
版图 -
Serverless
数据库
...
数据库
的发展已走过近四十年,作为基础软件之一,
数据库
称得上是一个“古老”的领域。而随着
新
技术的涌现,这个传统的领域也正不...
赞
踩
article
2022
年
12
月中国
数据库
排行榜
:
OceanBase
立足创新登榜首,华为腾讯
排名
上升树雄心_
国产
数据...
2022
年
12
月的 墨天轮中国
数据库
流行度
排行榜
火热出炉,本月
排行榜
前十用一句话可以概括为:榜单前十一片红,TODO ...
赞
踩
article
用
大
数据
“喂养”出来
的
AI
模型
ChatGPT
爆火是
大
数据
、
大
算力
、
强算法
的
支撑,中国缺乏
的
什么?_...
从2018年到2022年,Open
AI
先后迭代并推出了GPT-1
、
GPT-2
、
GPT-3和InstructGPT,此次发...
赞
踩
article
英特尔
锐炫
™ A
系列
显卡
简介_
英特尔
锐炫
a
系列
显卡
简介...
英特尔
锐炫
™ A
系列
显卡
(ARC)基于Xe-HPG微架构设计,采用了业界领先的6nm工艺,搭载了大量创新的硬件加速单元...
赞
踩
article
扩散模型 (
Diffusion
Model
) 简要介绍与源码分析_
ddpm
gaussian dif...
扩散模型 (
Diffusion
Model
) 简要介绍与源码分析前言广而告之总览参考文章扩散模型介绍基本原理前向阶段逆向...
赞
踩
article
TTS
技术
中的
语音
合成
模型
在
实时性
要求高的应用中的表现_tts
模型
...
作者:禅与计算机程序设计艺术 "
TTS
技术
中的
语音
合成
模型
在
实时性
要求高的应用中的表现"引言1.1. 背景_tt...
赞
踩
article
个人
语音
AI
助手_
coqui
tts
使用
自己
的
人声训练模型...
个人建议
使用
Coqui TTS或espnet TTS,这两个开源项目对生成自然效果
语音
有很多研究,可以通过调教模型达到非...
赞
踩
article
【送书福利-
第三十八
期】《
SaaS
产品
实践
方法论
:
从
0到N构建
SaaS
产品
》...
本书提供了一套
从
0到N的
SaaS
产品
实践
方法论
。本书内容包括
SaaS
行业通识、行业洞察、客户调研及洞察、
SaaS
产品
竞品...
赞
踩
article
Python
数模
笔记
-
Sklearn
(1)介绍_
sklearn
0.0
.
post5
...
1、SKlearn 是什么
Sklearn
(全称 SciKit-Learn),是基于
Python
语言的机器学习工具包。...
赞
踩
article
数据分享|R
语言
用核
Fisher
判别方法、支持向量
机
、
决策树
与随
机
森林研究
客户
流失
情况......
全文链接:https://tecdat.cn/?p=35438分析师:Jiaojiao Zhao现在,越来越多的人意识到...
赞
踩
article
爬取
imdb
资料库
_
imdb
数据集
爬虫
...
写一个简单的python
爬虫
程序,
爬取
imdb
资料库
,将
爬取
到的电影信息,存储到一个excel表格中因为
imdb
资料库
电...
赞
踩
article
lda
主题
模型
困惑
度_
Perplexity
(
困惑
度)详解...
引子:今年上半年,我报名参加了julyEdu的三月份机器学习班,在班上我自告奋勇地分享了下自己对LDA
模型
中几个重要问题...
赞
踩
article
基于深度
神经网络
的
噪声
标签
学习
_
带噪
学习
...
摘要:介绍
带噪
学习
领域前沿方法,解决不完美场景下的
神经网络
优化策略,旨在提升模型性能。_
带噪
学习
带噪
学习
...
赞
踩
article
深度
学习
与
围棋
,零开始一步步
实现
自己
的“
AlphaGo
”...
AlphaGo
引领了近年来机器
学习
领域的几次标志性突破,并被爆出一系列令人难忘的大新闻,包括
与
樊麾、李世石、柯洁等
围棋
大...
赞
踩
article
使用QT鼠标事件
mousePressEvent
+
open
c
v
在
ui
上获取任意形状
roi
感兴趣区域
c
/...
这里写自定义目录标题实现效果如下:代码可能有点啰嗦贴下面了,有些和这个无关的我就删掉了做毕设的时候老师要求选取任意的ro...
赞
踩
相关标签
c#
数据库
sql
投标文件 医院弱电系统
人工智能
语言模型
VLM
视觉语言模型
图像处理
论文推送
LLM
gpt
区块链
后端
mysql
java
oceanbase
华为
英特尔开发套件
stable diffusion
自然语言处理
编程实践
开发语言
架构设计