变量
- 状态变量(在函数之外声明的变量)默认为
storage
形式,并永久写入区块链。 - 默认的函数参数,包括返回的参数,是
memory
类型。 - 默认的局部变量,是
storage
类型。
在以太坊上,storage必须是静态分配存储空间。 局部变量虽然是一个storage的,但它仅仅是一个storage类型的指针。 如果将memory变量赋值给storage局部变量,会产生编译错误。
- 将memory赋值给状态变量,实际是做了一个内存拷贝。
- memory变量之间是引用传递,不会拷贝数据。
使用安全运算库
using SafeMath for uint256;
require 可返回 reason data
require(msg.sender == owner, ‘not authorized’);
目前 remix, ganache 和truffle的新版本v5.0(beta) 可以显示返回的 reason data
address相关全局函数(合约内转eth相关)
-
.balance()
: 该地址有多少以太坊余额(wei为单位) -
.transfer(uint256 amount)
: 发送特定数量(wei为单位)的以太坊到对应地址,当出现错误时会扔出异常,但不会因异常而停止。固定需要耗费2300个gas。 -
.send(uint256 amount) returns (bool)
: 发送特定数量(wei为单位)的以太坊到对应地址,当出现错误时会返回flase。固定需要耗费2300个gas。【警告】send() 执行有一些风险:如果调用栈的深度超过1024或gas耗光,交易都会失败。因此,为了保证安全,必须检查send的返回值,如果交易失败,会回退以太币。如果用transfer会更好。
-
.call.value(uint256 amount)(...)
: 发送特定数量(wei为单位)的以太坊到对应地址 -
.call(...) returns (bool)
: CALL的低级调用函数,当失败时返回false。执行需要消耗不固定的gas。【说明】不鼓励使用call函数,后期将会被移除。调用该函数可能造成安全攻击
-
.callcode(...) returns (bool)
: CALLCODE的低级调用函数,当失败时返回false。执行需要消耗不固定的gas。不建议使用,后续版本会删除。
-
.delegatecall(...) returns (bool)
: DELEGATECALL的低级调用函数,当失败时返回false。执行需要消耗不固定的gas。【说明】为了和非ABI协议的合约进行交互,可以使用call() 函数, 它用来向另一个合约发送原始数据,支持任何类型任意数量的参数,每个参数会按规则(ABI协议)打包成32字节并一一拼接到一起。一个例外是:如果第一个参数恰好4个字节,在这种情况下,会被认为根据ABI协议定义的函数器指定的函数签名而直接使用。如果仅想发送消息体,需要避免第一个参数是4个字节。如下面的例子:
function callfunc(address addr) returns (bool){ bytes4 methodId = bytes4(keccak256("setScore(uint256)")); return addr.call(methodId, 100); }