建议和反馈

请填写你的反馈内容

Solidity-变量

2020-12-03 ·3189次阅读 ·读完需要8分钟

欢迎来到跟我学习 Solidity 系列中的第二篇文章。如果你还没有阅读第一篇:Solidity 入门,我强烈建议你这样做以设置开发环境以及编写和部署第一个合约。
在本文中,我们将研究 Solidity 中的变量,它们的类型,它们的存储方式以及如何使用它们。

在 Solidity 中,我们有两种类型的变量:

状态变量

这些变量在函数外部声明(例如类的属性),并永久存储在以太坊区块链中,更具体地说存储在存储 Merkle Patricia 树中,这是形成帐户状态的信息的一部分(这就是为什么我们称其为状态变量)。

diagram of Merkle Patricia tree

以太坊 Merkle Patricia 树:来源

你可以找到有关数据存储在以太坊区块链中的更多信息,参考文章.

状态变量可以在声明时进行初始化,并且具有以下可见性:

  • private:状态变量仅在定义的合约里可见。

  • public:状态变量也可以在定义合约的外部访问,因为编译器会自动创建一个与该变量同名的 getter 函数。

  • internal:状态变量在定义的合约以及所有继承合约都是可见的。

可见性指示符放在状态变量的类型之后,如果未指定,则状态变量将被视为 internal

局部变量

这些是在函数内部声明的变量,其作用域限定在声明它们的代码块内。

// SPDX-License-Identifier: GPL-3.0pragma solidity ^0.7.0;

contract HelloWorldContract {
    
    address owner; // 状态变量
    
    function helloWorld() external pure returns(string memory){
        
        string memory  greeting ="hello world"; // 局部变量
        
        return greeting;
    }
    
}

与其他任何语言一样,我们有基本数据类型和复杂数据类型。当用作函数参数或在赋值中时,基本数据类型始终按值传递,而复杂数据类型(如数组和结构体)则按引用传递。

基本数据类型

table of Solidity elementary data types and what each may contain

Solidity 基本数据类型

有关地址类型的更多信息:

  • 地址字面常量:通过地址校验和测试的十六进制字面常量,例如 0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF 属于 address payable 类型。

  • 类型转换:address payable 可以隐式转换为简单的 address 类型,这表示你可以将 address payable 分配给 address 类型,而无需显式转换。

