Solidity语言
链客,专为开发者而生,有问必答!
此文章来自区块链技术社区,未经允许拒绝转载。
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语言相关推荐
- 用solidity语言开发代币智能合约
智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...
- 对于以太坊的Solidity语言介绍
Solidity是什么 Solidity是一门面向合约的.为实现智能合约而创建的高级编程语言,主要目的是为了在以太坊虚拟机(EVM)上运行 Solidity是静态语言,支持继承.库和复杂的用户定义等特 ...
- solidity语言介绍以及开发环境准备
Solidity 是一门面向合约的.为实现智能合约而创建的高级编程语言.这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行. So ...
- Solidity语言编辑器REMIX指导大全
文章摘要 本文目标:本文翻译和实践Solidity语言编辑器REMIX官网帮助文档,但并不拘泥于逐字翻译,而时根据实践用中文语言讲透编辑器相关功能. 前置条件:了解以太坊ETH和Solidity语言. ...
- Solidity语言详解
Solidity语言学习学习总结 文章目录 Solidity语言学习学习总结 一.合约文件剖析 1.1一个合约文件的结构如下: 1.2合约的引入import 1.3引入状态变量.函数.事件.函数修改器 ...
- 蚂蚁区块链第11课 以租房积分管理系统为例讲透蚂蚁Solidity语言差异精要
1,摘要 本文以住房租赁积分管理系统为例,给大家演示CLOUD IDE如何编译调试solidity智能合约,并以此为例,给大家分享以太坊SOLIDITY跟蚂蚁区块链SOLIDITY语言的差异点. 2, ...
- 以太坊智能合约基础——Solidity语言的计量单位和全局变量
本文重点介绍 Solidity 语言的计量单位和全局变量,包括以太币单位.时间单位.特殊变量和函数三个类别.本文内容来源于 Solidity 0.8.12 版本. 以太币单位 以太币 Ether 单位 ...
- Solidity语言开发基础教程
Solidity语言是开发以太坊智能合约的不二选择,本文列举了在solidity学习和开发 中可能对你有帮助的18个资源,包括示例代码.solidity库和预置dapp开发环境的docker镜像. D ...
- 【区块链技术开发】 关于Windows10平台Solidity语言开发环境配置
目录 1.安装 Node.js 2.安装 Solidity 编译器 3.安装 Remix IDE 4.安装 MetaMask 浏览器插件 5.环境配置与问题解决 6. 安装Ganache:以太坊区块链 ...
最新文章
- 【数学专题】约数个数与欧拉函数
- matlab2014仿真pid程序,先进 PID 控制及其 MATLAB 仿真 (PDF+程序)
- 机载雷达发展简史:从蝙蝠到机载相控阵
- 3D物体识别的如果检验
- 一位读者刚刚收割阿里、腾讯等大厂Offer,他说这些话一定要和你们说一下
- 将*.STL转换成顶点索引格式
- composer在windows中安装失败
- java集合学习笔记 ---Collections类对集合的处理
- 设置拖拽事件,获取拖拽内容
- 拒绝职场危机,程序员最核心的竞争力是什么?
- python垃圾回收价格表_主流的垃圾回收机制都有哪些?
- C11头文件threads.h声明了创建和管理线程,信号,条件变量的函数
- 根据excel生成mysql数据库,根据excel生成数据库脚本
- myeclipse以及tomcat乱码解决
- 如何设置CentOS7的时间与网络同步
- 虚拟机安装过程中发生该错误:“客户机操作系统已禁用cup”问题解决方法【全】
- PowerDesigner16.5下载
- c语言课程设计作业医院挂号系统,c语言课程设计机房机位预定系统绝对正确,附源代码...
- 计算机一级考试题电子表格,2017计算机一级Excel模拟考试题
- 农总行计算机类,中国农业银行总行计算机类笔试经验【精选】
热门文章
- Swift学习总结【持续更新】
- 【React Native】react-navigation导航使用方法
- iOS显示gif图片的几种方法
- iOS中的动力学:Dynamics【1】
- 【Android】Fragment官方中文文档
- react按需加载(getComponent优美写法),并指定输出模块名称解决缓存(getComponent与chunkFilename)...
- Solaris下ftp配置(初稿-待补充)
- 你是否对它有一种责任感
- java调用ffmpeg,mencoder进行视频转换,读取时长等
- Rootkit之SSDT hook(通过CR0)