智能合约part4:小知识点

Posted by 孔剑敏 on October 9, 2019

这里分享我在学智能合约时笔记中的小知识点部分,自己记的时候比较混乱,我在这里进行重新规整。

1.转账: 首先如何转账应该是大多数初学者会遇到的第一个小困难(起码我是这样),因为刚接触智能合约,一时间无法转变之前学的语言和合约的区别。以太坊有账户概念,转账也 是账户与账户(实际可以归为账户对应的地址),这点如果类比银行账户之间转账会更好理解一些。 而以太坊的账户是由四部分组成的: ①随机数:用于确定每笔交易只能被处理一次的计数器,它会参与生成交易的id。 ②账户目前的以太币余额:以太币(Ether)用于支付交易费用。 ③账户合约代码(也可以没有) ④账户的存储(默认为空) 从发送者的账户转账到接收者账户。如果接收账户还不存在,会创建此账户。如果接收账户是一个合约,会运行合约的代码,直到代码运行结束或者gas用完。

从代码角度现在常用的有:①直接转账:msg.value ②transfer转账:address(to).transfer(value)其中from就是执行的账户地址 注:call已经几乎不用了,因为它并不安全,当gas不够时,用call的交易转账仍会成功,而transfer在gas不足时会回滚。

2.状态变量: 合约中必定需要状态变量存储一些信息,如:

int public _age;
string public _name;

而_age和_name就属于状态变量。它默认是internal类型,internal类型的状态变量可供外部和子合约调用。public类型的状态变量和函数的权限最大,可供外部、子合约、合约内部访问。当一个状态变量的权限为public类型时,它就会自动生成一个可供外部调用的get函数(这点非常好,可以省下很多代码)。

3.函数: 用function表示,默认是public类型,只有public类型的函数才可以供外部访问。internal类型的函数和private类型的函数一样,智能合约自己内部调用。

4.payable关键字: 在最新的0.5.0大版本中,所有有以太币转移的函数都要有payable关键字,这点必须注意,否则你的合约所有转账都不能成功。

5.msg.sender: 它是全局变量,可以被所有函数调用,它指的是当前调用者(或智能合约)的address。当部署合约时,msg.sender是合约的所有者,如果合约中定义了一个名为“owner”的变量,则可以为其分配值(地址)。常用的代码:address owner = msg.sender 。此时,变量“owner”将始终具有最初部署合约的人的地址,意味着是合约的所有者。分析这样一行合约代码:owner.transfer(msg.value),这里如果调用了回退函数(fallback函数),那么msg.value将在owner的地址传输。(实现形式是只允许第一次也就是合约创建时才能调用,之后都无法被调用,所以可以一直保持创建者的地址)。

6.Constant关键字: 当执行函数时不会去修改区块中的数据状态时,那么这个函数就可以被声明成constant(注:目前Constant=view)的,比如说getter类的方法。在Solidity中constant,view,pure三个函数修饰词的作用是告诉编译器,函数不改变/不读取状态变量,这样函数执行就可以不消耗gas了(是完全不消耗!),为什么?因为不需要矿工来验证。在0.4.17之前,只有constant,后来有人嫌constant这个词本身代表变量中的常量,不适合用来修饰函数,所以将constant拆成了view和pure。view的作用和constant一模一样,可以读取状态变量但是不能改;pure则更为严格,pure修饰的函数不能改也不能读状态变量,否则编译通不过。

关于这些写合约的实用知识点会持续更新,未完待续———————————————-