Solidity API

2023-11-12

这是Solidity教程系列文章第8篇介绍Solidity API,它们主要表现为内置的特殊的变量及函数,存在于全局命名空间里。

Solidity 系列完整的文章列表请查看分类-Solidity

 

写在前面

Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解,
如果你还不了解,建议你先看以太坊是什么

欢迎订阅区块链技术专栏阅读更全面的分析文章。

Solidity API 主要表现为Solidity 内置的特殊的变量及函数,他们存在于全局命名空间里,主要分为以下几类:

  1. 有关区块和交易的属性
  2. 有关错误处理
  3. 有关数学及加密功能
  4. 地址相关
  5. 合约相关

下面详细讲解下

区块和交易的属性(Block And Transaction Properties)

用来提供一些区块链当前的信息。

  • block.blockhash(uint blockNumber) returns (bytes32):返回给定区块号的哈希值,只支持最近256个区块,且不包含当前区块。
  • block.coinbase (address): 当前块矿工的地址。
  • block.difficulty (uint):当前块的难度。
  • block.gaslimit (uint):当前块的gaslimit。
  • block.number (uint):当前区块的块号。
  • block.timestamp (uint): 当前块的Unix时间戳(从1970/1/1 00:00:00 UTC开始所经过的秒数)
  • msg.data (bytes): 完整的调用数据(calldata)。
  • msg.gas (uint): 当前还剩的gas。
  • msg.sender (address): 当前调用发起人的地址。
  • msg.sig (bytes4):调用数据(calldata)的前四个字节(例如为:函数标识符)。
  • msg.value (uint): 这个消息所附带的以太币,单位为wei。
  • now (uint): 当前块的时间戳(block.timestamp的别名)
  • tx.gasprice (uint) : 交易的gas价格。
  • tx.origin (address): 交易的发送者(全调用链)

注意:
msg的所有成员值,如msg.sender,msg.value的值可以因为每一次外部函数调用,或库函数调用发生变化(因为msg就是和调用相关的全局变量)。

不应该依据 block.timestamp, now 和 block.blockhash来产生一个随机数(除非你确实需要这样做),这几个值在一定程度上被矿工影响(比如在赌博合约里,不诚实的矿工可能会重试去选择一个对自己有利的hash)。

对于同一个链上连续的区块来说,当前区块的时间戳(timestamp)总是会大于上一个区块的时间戳。

为了可扩展性的原因,你只能查最近256个块,所有其它的将返回0.

错误处理

  • assert(bool condition)
    用于判断内部错误,条件不满足时抛出异常
  • require(bool condition):
    用于判断输入或外部组件错误,条件不满足时抛出异常
  • revert():
    终止执行并还原改变的状态

数学及加密功能

  • addmod(uint x, uint y, uint k) returns (uint):
    计算(x + y) % k,加法支持任意的精度且不会在2**256处溢出,从0.5.0版本开始断言k != 0。
  • mulmod(uint x, uint y, uint k) returns (uint):
    计算 (x y) % k, 乘法支持任意的精度且不会在2*256处溢出, 从0.5.0版本开始断言k != 0。
  • keccak256(…) returns (bytes32):
    使用以太坊的(Keccak-256)计算HASH值。紧密打包参数。
  • sha256(…) returns (bytes32):
    使用SHA-256计算hash值,紧密打包参数。
  • sha3(…) returns (bytes32):
    keccak256的别名
  • ripemd160(…) returns (bytes20):
    使用RIPEMD-160计算HASH值。紧密打包参数。
  • ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address):
    通过椭圆曲线签名来恢复与公钥关联的地址,或者在错误时返回零。可用于签名数据的校验,如果返回结果是签名者的公匙地址,那么说明数据是正确的。

    ecrecover函数需要四个参数,需要被签名数据的哈希结果值,r,s,v分别来自签名结果串。
    r = signature[0:64]
    s = signature[64:128]
    v = signature[128:130]
    其中v取出来的值或者是00或01。要使用时,我们先要将其转为整型,再加上27,所以我们将得到27或28。在调用函数时v将填入27或28。

