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);}
}
注意:映射并未提供迭代输出的方法,可以自行实现一个这样的数据结构。
好了,今天就先写这么多,自己在写的时候都出了些小问题,毕竟不是特别的熟练,都可以算是学了没多久,凑凑活活的写了出来,有不对的希望大家留言指出,多交流。
相关文章:

同一个类 cannot be cast to_留学热门assignment之 税收筹划类essay
税法和税务筹划一直以来都是热门的行业,由于近些年对于税务人才的需求越来越大,税法专业成为了当下最火爆的留学专业之一。发达国家由于税收和法律体系相对完善,法律的条文相较于其他国家而言也更加的细致和有操作性,因此…

LeetCode 7. Reverse Integer
问题链接 LeetCode 7 题目解析 给定一个32位有符号整数,求其反转数字。 解题思路 如果是简单反转的话,那这道题就太简单了。题目要求判断溢出问题,32位int类型的范围是-2147483648~2147483647。数字反转过后是有可能超出范围的&am…

Ultra-QuickSort POJ 2299(归并排序)
http://acm.hust.edu.cn/vjudge/contest/124435#problem/D 题意:给出一个长度为n的数列,你每一次可以随意交换其中两个数字的位置。问你至少交换几次,才能使得这个数列是个单调递增数列。 比赛时没做出来,(自然&#x…

Geth 控制台使用及 Web3.js 使用实战
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 突然发现没有太多写实战的,所以就写一点自己的拙见,提供给成员一些参考。Geth 控制台(REPL)实现了所…

