以太坊智能合约开发:solidity精简速成版
作者:互联网
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
以太坊智能合约开发:solidity精简速成版
一、相关概念
- 以太坊:以太坊是一个分布式的平台,可以运行智能合约,应用程序按照既定的程序运行,不会出现停机、审查、欺诈或第三方干扰的可能性。一句话总结就是,以太坊就是一个基于区块链的智能合约平台。
- 智能合约:是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由Nick Szabo首次提出。
- 燃料gas:部署智能合约在以太网络中需要消耗一定的燃料(gas),gas需要用以太币进行兑换。
二、solidity编程基础
(1)引入其他源文件:①import “./filename.sol”; ②import * as symbol from “filename”;
(2)函数:function A{…}。
(3)合约:contract A{…}。
(4)接口:interface A{…}(接口只定义行为,没有实现)。
(5)库:library A{}(库没有fallback函数和payable关键字,不能定义storage变量)
(6)构造函数:constructor () public{manager = msg.sender; }
其他声明方法function()public{…}和function[与合约同名]{…}
(7)事件(event):
event Sent(address From, address To, uint Amount);//声明事件 Sent,用来记录转账过程
Function sent(address _From, address _To, uint _Amount){
emit sent(_From, _To,_Amount);
}
事件和日志的主要用途:
- 智能合约返回值给用户接口:从智能合约返回值给app前端
- 异步带数据的触发器
- 一种比较便宜的存储
(8)值变量:
- 布尔型(bool):值为false和true。(在solidity中1并不代表true)
- 整型(uint和int):无符号整型(uint)和有符号整型(int)。
- 地址:以太坊地址address。Addr.balance属性查看地址余额,addr.transfer属性向该地址发送以太币
- 定长字节数组:bytes1,bytes2,bytes3…bytes32。
- 枚举类型:enums。
(9)引用类型:
- 不定长字节数组:byte[]
- 字符串:string。
- 数组:
- 结构体:struct A{…}。
(10)字典映射:
字典是一种Key/Value对,通过映射(mapping)定义。映射本质上是存储和查找数据所用的键值对,类似于可以用任意类型表示下标的数组,mapping( Key=>Value)表示这个映射可以用Key类型作为下标,同时存储的值是Value类型。如: mapping (address => uint) public balance;(其中address是键的数据类型,uint是值的数据类型。可以用balance[x]获取uint类型的值,其中x是address类型)。
mapping (address => uint) public balances;
function reward (address receiver,uint amount) public {
balances[receiver] += amount;
//balances[receiver]中,receiver是接收者的地址balances[receiver]是receiver这个地址中的余额。
}
(11)函数定义以及修饰符
函数定义:function <函数名> ([<输入参数类型1> <输入参数名1>],…) [internal(默认)|external] [pure|constant|view|payable] [returns([<返回参数类型1> <返回参数名1>],…)] {…}
- Internal和external
Internal声明的函数和状态变量只能通过内部访问(在当前合约调用或继承的合约内调用)。External声明的函数是外部函数,是合约接口的一部分,可以从其他合约或通过交易发起调用(通过this.f()调用)。 - Public和private
Public修饰公开函数,是合约接口的一部分,可以通过内部或通过交易来发起调用。 对于public类型的状态变量,会自动创建一个访问器。
Private修饰的私有函数和状态变量仅在当前合约中可以访问,在继承的合约内不可访问 - Constant,View和Pure
constant修饰的函数没有能力改变区块链上的状态变量,但可以读取状态变量并返回给调用者。View相当于constant,声明的函数不能改变状态变量。Pure修饰的函数既不更改也不读取状态变量。 - Payable修饰符
一个函数声明为Payable,它就只能收取ether。
注:
① Internal内部可见,即当前合约和继承合约;external只能外部可见;public在外部和内部均可见;private只能当前合约,不能在继承合约。
尽量使用internal,消耗gas最少,如果确定只能外部调用尽量使用external,public消耗gas最多。 - 自定义修饰符(modifier)
修饰符可以用来改变函数的行为,例如可以用来执行一个函数前检查一个条件。修饰符可以继承,而且可以被派生合约重载。
声明函数修饰器,将其加在函数中,在函数执行前进行判断,来检查调用者是否为学生本人,只有本人才能调用该函数:
modifier onlyOwner() {
require (msg.sender == owner,”only owner can call this function”);
_; //被onlyOwner声明的函数会被加到修饰定义里的_;之后执行。也就是说被声明的函数会在这里执行,否则就会引发异常调用
}
contract Mortal is owned{
function close() public onlyOwner{....} }
(12)数据位置Storage:可以被所有函数访问的全局变量。永久的存储,以太坊会把它存到公链环境里的每一个节点。消耗gas最多。
Memory:智能合约中的本地内存变量。它的声明周期很短,当函数执行结束后就被销毁了。消耗gas最少。
Calldate:所有函数调用的数据,包括参数的保存位置。
默认函数参数是memory,默认局部变量是storage;默认状态变量是storage。外部函数的参数被强制指定为calldate。
(13)继承:单继承contract A is B{…} | function A(…) B(…){…}
多重继承contract A is B{…} contract C is A,B{…}
(14)异常和错误处理:
Require函数:require (msg.sender == owner,”only owner can call this function”);
Revert函数:if(msg.sender != owner) revert(“only owner can call this function”);
通常与函数修饰器modifier一起用。
(15)常用全局变量:
msg.sender(address):消息发送者
(16)错误处理:
(17)结构体:struct A{…}
struct student{
string name;
uint256 age;
}
function init() returns (string,uint256){
student memory s = student("XXX",87);
student memory s2 = student({age:77,name:"SSS"});
return (s.name,s2.age);
}
标签:function,函数,以太,solidity,速成,uint,address,合约,public 来源: https://blog.csdn.net/weixin_44644635/article/details/123472821