用javascript表达如下:

1
2
3
4
5
6
7
var msg = '0x8CbaC5e4d803bE2A3A5cd3DbE7174504c6DD0c1C'

var hash = web3.sha3(msg)
var sig = web3.eth.sign(address, h).slice(2)
var r = `0x${sig.slice(0, 64)}`
var s = `0x${sig.slice(64, 128)}`
var v = web3.toDecimal(sig.slice(128, 130)) + 27

 

订阅区块链技术专栏可以参考到完整的使用例子。

紧密打包参数(tightly packed)意思是说参数不会补位,是直接连接在一起的,下面几个是相等的。

1
2
3
4
5
6
keccak256("ab", "c")
keccak256("abc")

keccak256(0x616263)  // hex
keccak256(6382179)
keccak256(97, 98, 99)   //ascii

如果需要填充,可以使用显式类型转换:keccak256(“\x00\x12”) 与keccak256(uint16(0x12))相同。

注意,常量将使用存储它们所需的最少字节数来打包,例如keccak256(0) == keccak256(uint8(0))和keccak256(0x12345678) == keccak256(uint32(0x12345678))

在私链(private blockchain)上运行sha256,ripemd160或ecrecover可能会出现Out-Of-Gas报错。因为私链实现了一种预编译合约,合约要在收到第一个消息后才会真正存在(虽然他们的合约代码是硬编码的)。而向一个不存在的合约发送消息,所以才会导致Out-Of-Gas的问题。一种解决办法(workaround)是每个在你真正使用它们之前先发送1 wei到这些合约上来完成初始化。在官方和测试链上没有这个问题。

地址相关

  •  

    .balance (uint256):
    Address的余额,以wei为单位。

     

  •  

    .transfer(uint256 amount):
    发送给定数量的ether到某个地址,以wei为单位。失败时抛出异常。

     

  •  

    .send(uint256 amount) returns (bool):
    发送给定数量的ether到某个地址,以wei为单位, 失败时返回false。

     

  •  

    .call(…) returns (bool):
    发起底层的call调用。失败时返回false。

     

  •  

    .callcode(…) returns (bool):
    发起底层的callcode调用,失败时返回false。
    不鼓励使用,未来可能会移除。

     

  •  

    .delegatecall(…) returns (bool):
    发起底层的delegatecall调用,失败时返回false

     

更多信息参考地址篇

警告:send() 执行有一些风险:如果调用栈的深度超过1024或gas耗光,交易都会失败。因此,为了保证安全,必须检查send的返回值,如果交易失败,会回退以太币。如果用transfer会更好。

合约相关

  • this(当前合约的类型):
    表示当前合约,可以显式的转换为Address
  • selfdestruct(address recipient):
    销毁当前合约,并把它所有资金发送到给定的地址。
  • suicide(address recipient):
    selfdestruct的别名

