以太坊系列 - 智能合约Solidity开发指南

变量

  • 状态变量(在函数之外声明的变量)默认为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);
    }
    
发布了69 篇原创文章 · 获赞 80 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wcc19840827/article/details/104763319