solidity高级特性

constructor

构造函数,使用constructor关键字声明的函数。创建合约时执行一次。

pragma solidity ^0.4.22;

contract OwnedToken {
    constructor(bytes32 _name) public {
        owner = msg.sender;
        creator = TokenCreator(msg.sender);
        name = _name;
    }
}    

visibility

  • external:外部函数是合约接口的一部分,这意味着可以从其他合约和交易中调用它们。外部函数f不能在内部调用(即f()不起作用,但this.f()有效)。当外部函数接收大量数据时,它们有时会更有效。
  • public:公共函数是合约接口的一部分,可以在内部调用,也可以通过消息调用。对于公共状态变量,会生成自动getter函数。
  • internal:这些函数和状态变量只能在内部访问(即从当前合约或从中获得的合约),而不使用this。
  • private:私有函数和状态变量仅对其定义的合约可见,而不是在派生合约中可见。

function

  • view:承诺不修改状态。
  • pure:纯函数,承诺不会读取或修改状态。
  • payable:为了接收ether,必须标记回退功能payable。最少需2300gas。

log

通过函数来访问低层接口的记录机制log0log1log2log3log4。 logi获取类型的参数,其中第一个参数将用于日志的数据部分,其他参数用作主题。上面的事件调用可以以与以下相同的方式执行i + 1bytes32

pragma solidity ^0.4.10;

contract C {
    function f() public payable {
        uint256 _id = 0x420042;
        log3(
            bytes32(msg.value),
            bytes32(0x50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb20),
            bytes32(uint256(msg.sender)),
            bytes32(_id)
        );
    }
}

event

event允许EMV写日志功能的方便使用,进而在dapp的用户接口中用JavaScript顺序调用,从而监听这些事件。
event是合约中可继承的成员。当他们调用时,会导致一些参数在交易日志上存储--在blockchain上的一种特殊的数据结构。

event -> emit -> watch

library

库和合约类似,但是它们的目的主要是在给定地址上部署,以及用EVM的CALLCODE特性来重用代码。这些代码是在调用合约的上下文里执行的,例如调用合约的指针和调用合约的存储能够被访问。由于library是一片独立的代码,如果它们显式地提供的话,就仅仅能访问到调用合约的状态变量。

interface

interface类似于抽象合约,但它们不能实现任何功能。还有其他限制:

  • 无法继承其他合约或接口。
  • 所有声明的函数必须是external的。
  • 无法定义构造函数。
  • 无法定义变量。
  • 无法定义结构。

interface基本上限于合约ABI可以表示的内容,并且ABI和interface之间的转换应该是可能的,而不会丢失任何信息。

pragma solidity ^0.4.11;

interface Token {
    function transfer(address recipient, uint amount) external;
}

modifier

memory、storage

assembly

Inline Assembly是一种以较低级别访问以太坊虚拟机的方法。

address _addr = msg.sender;
uint256 _codeLength;

// 检索code的size        
assembly {_codeLength := extcodesize(_addr)}

delete

if() throw;

你可能感兴趣的:(solidity高级特性)