Ownable contracts
OpenZeppelin Solidity库里的合约之一,可以通过继承使用。
/** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ function Ownable() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0)); OwnershipTransferred(owner, newOwner); owner = newOwner; } }
其中与合约同名的函数是合约的构造函数,在合约创建时运行一次之后不会再调用。
Ownable 合约:
- 合约创建,运行构造函数,将合约所有人限定为msg.sender,也就是部署合约的人。
- 增加修饰符 onlyowner,限制陌生人的访问,将访问某些函数的权限锁定在 owner上。
- 有函数可以将合约所有权转让给他人。
节省Gas的方式
一般情况下我们不用考虑像数据类型uint等的变种uint8等,因为solidity对这些类型都是当做uint看待的,但是有种情况下不一样,那就是struct中,我们可以通过将同类型的变量放在一起来节省空间,solidity会将这些同类型的打包在一起。
栗子:
struct aaaa{
uint a;
uint8 b;
uint8 c;
string d;
……;
}
我们还可以通过使用view来节省,因为在以太坊里每个写操作都会创建一个事务,view因为不需要写操作,我们可以通过这个结合函数修饰符(external)来使用,让操作只进行在本地节点,不消耗gas。
注意:如果一个 view
函数在另一个函数的内部被调用,而调用函数与 view
函数的不属于同一个合约,也会产生调用成本。这是因为如果主调函数在以太坊创建了一个事务,它仍然需要逐个节点去验证。
时间单位
Solidity 除了now之外,还包含秒(seconds)
,分钟(minutes)
,小时(hours)
,天(days)
,周(weeks)
和 年(years)
等时间单位。它们都会转换成对应的秒数放入 uint
中。
可支付
可支付也是一个修饰符,payable。用来表明这个函数调用是需要花费gas的。
function buyPDF() external payable{
require(msg.value == 0.01 ether);
transferPDF(msg.sender);
}
这其中我们可以使用this.balance获取合约获得的以太,并通过预定的函数传输到我们的以太地址。
《solidity学习笔记》chapter 3-solidity其他知识
原文地址:http://blog.51cto.com/11898766/2115235