链客,专为开发者而生,有问必答!

此文章来自区块链技术社区,未经允许拒绝转载。


Solidity语言11

Solidity是以太坊智能合约的编程语言,我自己也是学习了很久,感觉是有些难度,所以需要去认真的去了解并理解,今天所讲的有基础也有深入的分析,阅读之前,需要对以太坊、智能合约进行初步或者深入的了解。

结构体

Solidity提供struct来定义自定义类型,自定义的类型是引用类型。 我们看看下面的例子:

pragma solidity ^0.4.11;

contract CrowdFunding {

// 定义一个包含两个成员的新类型struct Funder {address addr;uint amount;}struct Campaign {address beneficiary;uint fundingGoal;uint numFunders;uint amount;mapping (uint => Funder) funders;}uint numCampaigns;mapping (uint => Campaign) campaigns;function newCampaign(address beneficiary, uint goal) public returns (uint campaignID) {campaignID = numCampaigns++; // campaignID 作为一个变量返回// 创建一个结构体实例,存储在storage ,放入mapping里campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0);}function contribute(uint campaignID) public payable {Campaign storage c = campaigns[campaignID];// 用mapping对应项创建一个结构体引用// 也可以用 Funder(msg.sender, msg.value) 来初始化.c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value});c.amount += msg.value;}function checkGoalReached(uint campaignID) public returns (bool reached) {Campaign storage c = campaigns[campaignID];if (c.amount < c.fundingGoal)return false;uint amount = c.amount;c.amount = 0;c.beneficiary.transfer(amount);return true;}

}

上面是简单版的众筹合约,但可以让我们去理解structs基础概念,其可以用映射和数组中作为元素。其本身也包括映射和数组等类型。

不能声明一个struct同时将自生作为成员,这个限制是基于 结构体大小必须是有限的。但struct可以作为mapping的值类型成员。

注意在函数中,将一个struct赋值给一个局部变量,实际是拷贝的引用,所以修改局部变量值的同时,会影响到原变量。

当然,也可以直接通过访问成员修改值,而不用一定赋值给一个局部变量,如campaigns[campaignID].amount = 0

映射

映射类型,一种键值对的映射关系存储结构。定义方式为mapping(_KeyType => _KeyValue)。键类型允许除映射、变长数组、合约、枚举、结构体外的几乎所有类型。值类型没有任何限制,可以为任何类型包括映射类型。

映射可以被视作为一个哈希表,所有可能的键会被虚拟化的创建,映射到一个类型的默认值。在映射表中,并不存储键的数据,仅仅存储它的keccak256哈希值,这个哈希值在查找值时需要用到。映射是没有长度的,也没有键集合或值集合的概念。

映射类型,仅能用来作为状态变量,或在内部函数中作为storage类型的引用。

可以通过将映射标记为public,来让Solidity创建一个访问器。通过提供一个键值做为参数来访问它,将返回对应的值。映射的值类型也可以是映射,使用访问器访问时,要提供这个映射值所对应的键,不断重复这个过程。来看一个例子:

pragma solidity ^0.4.0;

contract MappingExample {

mapping(address => uint) public balances;function update(uint newBalance) public {balances[msg.sender] = newBalance;}

}

contract MappingUser {

function f() public returns (uint) {MappingExample m = new MappingExample();m.update(100);return m.balances(this);}

}

注意:映射并未提供迭代输出的方法,可以自行实现一个这样的数据结构。

好了,今天就先写这么多,自己在写的时候都出了些小问题,毕竟不是特别的熟练,都可以算是学了没多久,凑凑活活的写了出来,有不对的希望大家留言指出,多交流。

