solibity常用语法

引言

很久没写合约了,今天一写很多语法都忘记了,整理一下把

函数

语法描述
public公有,任何人(拥有以太坊账户的)都可以调用 牢记
private私有, 只有智能合约内部可以调用 牢记
external仅合约外部可以调用,合约内部需使用this调用 先忽略
internal仅合约内部和继承的合约可以调用 先忽略
view/constant函数会读取但是不会修改任何contract的状态变量 牢记
pure(纯净的)函数不使用任何智能合约的状态变量 牢记
payable调用函数需要付钱,钱付给了智能合约的账户 牢记
returns返回值函数声明中使用
  • 访问可见性
    public、private**
    修饰为public的状态变量会默认生成一个同名的public函数

状态变量默认是internal的(先理解为private即可)

pragma solidity ^0.4.24;contract  Test {//状态变量//类型不匹配时需要显示转换类型//返回值需要使用returns描述//public/private 可以修饰状态变量//状态变量默认是私有的uint256 public ui256 = 100;int8 private i10 = -10;//private 修饰的函数为私有的,只有合约内部可以调用function add() private view returns(uint256) {return ui256 + uint256(i10);}function isEqueal() public view returns(bool) {return ui256 == uint256(i10);}//Public修饰的函数为共有的,合约内外都可以调用function Add() public view returns(uint256){return add();}
}

view,constant,pure讲解

  • 如果一个函数里面,访问了状态变量,但是没有修改,我们使用view或者constant修饰。
  • 如果访问了状态变量,而且修改了,那么就不能constant和view,否则会报错,不修饰即可。
  • 如果没有使用过状态变量,我们要修饰为pure。
  • 如果你修饰为constant,但是你在函数中修改了,效果是:不会报错,正常执行,但是值不会改变。
pragma solidity ^0.4.24;contract test1 {int8 public i8 = 100; //成员变量就是状态变量int i256 = 256;//表示不会修改函数内的状态变量//为了明确语义,一般要加上constant(view两者完全相同)function add() private constant returns(int) {return i8 + i256;}//public 表示所有的人都可以看到的,而且可以调用//private表示所有人都可以看到,但是无法调用function mins() constant returns(uint256) {return  uint256(i256 - i8);}function isEqual(int a, int b) public pure returns(bool) {return a == b;}function setValue(int8 num) {i8 = num;}function setValue1(int8 num) constant {i8 = num;}
}

payable

  • 任何函数,只要修饰为payable,那么就可以在调用这个方法的时候,对value字段赋值,然后将价值value的钱转给合约。
  • 若这个函数没有指定payable,但是对value赋值了,那么本次调用会报错。
pragma solidity ^0.4.24;contract test1 {uint128 public num;//如果构造函数中未指定payable关键字,那么创建合约时不允许转账//如果指定了payable,则可以转账constructor() public  {}//任何函数,只要指定了payable关键字,这个合约就可以接受转账,调用时,也可以转0function giveMoney() public payable {}
}

构造函数
仅在部署合约时调用一次,完成对合约的初始化。可以在创建合约时转钱到合约

相当于go里面的init函数

  • 合约同名函数(已废弃)
  • constructor关键字修饰(推荐)

注意,所有在合约内的东西对外部的观察者来说都是可见,将某些东西标记为private仅仅阻止了其它合约来进行访问和修改,但并不能阻止其它人看到相关的信息。

- 匿名函数
用于转账
一个合约可以有且只有一个匿名函数,此函数不能有参数,也不能有任何返回值,当我们企图去执行一个合约上没有的函数时,那么合约就会执行这个匿名函数。

当合约在只收到以太币的时候,也会调用这个匿名函数,而且一般情况下会消耗很少的gas,所以当你接收到以太币后,想要执行一些操作的话,你尽可以把你想要的操作写到这个匿名函数里,因为这样做成本非常便宜。

//如果想向合约转账,在合约中添加如下函数即可
function() payable {//函数体什么都不填
}
  • 用于处理不存在的函数
  • 合约之间调用,非js调用
contract Test {function() { x = 1; }uint x;
}contract Caller {function callTest(address testAddress) {Test(testAddress).call('0xabcdefgh'); // hash does not exist// results in Test(testAddress).x becoming == 1.}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/785643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python怎么处理txt

导入文件处理模块 import os 检测路径是否存在,存在则返回True,不存在则返回False os.path.exists("demo.txt") 如果你要创建一个文件并要写入内容 #如果demo.txt文件存在则会覆盖,并且demo.txt文件里面的内容被清空,如…

机器人规划算法——基于A-star和CostMap膨胀地图的全局规划(附Github源码链接)

前言 这段时间,笔者用c++写了一套机器人局部避障算法,并工程落地,机器人可以正常避障,避障所采用的技术方案是A*+TEB算法。并取得一定成果,后续还要针对复杂的场景继续优化。主要涉及到技术模块有: (1) costmap:代价地图模块,分为静态层和障碍物层以及膨胀层,静态层将…

Machine Learning机器学习之文本分析的词法分析、句法分析、语义分析(详细讲解)

目录 前言 词法分析: 词义消歧: 句法分析: 语义分析: 文本分析应用 1、文本分类: 设计过程: 代码实现: 完整代码: 2、情感分析: 总结 博主介绍:✌专注于前后…

计算机网络中---基本概念

什么是计算机网络 计算机网络是指利用通信设备和传输媒体,将地理位置不同的多台计算机连接在一起,以实现信息、资源和数据的共享和交换的系统。换句话说,计算机网络是由多台计算机通过通信设备和通信线路相互连接,形成一个整体,使得连接在网络中的计算机可以彼此之间进行数…

【Go】四、包名、访问范围控制、标识符、运算符

文章目录 1、_2、包名3、命名大小影响可访问范围4、运算符5、获取终端输入 1、_ 下划线"_"本身在Go中是一个特殊的标识符,称为空标识符用于忽略某个值 1)忽略导入的没使用的包 2)忽略某个返回值 2、包名 main包是程序的入口包&a…

