ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

以太坊智能合约开发:solidity精简速成版

2022-03-20 15:34:03  阅读:297  来源: 互联网

标签:function 函数 以太 solidity 速成 uint address 合约 public


提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

以太坊智能合约开发:solidity精简速成版


一、相关概念

  1. 以太坊:以太坊是一个分布式的平台,可以运行智能合约,应用程序按照既定的程序运行,不会出现停机、审查、欺诈或第三方干扰的可能性。一句话总结就是,以太坊就是一个基于区块链的智能合约平台。
  2. 智能合约:是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由Nick Szabo首次提出。
  3. 燃料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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有