在创建智能合约时,会执行一次构造函数(与智能合约同名的函数)。该构造函数是可选的,但只允许有一个构造函数,也就是不支持重载。
初始化合约的owner
地址:
- address owner; // 定义owner变量
- bytes32 name; //定义合约创建者名字
-
- // 构造函数
- function OwnerToken(bytes32 _name) public {
- owner = msg.sender; // 在部署合约的时候,将owner设置为部署者的地址
- name = _name;
- }
函数和状态变量有4种可见性类型,分别为external、public、internal和private
对于所有public的状态变量,Solidity编译器提供了自动状态变量生成对应的gatter(访问器)的特性。gatter函数的可见性是external的,如果从内部访问getter(即没有this),他相当于一个状态变量。如果它是外部访问的(即用this),它被认为是一个函数。
- contract C{
- uint public data;
- function d() public{
- data = 10; //内部访问
- uint val = this.data();//外部访问
- }
- }
修饰器的关键字是modifier。modifier
的可以改变函数的行为,也可以在运行函数前的自动检查某个条件,例如地址,变量,余额等。下面是使用函数修饰器的列子
1. 定义一个叫做onlyOwner
的modifier
:
- // 定义modifier
- modifier onlyOwner {
- require(msg.sender == owner); // 检查调用者是否为owner地址
- _; // 如果是的话,继续运行函数主体;否则报错并revert交易
- }
2. 带有onlyOwner
修饰符的函数只能被owner
地址调用 :
- function changeOwner(address _newOwner) external onlyOwner{
- owner = _newOwner; // 只有owner地址运行这个函数,并改变owner
- }
如果同一个函数有多个修饰器,它们之间用空格隔开,修饰器会被依次检查执行。修饰器或函数体中显式return语句仅仅跳出当前的修饰器和函数体。整个执行逻辑会从前一个修饰器中定义的“_”之后继续执行。