Java多线程的同步机制(synchronized)
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁); 如果这个时候同步对象的锁被其他线程拿走了,他(这个线程…

mouseenter 延迟_桃园台服加速器 电狐加速器带你低延迟玩游戏
桃园是由冰动娱乐自主研发的全球首款运用世界顶级开发引擎Unreal Engine 3的次世代回合制网络游戏。Unreal 3引擎在骨骼动画树、特效渲染、游戏性完善等方面表现杰出,而且游戏中还可以呈现广角纵身大场景,1080P的高清画质将会带给玩家前所未有的视觉震撼…

私有链的特点简单介绍
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 私有链是区块链的一种,它指的是某个区块链的写入权限仅掌握在某个人或某个组织手中,数据的访问以及编写等有着十分严格的权限…

typescript调用javascript URI.js
URI.js URI.js是一个用于处理URL的JavaScript库它提供了一个“jQuery风格”的API(Fluent接口,方法链接)来读写所有常规组件和许多便利方法,如.directory()和.authority()本文以URI.j…

richeditctrl 选中ole图片 拖拽 空白_高质量的图片素材,碾压度娘几条街......
答应我不要错过哈喽大家周末好啊,总有小伙伴来问公子说每周的素材分享我到底都是从哪里找的呢,其实公子之前也有告诉过大家,可能是隔的时间太久了。所以今天呢我又给你们整理了一些经常会用到的几个图片网站,都是非常知名而且基…

20160722noip模拟赛alexandrali
【题目大意】 有许多木块, 叠放时, 必须正着叠放, 如图1, 左边两块为合法叠放, 右边为不合法叠放. 图1 一个方块被称为稳定的, 当且仅当其放在最底层, 或其正下方有方块且下方的这个方块的四周都有方块. 叠放必须保证所有方块都稳定. 如图2, 左边3个叠放为合法叠放, 右边2个叠放…

以太坊技术知识讲解
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 以太坊(Ethereum)是2013年底由一个叫作 Vitalik Buterin 的90后小伙子提出来的技术。以太坊和比特币相似,是一个…
大数据数据倾斜
什么是数据倾斜 简单的讲,数据倾斜就是我们在计算数据的时候,数据的分散度不够,导致大量的数据集中到了一台或者几台机器上计算,这些数据的计算速度远远低于平均计算速度,导致整个计算过程过慢。 相信大部分做…
【leetcode75】Intersection of Two Arrays(数组的交集)
题目描述: 给定两个数组求他们的公共部分,输出形式是数组,相同的元素只是输出一次 例如: nums1 [1, 2, 2, 1], nums2 [2, 2], return [2]. 原文描述: Given two arrays, write a function to compute their intersec…

qprocess start怎么判断是否结束_面试结束后,如何判断自己是否有戏?看有无这8大信号!...
关注“职场沉浮宝典”,每天get一个职场小技巧面试结束后,在等待最终结果的过程中,我们常常会惴惴不安,喜欢在脑海里回放全部面试细节,多角度去判断自己通过面试的可能性。毕竟,面试就如同相亲,如…

智能合约语言Solidity 类型介绍
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 智能合约语言Solidity 类型介绍11 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解&#…

怎样快速学习React
react简单学习路线(实用版) 学习一门新的技术之前有必要了解一下该技术在专业领域的评价,使用的领域,以及整体的学习路线,总之尽可能多的在入坑之前了解相关方面的信息。不要什么都不去查就直接学了,这个是…

Poj_1274 The Perfect Stall -二分图裸题
题目:给牛找棚,每个棚只能容一只牛,牛在对应的棚才能产奶,问最多能让几只牛产奶。 /************************************************ Author :DarkTong Created Time :2016/7/31 10:51:05 File Name :Poj_1274.cpp…

青少年软件编程python考试-青岛全国青少年软件编程等级考试—Python
卓优特机器简介 卓优特机器人是集教育机器人设备研发、生产、销售及课程研发、教育机器人课程教育及竞赛技术服务、机器人实验室方案策划及配置、智能技术支持的高新技术集成服务商, 公司由多所知名大学的多位智能技术专家及教授提供技术指导。 卓优特机器人是集教育机器人设备…

区块链基础--工作量证明
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 区块链基础(6)–工作量证明1 我认为技术和共识构建了区块链,那么就由几个问题需要去解决,第一&…

pat乙级1049
浮点型乘整型和整型乘浮点型结果不同,不知为什么。 1 double sum 0.0; 2 for (int i 0; i < n; i) 3 { 4 cin >> a[i]; 5 sum a[i] * (i 1) * (n - i); 6 } 7 printf("%.2f", sum); 提交结果正确。 1 double sum 0.0; 2 for (int i…

hdu-5778 abs(暴力枚举)
题目链接: abs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem DescriptionGiven a number x, ask positive integer y≥2, that satisfy the following conditions:1. The absolute value of y - x is minimal2. To prime f…

bugku 杂项 就五层你能解开吗_你能解开这个和数字有关的逻辑解谜游戏吗? | 每日一考...
今天是一道和数字有关的逻辑解谜游戏看看你能用多长时间得到答案这道题的目标是,把网格根据数字划分成很多个方形小块。每个数字都代表它所在的小块面积,也就是包含了几个小格子,要求如下图,每个小块里必须有,而且只能…

区块链技术术语表
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 区块链技术包含了常见的区块链基本概念和进阶阅读的参考文章,用自己的思考方式去优化理解。 比特币:一种分布式网络的数字货…
『TensorFlow』数据读取类_data.Dataset
一、资料 参考原文: TensorFlow全新的数据读取方式:Dataset API入门教程 API接口简介: TensorFlow的数据集 二、背景 注意,在TensorFlow 1.3中,Dataset API是放在contrib包中的: tf.contrib.data 而在Tenso…

出入口控制系统工程设计规范_[问答]连载77-控制系统之间如何时钟同步?
仪表小猪在控制系统中,趋势、报警、事件记录等都与时间相关,因此整个系统始终保持一个统一的时钟很关键。如果操作站和控制站时间不同步,操作员站上面显示的事件、趋势等也不能真正的反应出现场实际变化的时间,不能作为真实的历史…

分布式账本(Distributed ledger)
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 是一种在网络成员之间共享、复制和同步的数据库。分布式账本记录网络参与者之间的交易,比如资产或数据的交换。这种共享账本消除了调解不…

手动删除木马程序
1 ??? 2 这个蠢货竟然用360? (360杀毒太流氓,插件不可控,就是第一个要杀的木马) 一些基本的命令往往可以在保护网络安全上起到很大的作用,下面几条命令的作用就非常突出。 一、检测网络连接 如果你怀疑自己的计算机上被别人安装了木马,或者是中…

phpstorm如何同时打开两个文件夹_2分钟学会文件夹共享,化身办公室电脑大神
点击上方蓝色字体,关注我们身在职场或学校的你,还在用微信或QQ给办公室的小伙伴传文件吗?那你可真就out了,总结一下,微信或QQ传文件存在以下3个缺点。1、传输文件大小存在限制微信不能发送100MB以上的文件,…

Hdu_2063 过山车 -最大匹配(邻接表版)
题目:就是最大匹配了 /************************************************ Author :DarkTong Created Time :2016/8/1 12:53:27 File Name :Hdu2063.cpp *************************************************/#include <cstdio> #include <cstr…

“去中心化”为何意义重大?
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 互联网的前两个时代 在互联网的第一个时代–从20世纪80年代到21世纪初–互联网服务建立在由互联网社区控制的开放协议之上。这意味着,人…