《solidity学习笔记》chapter 3-solidity其他知识

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 合约:

  1. 合约创建,运行构造函数,将合约所有人限定为msg.sender,也就是部署合约的人。
  2. 增加修饰符 onlyowner,限制陌生人的访问,将访问某些函数的权限锁定在 owner上。
  3. 有函数可以将合约所有权转让给他人。


节省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

时间: 2024-08-03 11:45:51

《solidity学习笔记》chapter 3-solidity其他知识的相关文章

《solidity学习笔记》chapter 2-solidity基础知识

映射 映射本质上是存储和查找数据所用的键-值对. mapping (uint => string) intToStr; 地址 以太坊区块链由 account (账户)组成,你可以把它想象成银行账户.一个帐户的余额是 以太 (在以太坊区块链上使用的币种),你可以和其他帐户之间支付和接受以太币,就像你的银行帐户可以电汇资金到其他银行帐户一样.每个帐户都有一个"地址",你可以把它想象成银行账号.这是账户唯一的标识符. mapping (address => uint )publi

最大熵学习笔记(一)预备知识

  生活中我们经常听到人们说"不要把鸡蛋放到一个篮子里",这样可以降低风险.深究一下,这是为什么呢?其实,这里边包含了所谓的最大熵原理(The Maximum Entropy Principle).本文为一则读书笔记,将对最大熵原理以及由此导出的最大熵模型进行介绍,重点给出其中所涉及数学公式的理解和详细推导. 相关链接 最大熵学习笔记(零)目录和引言 最大熵学习笔记(一)预备知识 最大熵学习笔记(二)最大熵原理 最大熵学习笔记(三)最大熵模型 最大熵学习笔记(四)模型求解 最大熵学习笔

加壳学习笔记(一)-基础知识

1.预备知识 1.关于栈,在windows里面的堆栈其实很简单,当学了才知道哈,呵呵,第一要记住的是windows里面的栈是向低地址生长的(extended,延伸,呵呵,顺便丰富下英语的单词量,确实是少的可怜),你可以这样认为,栈就像是一个倒立的箱子,箱子的口子是向下的,底是向上的,这里就表明了系统栈的分布也是延伸方向是由高地址向低地址extended,在最初的空栈阶段,栈顶(extended stack pointer,简称是esp)在栈底的低一个位置,呵呵,其实很好理解,就是说最初的箱子是空

汇编入门学习笔记 (一)—— 基础知识、寄存器

疯狂的暑假学习之  汇编入门学习笔记 (一) 参考:<汇编语言> 王爽  第一,二章 一.基础知识 1. 用汇编语言编写程序的工作过程 汇编本质就是为了方便程序员,把二进制代码用汇编指令来表示 汇编指令---------------->  编译器  ---------------->机器码----------------> 计算机执行 mov ax, bx                                                          100

神经网络与深度学习笔记 Chapter 1.

微小的输入变化导致微小的输出变化,这种特性将会使得学习称为可能.但是在存在感知器的网络中,这是不可能的.有可能权重或偏置(bias)的微小改变将导致感知器输出的跳跃(从0到1),从而导致此感知器后面的网络以一种难以理解的方式发生巨大的改变.解决这一问题就要使用另外一种人工神经元-sigmoid神经元(也叫逻辑神经元). sigmoid神经元的输入不只是0或1,而且可以取[0,1]中的任何值,每一个输入有一个对应的权重.与此同时,输出也不再单纯为0或1,而是变为 σ(w?x+b).其中: 为sig

神经网络与深度学习笔记 Chapter 6之卷积神经网络

深度学习 Introducing convolutional networks:卷积神经网络介绍 卷积神经网络中有三个基本的概念:局部感受野(local receptive fields), 共享权重( shared weights), 混合( pooling). 与前面的神经网络不同,在这里我们用下图中的矩阵来表示输入神经元. 在cnn中,输入层的一个区域(例如,5 * 5)对应下一层隐含层中的一个神经元,这个区域就是一个局部感受野.如下图所示: 通过在输入矩阵中滑动局部感受野来对应隐含层中的

《C++ Primer Plus》学习笔记 第1章 预备知识

第一章 预备知识C++在C语言的基础上添加了对"面向对象编程"的支持和对"泛型编程"的支持.类 —— 面向对象模板 —— 泛型编程1.1 C++简介1.2 C++简史1.3 可移植性和标准1.4 程序创建的技巧http://www.cnblogs.com/moonlightpoet/p/5611668.html1.5 总结

C#学习笔记----栈与堆的知识

http://my.oschina.net/lichaoqiang/blog/291906 当我们对.NET Framework的一些基本面了解之后,实际上,还是很有必要了解一些更底层的知识.比如.NET Framework是如何进行内存管理的,是如何垃圾回收的......这样,我们才能写出更高性能的程序. 在.NET Framework中,有2个地方帮我们保存管理数据:一个是"堆",也叫"托管堆",由.NET Framework的垃圾收集器(Garbage Col

3D Game Programming withDX11 学习笔记(一) 数学知识总结

在图形学中,数学是不可或缺的一部分,所以本书最开始的部分就是数学知识的复习.在图形学中,最常用的是矢量和矩阵,所以我根据前面三个章节的数学知识,总结一下数学知识. 一.矢量 数学中的矢量,拥有方向和长度.其实矢量和点在坐标系中的表示完全一致(笛卡尔坐标系为准),区分矢量和点的关键,我觉得就是做平移.点是不能用平移操作来保证一致的,比如点A(1,2,3)经过平移矢量(1,2,3)后就是B(2,4,6),此时就是一个新的点.但是矢量经过相同平移操作后,还是矢量(1,2,3),这是因为矢量表示的是 v