本文首发于深刻浅出区块链社区 原文连接:智能合约语言 Solidity 教程系列8 - Solidity API原文已更新,请读者前往原文阅读javascript
这是Solidity教程系列文章第8篇介绍Solidity API,它们主要表现为内置的特殊的变量及函数,存在于全局命名空间里。html
Solidity 系列完整的文章列表请查看分类-Solidity。java
Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解, 若是你还不了解,建议你先看以太坊是什么web
欢迎订阅区块链技术专栏阅读更全面的分析文章。编程
Solidity API 主要表现为Solidity 内置的特殊的变量及函数,他们存在于全局命名空间里,主要分为如下几类:api
下面详细讲解下安全
用来提供一些区块链当前的信息。编程语言
注意: msg的全部成员值,如msg.sender,msg.value的值能够由于每一次外部函数调用,或库函数调用发生变化(由于msg就是和调用相关的全局变量)。ide
不该该依据 block.timestamp, now 和 block.blockhash来产生一个随机数(除非你确实须要这样作),这几个值在必定程度上被矿工影响(好比在赌合约里,不诚实的矿工可能会重试去选择一个对本身有利的hash)。函数
对于同一个链上连续的区块来讲,当前区块的时间戳(timestamp)老是会大于上一个区块的时间戳。
为了可扩展性的缘由,你只能查最近256个块,全部其它的将返回0.
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
订阅区块链技术专栏能够参考到完整的使用例子。
<!-- [例子](https://ethereum.stackexchange.com/questions/1777/workflow-on-signing-a-string-with-private-key-followed-by-signature-verificatio): -->
紧密打包参数(tightly packed)意思是说参数不会补位,是直接链接在一块儿的,下面几个是相等的。
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到这些合约上来完成初始化。在官方和测试链上没有这个问题。
<address>.balance (uint256):
Address的余额,以wei为单位。
<address>.transfer(uint256 amount):
发送给定数量的ether到某个地址,以wei为单位。失败时抛出异常。
<address>.send(uint256 amount) returns (bool):
发送给定数量的ether到某个地址,以wei为单位, 失败时返回false。
<address>.call(...) returns (bool):
发起底层的call调用。失败时返回false。
<address>.callcode(...) returns (bool):
发起底层的callcode调用,失败时返回false。 不鼓励使用,将来可能会移除。
<address>.delegatecall(...) returns (bool):
发起底层的delegatecall调用,失败时返回false
更多信息参考地址篇。
警告:send() 执行有一些风险:若是调用栈的深度超过1024或gas耗光,交易都会失败。所以,为了保证安全,必须检查send的返回值,若是交易失败,会回退以太币。若是用transfer会更好。
另外,当前合约里的全部函数都可支持调用,包括当前函数自己。
咱们也推出了目前市面上最全的视频教程:深刻详解以太坊智能合约语言Solidity 目前咱们也在招募课程体验师,能够点击连接了解。
☛ 深刻浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。
☛ 个人知识星球为各位解答区块链技术问题,欢迎加入讨论。
☛ 关注公众号“深刻浅出区块链技术”第一时间获取区块链技术信息。