另外,当前合约里的所有函数均可支持调用,包括当前函数本身。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Solidity API 的相关文章

  • 智能合约(一)————智能合约入门

    1 智能合约的基本组成 1 1 程序版本 1 2 合约声明 1 3 状态变量 1 4 合约方法 在这里constant相当于他声明这个局部变量不能更改 但是他并没有实际作用 实际就只是警示作用 2 地址adress address bala
  • conflux.web3j.RpcException:data = “\“network prefix inconsistent in from(net999) and to(cfxtest)\““

    java conflux sdk报错 SLF4J Failed to load class org slf4j impl StaticLoggerBinder SLF4J Defaulting to no operation NOP log
  • 区块链职业培训任重道远,四个方向可入行

    作者 赛联区块链教育 张群 区块链已经来到世界14年了 中国成为重大战略也三年了 这两年区块链产业发展十分迅猛 以北京 杭州 上海 深圳 重庆 成都为代表的的区块链产业迅速崛起 成为中国区块链发展的领军者 由于在教育圈的原因 最近几年和区块
  • Sui流动性质押黑客松|本周Workshop预告

    Sui流动性质押黑客松正在如火如荼的报名中 Sui基金会现诚邀全球开发者前来参与 助力资产再流通 了解黑客松详情 Sui流动性质押黑客松开启报名 赢取千万美金质押和奖励 黑客松官网 Sui Liquid Staking Hackathon
  • Web3 用例全解析:传统品牌加速进入 Web3 的原因?

    Web3 有能力彻底改变品牌和客户相互联系的方式 许多品牌已经在尝试使用 NFT 和元宇宙来提高品牌知名度和消费者忠诚度 这是传统社交媒体和电子商务渠道根本无法做到的 NIKE Panini 和 Vodafone nbsp 是最早认识到 N
  • 以太坊的企业系统集成

    最流行的开源Java集成库 Apache Camel现在支持以太坊的JSON RPC API 以太坊生态系统 以太坊是一个开源 公共 区块链平台 用于运行智能合约 它提供了一个去中心化的图灵完备虚拟机 可以执行脚本和加密货币 用于补偿参与者
  • 区块链技术关键词

    区块链技术 区块链是一种分布式账本技术 通过将数据以区块的形式依次链接在一起 并使用密码学技术保证安全性和一致性 加密货币 加密货币是基于区块链技术的数字资产 例如比特币 Bitcoin 和以太坊 Ethereum 等 它们使用区块链来记录
  • 智能合约之短地址攻击

    在了解以太坊智能合约短地址攻击之前 先要简单了解一下以太坊代币ERC 20 TOKEN 的一些基础知识 ERC EthereumRequest for Comment 即以太坊通用征求意见协议 开发者可以通过提交EIP Ethereum I
  • 莱昂哈德·欧拉生平及其成就简介

    莱昂哈德 欧拉 Leonhard Euler 1707年4月15日 1783年9月18日 瑞士数学家 自然科学家 1707年4月15日出生于瑞士的巴塞尔 1783年9月18日于俄国圣彼得堡去世 欧拉出生于牧师家庭 自幼受父亲的影响 13岁时
  • 带你玩转以太坊智能合约的”Hello World“

    学习目标 使用solidity语言撰写智能合约 开发前的准备 Ubuntu环境下Atom编辑器安装及使用 安装所需工具 安装nvm 安装node 安装npm 启动testrpc 建立项目 目录结构 新建HelloWorld合约 代码说明 编
  • 使用Go语言和以太坊智能合约交互

    尽管最近遇到了些麻烦 但以太坊仍然是区块链领域内智能合约的最大参与者 这似乎不会很快改变 在我看来 技术本身具有很大的潜力 是从学术的角度看很有意思 但正如上面提到的问题和之前的许多问题是区块链技术方面的 智能合约 特别是具有Solidit
  • CROSS使用说明书 发行和拍卖NFT完整攻略

    鉴于目前去中心化NFT发行和拍卖平台CROSS是英文版本 对部分中国区用户存在操作困难 为了方便投资者和NFT爱好者能及时了解CROSS的相关信息和使用流程 现在CyberVein推出了更加详细的CROSS完整版教程 若还存有疑问 可添加中
  • stop容器

    docker ps 查看所有正在运行容器 docker stop containerId containerId 是容器的ID docker ps a 查看所有容器 docker ps a q 查看所有容器ID docker stop do
  • 以太坊如何通过构建智能合约来销售商品?

    如何通过构建以太坊智能合约来销售商品 这是个问题 毫无疑问 比特币已经改变了我们看待和理解什么是金钱 价值以及最近由智能合约产生的所有权的方式 这很有趣 因为几乎每个人都听说过它或加密货币 来自许多业务领域的人 不仅仅是我们 IT工作者 在
  • 【收藏向】一文弄懂什么是ERC20

    本文只做技术探讨 谨防数字加密货币炒作风险 Token Token 即通证 是以数字形式存在的权益凭证 它代表的是一种权利 一种固有和内在的价值 货币 积分 股票等权益证明 都可以由通证来代表 它代表着数字资产 下图就是在 opensea
  • 【元宇宙】智能手机万岁

    凭借出色的新设备 我们很快就能进人元字宙 想象这样的情景是很趣的 但是 至少到21世纪20年代 元宇宙时代的大多数设备很可能是我们已经在使用的设备 AR 和 VR 设备不仅面临重大的技术 财务和体验障碍 而且它们在上市后同样会面临币场反响冷
  • 物联网、区块链、元宇宙和虚拟数字人离普罗大众有多远?

    首先 我们最早理解的数字人就是数字虚拟的一个假人 可能看起来很像二次元玩偶的样子 今天我觉得数字人是一种虚拟的数字身份 无所谓你的形象是仿真或是任何形象 包括你在现实中无法实现的形象 你在梦想中所渴望的概念 无论它是什么样的 它是你在另外一
  • 使用 sCrypt 实现数独游戏合约

    我们在 BSV 区块链上实现了一个数独游戏智能合约 利用之前介绍过的一种合约范式可以将游戏中寻找解题方案的过程外包上链 因为求解数独问题的计算工作量会随着其行列数快速增长 实际上它也是一个 NP 完全 问题 不过我们可以借由 sCrypt
  • 在 BSV 上构建机器学习竞赛市场

    我们提出了一种在 BSV 上实现去中心化机器学习 ML 市场的新方法 任何人都可以通过发布附带奖励的智能合约来外包机器学习任务 任何提交表现最佳模型的人都将通过区块链交易获得奖励 而无需通过中心化机构 如何在 BSV 上进行机器学习竞赛 K
  • 浅谈以太坊智能合约的设计模式与升级方法

    浅谈以太坊智能合约的设计模式与升级方法 1 最佳实践 2 实用设计案例 2 1 控制器合约与数据合约 1 gt 1 2 2 控制器合约与数据合约 1 gt N 2 3 控制器合约与数据合约 N gt 1 2 4 控制器合约与数据合约 N g

