当前位置: 首页 > news >正文

solidity的高阶语法

1.合约

Solidity 中的合约类似于 C++ 中的类。 合约具有以下属性。

  • Constructor − 使用 constructor 关键字声明的特殊函数,每个合约将执行一次,并在创建合约时调用。

  • State Variables − 每个合约的变量用于存储合约的状态。

  • Functions − 每个合约的函数可以修改状态变量以改变合约的状态。

可见性量词

以下是合约的函数/状态变量的各种可见性量词。

  • external − 外部函数旨在由其他合约调用。 它们不能用于内部呼叫。 要在合约中调用外部函数,需要调用 this.function_name() 。 状态变量不能标记为外部。

  • public − 公共函数/变量可以在外部和内部使用。 对于公共状态变量,Solidity 会自动创建一个 getter 函数。

  • internal − 内部函数/变量只能在内部使用或由派生合约使用。

  • private − 私有函数/变量只能在内部使用,甚至不能在派生合约中使用。

示例

pragma solidity ^0.5.0;contract C {//private state variableuint private data;//public state variableuint public info;//constructorconstructor() public {info = 10;}//private functionfunction increment(uint a) private pure returns(uint) { return a + 1; }//public functionfunction updateData(uint a) public { data = a; }function getData() public view returns(uint) { return data; }function compute(uint a, uint b) internal pure returns (uint) { return a + b; }
}
//External Contract
contract D {function readData() public returns(uint) {C c = new C();c.updateData(7);         return c.getData();}
}
//Derived Contract
contract E is C {uint private result;C private c;constructor() public {c = new C();}  function getComputedResult() public {      result = compute(3, 5); }function getResult() public view returns(uint) { return result; }function getData() public view returns(uint) { return c.info(); }
}

对于 E.getCompulatedResult() 和 E.getResult() 显示 

输出

0: uint256: 8

2.继承

继承是扩展合约功能的一种方式。 Solidity 支持单继承和多重继承。 以下是主要亮点。

  • 派生合约可以访问所有非私有成员,包括内部方法和状态变量。 但使用这个是不允许的。

  • 如果函数签名保持不变,则允许函数重写。 如果输出参数不同,编译将失败。

  • 我们可以使用 super 关键字或使用超级合约名称来调用超级合约的函数。

  • 在多重继承的情况下,使用 super 的函数调用优先考虑最派生的契约。

示例

pragma solidity ^0.5.0;contract C {//private state variableuint private data;//public state variableuint public info;//constructorconstructor() public {info = 10;}//private functionfunction increment(uint a) private pure returns(uint) { return a + 1; }//public functionfunction updateData(uint a) public { data = a; }function getData() public view returns(uint) { return data; }function compute(uint a, uint b) internal pure returns (uint) { return a + b; }
}
//Derived Contract
contract E is C {uint private result;C private c;constructor() public {c = new C();}  function getComputedResult() public {      result = compute(3, 5); }function getResult() public view returns(uint) { return result; }function getData() public view returns(uint) { return c.info(); }
}


3.构造函数

构造函数是使用constructor关键字声明的特殊函数。 它是一个可选函数,用于初始化合约的状态变量。 以下是构造函数的主要特征。

  • 一个合约只能有一个构造函数。

  • 构造函数代码在合约创建时执行一次,用于初始化合约状态。

  • 执行构造函数代码后,最终代码将部署到区块链。 该代码包括公共函数和可通过公共函数访问的代码。 构造函数代码或仅由构造函数使用的任何内部方法不包含在最终代码中。

  • 构造函数可以是公共的,也可以是内部的。

  • 内部构造函数将合约标记为抽象。

  • 如果没有定义构造函数,则合约中存在默认构造函数。

pragma solidity ^0.5.0;contract Test {constructor() public {}
}
  • 如果基础合约有带参数的构造函数,每个派生合约都必须传递它们。

  • 基础构造函数可以直接使用以下方式初始化 −

