千家信息网

Solidity API怎么使用

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要讲解了"Solidity API怎么使用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Solidity API怎么使用"吧!区块和交易的属
千家信息网最后更新 2025年02月02日Solidity API怎么使用

这篇文章主要讲解了"Solidity API怎么使用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Solidity API怎么使用"吧!

区块和交易的属性(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表达如下:

    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)意思是说参数不会补位,是直接连接在一起的,下面几个是相等的。

keccak256("ab", "c")keccak256("abc")keccak256(0x616263)  // hexkeccak256(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的别名

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

感谢各位的阅读,以上就是"Solidity API怎么使用"的内容了,经过本文的学习后,相信大家对Solidity API怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

合约 区块 地址 函数 参数 数据 交易 单位 时间 错误 支持 别名 底层 消息 矿工 结果 问题 以太 学习 信息 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库导出excel 什么事大数据大数据库 同上一节网络安全课感想 计算机三级网络技术涉及内容 数据库中数据类型可以分为哪两类 武汉博古通今网络技术工作室 达梦数据库登录不存在的用户 数据库安装成本地服务是怎么回事 抖音弹幕软件开发 windows服务器端访问许可 网络安全需要的五个技能 网络安全成就展播 电子科大网络安全宣传周 大学生网络安全教育论文结尾 运动跟踪软件导出数据库 网络安全意义的演讲稿 游戏软件开发客户 手机信号显示服务器错误 莒南软件开发入门教程哪个好 关系数据库的基本数据结构是什么 企业无线网络安全方案 旭亚七客互联网科技有限公司 mac软件开发平台 数据库多关键字怎么找 珠海鸿鸿软件开发 在职消防救援人员子女信息数据库 微信语音提示不能连接到服务器 数据库中物理数据独立是指 多媒体控制软件开发教学 南网技师网络安全答辩
0