随机推荐

  • 最新uniapp大佬级应用整理,谁说uniapp做不出好东西是小儿科

    最近经济 就业都不太好 在家躺平各位i兄弟看过来了 大佬从不抱怨环境 给大家整理几款uniapp神级作品 1 舒尔他方格听说过吧 可以锻炼思维和反应速度 免费开源要不要 下载地址 https ext dcloud net cn plugin
  • ARM DS5调试记录(1)安装&调试介绍

    一 安装说明 说明 安装文档已经把相应的细节介绍得很清楚了 这里主要是就之前安装遇到的问题和解决办法进行记录 1 安装虚拟网卡时 出现 系统资源不足 无法满足所需的服务 目前没有太好的解决办法 我是通过系统还原解决的 后面 有更好的解决办法
  • Arduino(三)——按钮控制数码管

    本节 我们学习一下内容 1 用按键控制数码管从1 9显示 然后再清零 2 外部中断函数 1 我们先来看下面的图 我们需要根据我们按键是否连通来连接我们的电路 所以我们连接好后就会是这样的 看完了连接图 接下来就要看我们的任务了 也就是让数码
  • 通达信公式破解

    通达信公式破解 通达信股票公式的导入方法 http blog sina com cn s blog 7f809c880102vk1n html 1 你下载到公式文件 XXXXX tne 后 保存或复制一份到桌面 或 我的文档 或你喜欢存放的
  • 控制工程学习4

    一 一阶系统的单位阶跃响应 单位跃阶 a起决定作用 在单位跃阶中时间常数t 等于a分之一的时候x 0 63 时间常数为系统特有 在稳定时间即4倍时间常数则等于0 98 二 非零初始条件下的传递函数 当t 0时即x 0 输入有两项为u s 和
  • 2024秋招海康威视前端笔试大题笔经

    文章目录 杂谈 大题及大致解析 论述题 1 html和htmls的区别 2 什么是深拷贝 什么是浅拷贝 如何实现 编程题 1 大人小孩排队 2 数组内是否存在 nums i nums j t 且 i j k 杂谈 考得不是很难 一开始进去会
  • C++的类模板

    1 类模板基本语法 template
  • 麒麟V10系统安装教程

    1 准备麒麟V10镜像 第一种方法 访问麒麟官网 https www kylinos cn scheme desktop 2 htmlhttps www kylinos cn scheme desktop 2 html点击申请使用 填写个人
  • Python:字典嵌套字典的数据类型,如何取出字典外部以及层级嵌套字典的键值对

    思路整理 1 循环遍历取出外层的 key 和 value 的值 2 判断遍历后的 value 数据类型是否为 字典 dict 3 if true 则再次循环遍历取出 key 和 value 的值 代码实现 coding utf 8 Time
  • 小程序navigateTo与redirectTo,跳转页面报错:fail webview count limit exceed

    前言 小程序中涉及跳转页面报错 fail webview count limit exceed 目录 报错信息 报错原因 官方介绍navigateTo 解决方法 官方介绍redirectTo 报错信息 报错原因 官方介绍navigateTo
  • 一图看懂 openai 模块:ChatGPT的API python库, 资料整理+笔记(大全)

    本文由 大侠 AhcaoZhu 原创 转载请声明 链接 https blog csdn net Ahcao2008 一图看懂 openai 模块 ChatGPT的API python库 资料整理 笔记 大全 摘要 模块图 类关系图 结束 摘
  • WebRTC 开发实践:为什么你需要 SFU 服务器

    转自 https blog 51cto com ticktick 2349113 当你入门 WebRTC 之后 很快就会接触到一个名词 叫做 SFU 你可能很容易就在网上寻找到很多 SFU 的开源实现 并并兴致勃勃地开始编译 部署和测试这些
  • 傻瓜式Hadoop 集群部署

    傻瓜式Hadoop集群部署 资料来自网上并经过本人整理 Hadoop编译篇 一 Hadoop下载 1 在Hadoop官网上下载hadoop 2 7 2的源码包 下载地址 http mirrors noc im apache hadoop c
  • navicat12创建sqlserver用户以及设置用户权限

    1 选中数据库 点用户 新建登录 2 输入登录用户名 设置密码 确认密码 选择默认数据库 设置好后保存 3 上两步就创建好了一个用户 接下来创建用户的权限 打开数据库 点用户 点数据库角色 分配权限页面就可以给具体的数据表分配增删改查权限了
  • (Struts2学习篇) Struts2文件处理之文件下载

    以下是在Struts2中下载文件时 相关DownloadAction的配置信息
  • NFL(没有免费的午餐)

    NFL 没有免费的午餐 周志华 机器学习 1 诠释 NFL全称 No Free Lunch Theorem 意思是 所有的学习算法的期望性能是相同的 NFL的前提是 所有 问题出现的机会相同 或所有的问题同等重要 NFL的寓意是 让我们清楚
  • 网地址和广播地址的计算

    如何计算网络地址和广播地址 如果一个IP地址为132 119 100 200的子网掩码是255 255 255 240 那么他的网络地址和广播地址是多少 首先简单介绍一个10进制和2进制的转换方法 我们可以在纸上分别从后向前从1开始 写一个
  • C语言实现在字符串中替换指定的字符串

    include
  • 【大数据采集技术与应用】【第一章】【大数据采集技术与应用概述】

    文章目录 1 1 大数据概述 1 1 1 大数据时代 1 1 2 大数据的概念 1 1 3 大数据的特征 1 1 4 大数据的应用 1 1 5 大数据关键技术 1 1 6 大数据处理流程 1 2 大数据采集技术概述 1 2 1 数据采集与大
  • Solidity API

    这是Solidity教程系列文章第8篇介绍Solidity API 它们主要表现为内置的特殊的变量及函数 存在于全局命名空间里 Solidity 系列完整的文章列表请查看分类 Solidity 写在前面 Solidity 是以太坊智能合约编