pragma solidity ^0.5.0;contract Base {uint data;constructor(uint _data) public {data = _data;   }
}
contract Derived is Base (5) {constructor() public {}
}
  • 基本构造函数可以使用以下方式间接初始化 −

pragma solidity ^0.5.0;contract Base {uint data;constructor(uint _data) public {data = _data;   }
}
contract Derived is Base {constructor(uint _info) Base(_info * _info) public {}
}
  • 不允许直接和间接方式初始化基础合约构造函数。

  • 如果派生合约未将参数传递给基础合约构造函数,则派生合约将变得抽象。


文章转载自:

http://6Xh0Irs0.qxLjc.cn
http://MqQJx1ZS.qxLjc.cn
http://zNMsAZDj.qxLjc.cn
http://uhnI3LjF.qxLjc.cn
http://Uz7yzXXw.qxLjc.cn
http://GHAjM1Wn.qxLjc.cn
http://IMxLFbMW.qxLjc.cn
http://7Gpb7KGc.qxLjc.cn
http://rUwJeGPo.qxLjc.cn
http://XDx2lid8.qxLjc.cn
http://CLeG1kM1.qxLjc.cn
http://HLUjy6tI.qxLjc.cn
http://41TJqGIw.qxLjc.cn
http://MZnFKJuF.qxLjc.cn
http://mFY3b7mB.qxLjc.cn
http://ks79zSQv.qxLjc.cn
http://co76vU3P.qxLjc.cn
http://OhcyFdhT.qxLjc.cn
http://S5ZQKK6Q.qxLjc.cn
http://DXFTnar8.qxLjc.cn
http://bHUed4JE.qxLjc.cn
http://RiK2L1S1.qxLjc.cn
http://sqvIT0vI.qxLjc.cn
http://j509fGTk.qxLjc.cn
http://dypli61a.qxLjc.cn
http://sW7H7tpm.qxLjc.cn
http://A47noGPm.qxLjc.cn
http://DWUYp20u.qxLjc.cn
http://nBKO4vPm.qxLjc.cn
http://tXxNYA7H.qxLjc.cn
http://www.dtcms.com/a/367829.html

相关文章:

  • 大数据框架对比与选择指南
  • 啥是两化融合?
  • 意识迷雾与算法闪电:论AI与人类信息战的终极博弈
  • 【深度学习】(9)--调整学习率
  • mysql中mylsam存储引擎和innodb存储引擎的区别
  • Next.js App Router 中文件系统路由与页面跳转实践(以用户详情页面为例)
  • 当 AI 走进千行百业:制造业质检与医疗影像诊断的落地差异分析
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析10
  • 驱动开发系列70 - vkQueueSubmit实现
  • 桌面应用开发语言与框架选择指南
  • 《The Landscape of Agentic Reinforcement Learning for LLMs: A Survey》
  • helm 的常用命令
  • pinia状态管理的作用和意义
  • Javaweb 14.3 Vue3 和 Vite
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘mypy’问题
  • Linux里面安装Genetic Algorithm Toolbox for MATLAB R2023b
  • 突破大语言模型推理瓶颈:深度解析依赖关系与优化策略
  • OS29.【Linux】文件IO (1) open、write和close系统调用
  • 【SuperSocket 】利用 TaskCompletionSource 在 SuperSocket 中实现跨模块异步处理客户端消息
  • 2025前端面试题及答案(详细)
  • 深度学习篇---pytorch数据集
  • 数据结构之单链表和环形链表的应用(二)-
  • 第二阶段WinForm-12:UI控件库
  • 题解 洛谷P13778 「o.OI R2」=+#-
  • 从零到一:人工智能应用技术完全学习指南与未来展望
  • 用遗传算法破解一元函数最大值问题:从原理到 MATLAB 实现
  • 后端Long类型数据传给前端造成精度丢失
  • 2025年GEO优化公司:AI驱动的增长新引擎——权威深度解析与遴选指南
  • Redis是单线程的,为啥那么快呢?经典问题
  • 【Python】数据可视化之核密度