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
通过函数来访问低层接口的记录机制log0
,log1
,log2
,log3
和log4
。 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)}