[C++11] Lambda表达式完整解析

说明:C11中的Lambda表达式是一种允许创建匿名函数对象的语法结构。Lambda表达式可以捕获作用域中的变量,并且可以像普通函数一样被调用。它们是C11标准中引入的一个重要特性,旨在提供一种方便的方式来定义内联的小型函数,特别适用…

关于 HEAP CORRUPTION DETECTED:after Normal block 错误的原因及解析

目录 一、HEAP CORRUPTION DETECTED:after Normal block 出现的报错情况: 二、问题原因(重要): 三、举例 1.错误代码如下: 2.错误原因及分析(重要): 3.解决方法 ​编辑 4.正…

JavaScript 窗口

1.打开新窗口&#xff1a;window.open() <button onclick"isOpen()">打开百度</button> <script> function isOpen(){ myBaidu window.open(http://www.baidu.com); } </script> 2.关闭当前窗口&#xff1a;window.close() <button on…

【Linux C | 多线程编程】线程的连接、分离,资源销毁情况

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-04-01 1…

SSM框架学习——MyBatis关联映射

MyBatis关联映射 为什么要关联映射 实际开发中&#xff0c;对数据库操作常常会涉及多张表&#xff0c;所以在OOP中就涉及对象与对象的关联关系。针对多表操作&#xff0c;MyBatis提供关联映射。 关联关系概述 一对一&#xff1a;A类中定义B类的属性b&#xff0c;B类中定义A…

MCU友好过渡MPU,米尔基于STM32MP135开发板裸机开发应用笔记

以前微处理器&#xff08;MPU&#xff09;与微控制器&#xff08;MCU&#xff09;是截然不同的两种设备&#xff0c;MPU支持丰富的软件系统&#xff0c;如Linux和相关的软件堆栈&#xff0c;而MCU通常将专注于裸机和RTOS。近年来&#xff0c;随着MCU的性能越来越高&#xff0c;…

【Spring源码】WebSocket做推送动作的底层实例

一、前瞻 Ok&#xff0c;开始我们今天的对Spring的【模块阅读】。 那就挑Web里的WebSocket模块&#xff0c;先思考下本次阅读的阅读线索&#xff1a; WebSocket在Spring里起到什么作用这个模块采用了什么设计模式我们都知道WebSocket可以主动推送消息给用户&#xff0c;那做推…

Netty空闲检测Keepalive

文章目录 前言一、空闲检测二、Keepalive机制总结 前言 Netty的空闲检测和Keepalive机制都是为了确保客户端和服务器之间的连接仍然有效&#xff0c;防止连接断开。但它们在实现方式和原理上有所不同。 Netty的空闲检测机制是一种自定义的、基于应用层的机制。它主要通过定时…

halcon图像膨胀

1、原理&#xff1a; 使用结构元素在图像上移动&#xff0c;如果结构元素中有任意一个像素和图像上的非零像素重叠&#xff0c;则保留此时结构元素中心所在位置&#xff0c;并将其像素值设置为非零。 2、halcon代码 其中圆形结构元素可设置半径&#xff0c;矩形结构元素设置…

Leetcode509——斐波那契数(C语言)

题目来源&#xff1a;509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;&#xff08;动态规划&#xff09; 首先找到斐波那契数的边界条件F(0)0 和 F(1)1。 当n>1时&#xff0c;每项的和都等于前两项的和&#xff0c;即&#xff1a;F(n)F(n−1)F(…

设计模式(7):装饰器模式

一.装饰器模式职责&#xff1a; 动态的为一个对象增加新的功能&#xff1b;装饰器是一种用于代替继承的技术&#xff0c;无须通过继承增加子类就能扩展对象的新功能&#xff0c;使用对象的关联关系代替继承关系&#xff0c;更加灵活&#xff0c;同时避免类型体系的快速膨胀。 …

MySQL故障排查与生产环境优化

一、MySQL单实例常见故障 1.逻辑架构图 MySQL逻辑架构图客户端和连接服务核心服务功能存储引擎层数据存储层 2.故障一 故障现象 ERROR 2002 (HY000): Cant connect to local MySQL server through socket/data/mysql/mysql.sock(2) 问题分析 数据库未启动或者数据库端口…

C++ 数学函数、头文件及布尔类型详解

C 数学 C 有许多函数可以让您在数字上执行数学任务。 最大值和最小值 max(x, y) 函数可用于找到 x 和 y 的最大值&#xff1a; 示例 cout << max(5, 10);而 min(x, y) 函数可用于找到 x 和 y 的最小值&#xff1a; 示例 cout << min(5, 10);C <cmath>…

Yolo 自制数据集dect训练改进

上一文请看 Yolo自制detect训练-CSDN博客 简介 如下图&#xff1a; 首先看一下每个图的含义 loss loss分为cls_loss, box_loss, obj_loss三部分。 cls_loss用于监督类别分类&#xff0c;计算锚框与对应的标定分类是否正确。 box_loss用于监督检测框的回归&#xff0c;预测框…

蓝桥杯真题:成绩统计

这题思路简单&#xff0c;但是输出结果的位置容易出错&#xff0c;题目要求四舍五入&#xff0c;所以要用Math.round&#xff08;&#xff09;的方法