Solidity语言相关推荐

  1. 用solidity语言开发代币智能合约

    智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...

  2. 对于以太坊的Solidity语言介绍

    Solidity是什么 Solidity是一门面向合约的.为实现智能合约而创建的高级编程语言,主要目的是为了在以太坊虚拟机(EVM)上运行 Solidity是静态语言,支持继承.库和复杂的用户定义等特 ...

  3. solidity语言介绍以及开发环境准备

    Solidity 是一门面向合约的.为实现智能合约而创建的高级编程语言.这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行. So ...

  4. Solidity语言编辑器REMIX指导大全

    文章摘要 本文目标:本文翻译和实践Solidity语言编辑器REMIX官网帮助文档,但并不拘泥于逐字翻译,而时根据实践用中文语言讲透编辑器相关功能. 前置条件:了解以太坊ETH和Solidity语言. ...

  5. Solidity语言详解

    Solidity语言学习学习总结 文章目录 Solidity语言学习学习总结 一.合约文件剖析 1.1一个合约文件的结构如下: 1.2合约的引入import 1.3引入状态变量.函数.事件.函数修改器 ...

  6. 蚂蚁区块链第11课 以租房积分管理系统为例讲透蚂蚁Solidity语言差异精要

    1,摘要 本文以住房租赁积分管理系统为例,给大家演示CLOUD IDE如何编译调试solidity智能合约,并以此为例,给大家分享以太坊SOLIDITY跟蚂蚁区块链SOLIDITY语言的差异点. 2, ...

  7. 以太坊智能合约基础——Solidity语言的计量单位和全局变量

    本文重点介绍 Solidity 语言的计量单位和全局变量,包括以太币单位.时间单位.特殊变量和函数三个类别.本文内容来源于 Solidity 0.8.12 版本. 以太币单位 以太币 Ether 单位 ...

  8. Solidity语言开发基础教程

    Solidity语言是开发以太坊智能合约的不二选择,本文列举了在solidity学习和开发 中可能对你有帮助的18个资源,包括示例代码.solidity库和预置dapp开发环境的docker镜像. D ...

  9. 【区块链技术开发】 关于Windows10平台Solidity语言开发环境配置

    目录 1.安装 Node.js 2.安装 Solidity 编译器 3.安装 Remix IDE 4.安装 MetaMask 浏览器插件 5.环境配置与问题解决 6. 安装Ganache:以太坊区块链 ...

最新文章

  1. 【数学专题】约数个数与欧拉函数
  2. matlab2014仿真pid程序,先进 PID 控制及其 MATLAB 仿真 (PDF+程序)
  3. 机载雷达发展简史:从蝙蝠到机载相控阵
  4. 3D物体识别的如果检验
  5. 一位读者刚刚收割阿里、腾讯等大厂Offer,他说这些话一定要和你们说一下
  6. 将*.STL转换成顶点索引格式
  7. composer在windows中安装失败
  8. java集合学习笔记 ---Collections类对集合的处理
  9. 设置拖拽事件,获取拖拽内容
  10. 拒绝职场危机,程序员最核心的竞争力是什么?
  11. python垃圾回收价格表_主流的垃圾回收机制都有哪些?
  12. C11头文件threads.h声明了创建和管理线程,信号,条件变量的函数
  13. 根据excel生成mysql数据库,根据excel生成数据库脚本
  14. myeclipse以及tomcat乱码解决
  15. 如何设置CentOS7的时间与网络同步
  16. 虚拟机安装过程中发生该错误:“客户机操作系统已禁用cup”问题解决方法【全】
  17. PowerDesigner16.5下载
  18. c语言课程设计作业医院挂号系统,c语言课程设计机房机位预定系统绝对正确,附源代码...
  19. 计算机一级考试题电子表格,2017计算机一级Excel模拟考试题
  20. 农总行计算机类,中国农业银行总行计算机类笔试经验【精选】

热门文章

  1. Swift学习总结【持续更新】
  2. 【React Native】react-navigation导航使用方法
  3. iOS显示gif图片的几种方法
  4. iOS中的动力学:Dynamics【1】
  5. 【Android】Fragment官方中文文档
  6. react按需加载(getComponent优美写法),并指定输出模块名称解决缓存(getComponent与chunkFilename)...
  7. Solaris下ftp配置(初稿-待补充)
  8. 你是否对它有一种责任感
  9. java调用ffmpeg,mencoder进行视频转换,读取时长等
  10. Rootkit之SSDT hook(通过CR0)