整数字面常量和 bytes20,可以使用以下语法:address(x) 进行显式转换为地址。这种转换将产生 address payable 类型。

  • 地址类型成员:地址类型的两个重要成员是 balance(允许查询地址的余额)和 transfer(允许发送以 wei 单位的以太币到 address payable 类型的地址。

  • 合约和地址类型:
    你可以使用之前看到的语法将合约明确转换为地址类型: address(x),其中 x 是合约的一个实例。如果合约定义了 receive 函数或 fallback function 函数(我们后面会介绍这两个函数的更多详情),则会转换为 address payable,如果没有这两个函数,则转换为 address,此时,如果你希望转换为 payable,则必须使用  payable(address(x))

全局可用变量

全局命名空间中始终存在一些特殊变量,这些变量主要用于提供有关区块链的信息。

我们可以将这些变量分为三类:

  1. 区块属性

table of block types and what each main contain

  1. 消息属性

table of message types and what each may contain

  1. 交易属性

table of transaction types and what each may contain

我们将大量使用的两个属性是 msg.sender 和 msg.valuemsg.sender 可以向我们提供发送方的地址,从而可以保存合约所有者的地址,而 msg.value 则可以获取发送的金额。

举个例子,我们保存合约创建者的地址并修改  HelloWorldContract,这样,如果交易信息是由创建者发送的,我们将用  hello Daddy 向他们打招呼。否则,我们向发送者打招呼  hello world

如果按照我们在上一篇文章中看到的那样部署合约,然后单击 sayHell,你将得到 hello Daddy,因为你用于部署合约的地址与你用来调用该合约的地址相同功能。

让我们更改帐户,然后再次调用该功能。为了更改你的帐户,你需要单击“帐户”部分的下拉列表,然后选择其他地址。

Image for post

如果这次调用 sayHello,你应该会得到  hello world
太好了,我们学到了一些东西。

在练习应用所学知识之前,我想提到一下,Solidity 中的 this 关键字引用了当前合约的类型,并且可以明确转换为地址,正如我们在合约实例中看到的那样。

本文要结束了,尝试下完成以下作业:

  • 获取合约的地址。

  • 获取合约所有者的地址。

  • 获取发送者的地址。

  • 获取合约余额。

  • 获取合约所有者的余额(仅当发送者是所有者时)。

  • 获取发送者的余额。

你可以在 GitHub 上找到解决方案。

希望你喜欢这篇文章。下次,我们将讨论复杂的类型,并揭示上一代码中我在 string 旁边使用的 memory 关键字背后的奥秘。因此,如果你想了解更多信息,请坚持学习,并在下一篇文章中见。


声明:作为区块链技术信息平台,本站所提供的资讯信息不代表任何投资暗示,本站所发布文章仅代表个人观点,与链客社区官方立场无关。
评论(0)问答(0)
请先登录或注册

请先登陆或注册

相关推荐

简析以太坊 EIP-3074:普通用户无需 ETH 即可免信任发送事务

EIP-3074 旨在淘汰元事务,降低合约的复杂性,让普通账户(EOA)即可发送批量事务、限期事务、无序事务等。原文标题:《引介 | EIP-3074 简介》撰文:lightclients翻译 & 校......
Blockchain · 2021-05-14
258阅读 · 0赞赏 · 0问答

为什么要使用 transaction data?

文章来源:https://ethfans.org/posts/why-do-we-need-transaction-data 可能你也注意到了,在跟智能合约交互(例如发送 token)时,你的事务会自......
仍然 · 2021-05-13
215阅读 · 0赞赏 · 0问答

细数以太坊生态的另类项目:通向Web3.0的桥梁

DeFi之外,以太坊生态还有许多另类生态项目值得关注。近段时间,以BSC、Solana与Fontom等为代表的公链对以太坊发起了激烈挑战,特别是在应用生态方面,正在在借贷、交易、聚合器等赛道全方位复制......
泰勒 · 2021-05-13
1119阅读 · 0赞赏 · 0问答

抵御 MEV 攻击的新方法?了解 Gnosis Protocol V2 和 Balancer-Gnosis-Protocol

Gnosis Protocol V2 和 Balancer-Gnosis-Protocol 为交易者提供了一种能够抵御 MEV 并毫发无伤地离开黑暗森林的新方式。原文标题《引介 | Gnos......
Blockchain · 2021-05-10
514阅读 · 0赞赏 · 0问答

V神谈 NFT、DAO、DeFi 及下一批10亿以太坊用户

以太坊联合创始人 Vitalik Buterin 在2021年以太坊峰会上提出了他对 NFT 、未来工作方式和以太坊持续升级的看法。Vitalik Buteri......
月花雾 · 2021-05-10
380阅读 · 0赞赏 · 0问答

以太坊的进化:新资本主义与三性资产

以太坊能超越比特币么?这个问题曾经和“EOS能否超越以太坊”一样遭人嘲笑,如今随着以太坊对比特币汇率不断飙升,ETH2.0逐渐临近,这个问题不再是笑话。比如,Messari高级研究分析师Ryan Wa......
Angle · 2021-05-08
816阅读 · 0赞赏 · 0问答

Ronaldo

3867.0

LK币

28

粉丝

63

笔记

感谢"Ronaldo"

这篇精彩的笔记,目前已经帮助

  • 0
  • 3
  • 1
  • 8
  • 9
喜欢0
链客社群 加入

微博进入

商务合作>

广告投放>

公司名称:北京链客行科技有限公司

联系方式:010-67707199

ICP备案号:京ICP备18032136号

Copyright:链客区块链技术问答社区 版权所有

感谢您的提问,问题被社区永久收入以便新人查看。一定要记得采纳最佳答案哦!加油!

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!