以太坊智能合约Demo
链客,专为开发者而生,有问必答!
此文章来自区块链技术社区,未经允许拒绝转载。
智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战demo示例快速入门,用demo例子深入浅出智能合约开发,体会以太坊构建去中心化可信交易技术魅力。智能合约其实是“执行合约条款的计算机交易协议”。区块链上的所有用户都可以看到基于区块链的智能合约。
维基上说智能合约(英语:Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。智能合约概念于1994年由Nick Szabo首次提出。智能合同的目的是提供优于传统合同方法的安全,并减少与合同相关的其他交易成本。
由于区块链上的所有用户都可以看到基于区块链的智能合约。这也会导致包括安全漏洞在内的所有漏洞都可见,并且可能无法迅速修复。这样的攻击难以迅速解决。
插曲,2016年6月The DAOEther的漏洞造成损失5000万美元,而开发者试图达成共识的解决方案。DAO的程序在黑客删除资金之前有一段时间的延迟。以太坊软件的一个硬分叉在时限到期之前完成了攻击者的资金回收工作。以太坊智能合约中的问题包括合约编程Solidity、编译器错误、以太坊虚拟机错误、对区块链网络的攻击、程序错误的不变性以及其他尚无文档记录的攻击。
部署智能合约的经典案例有:
以太坊在其区块链上实施了一种近乎图灵完备的语言,这是一个突出的智能合约框架。
RootStock (RSK) 是一个智能合约平台,通过侧链技术连接到比特币区块链。 RSK兼容为以太坊创造的智能合约。
一个典型的智能合约的solidity语言编程demo示例或者叫实例如下一个委托投票系统,做了一些备注:
官网示例原文:https://solidity.readthedocs.io/en/develop/solidity-by-example.html#possible-improvements
这个例子是最新的,主要用到了以太坊编程语言Solidity的一些特性。例子实现了一个投票智能合约即电子投票系统。解决的主要问题是如何分配合理的权限给正确的人,并且要防止被篡改。这个例子实现了如何去委托投票,整个投票计数过程是自动而且完全透明。
功能上它首先为投票创建一个合约,发起者作为所谓的chairperson姑且叫主席来给每一个独立的地址分配相应权限。每一个参与投票者可以自己投票或者委托自己信任的人。这段代码最后运行结果会返回得票数最多的那个议案或者叫倡议。
pragma solidity ^0.4.22;
/// @title Voting with delegation.一个有委托功能的投票系统
contract Ballot {
// This declares a new complex type which will 定义一个复杂类型
// be used for variables later. 后面作为变量来使用
// It will represent a single voter.代表一个投票人
struct Voter {
uint weight; // weight is accumulated by delegation weight在代表投票过程中会累积
bool voted; // if true, that person already voted 如果值为true,代表这个投票人已经投过票
address delegate; // person delegated to 投票人地址
uint vote; // index of the voted proposal 当前投票的索引
}
// This is a type for a single proposal.代表一份议案的数据结构
struct Proposal {bytes32 name; // short name (up to 32 bytes) 议案的名称uint voteCount; // number of accumulated votes 议案接受的投票数
}address public chairperson; // 定义投票发起人// This declares a state variable that
// stores a `Voter` struct for each possible address. 这个状态变量存储了所有潜在投票人
mapping(address => Voter) public voters;// A dynamically-sized array of `Proposal` structs. 定义动态数组存储议案
Proposal[] public proposals;/// Create a new ballot to choose one of `proposalNames`. 传入议案名称来定义一个投票对象
function Ballot(bytes32[] proposalNames) public {chairperson = msg.sender;voters[chairperson].weight = 1;// For each of the provided proposal names,// create a new proposal object and add it// to the end of the array. 按传入的议案名称创建一个议案,并加入到前面定义的议案数组for (uint i = 0; i < proposalNames.length; i++) {// `Proposal({...})` creates a temporary// Proposal object and `proposals.push(...)`// appends it to the end of `proposals`.创建一个临时议案对象,加入议案数组proposals.push(Proposal({name: proposalNames[i],voteCount: 0}));}
}// Give `voter` the right to vote on this ballot.
// May only be called by `chairperson`. 给投票人分配投票权限,这个操作只有主席才可以
function giveRightToVote(address voter) public {// If the first argument of `require` evaluates// to `false`, execution terminates and all// changes to the state and to Ether balances// are reverted.// This used to consume all gas in old EVM versions, but// not anymore.// It is often a good idea to use `require` to check if// functions are called correctly.// As a second argument, you can also provide an// explanation about what went wrong.require(msg.sender == chairperson,"Only chairperson can give right to vote.");require(!voters[voter].voted,"The voter already voted.");require(voters[voter].weight == 0);voters[voter].weight = 1;
}/// Delegate your vote to the voter `to`. 委托投票给另外一个投票人
function delegate(address to) public {// assigns reference 找出委托发起人,如果已经投票,终止程序Voter storage sender = voters[msg.sender];require(!sender.voted, "You already voted.");require(to != msg.sender, "Self-delegation is disallowed.");// Forward the delegation as long as// `to` also delegated.// In general, such loops are very dangerous,// because if they run too long, they might// need more gas than is available in a block.// In this case, the delegation will not be executed,// but in other situations, such loops might// cause a contract to get "stuck" completely.while (voters[to].delegate != address(0)) {to = voters[to].delegate;// We found a loop in the delegation, not allowed. 发起人、委托人不能是同一个,否则终止程序require(to != msg.sender, "Found loop in delegation.");}// Since `sender` is a reference, this// modifies `voters[msg.sender].voted` 标识发起人已经投过票sender.voted = true;sender.delegate = to;Voter storage delegate_ = voters[to];if (delegate_.voted) {// If the delegate already voted,// directly add to the number of votes 投票成功,投票总数加上相应的weightproposals[delegate_.vote].voteCount += sender.weight;} else {// If the delegate did not vote yet,// add to her weight. 如果还没投票,发起人weight赋值给委托人delegate_.weight += sender.weight;}
}/// Give your vote (including votes delegated to you)
/// to proposal `proposals[proposal].name`.投票给某个议案
function vote(uint proposal) public {Voter storage sender = voters[msg.sender];require(!sender.voted, "Already voted.");sender.voted = true;sender.vote = proposal;// If `proposal` is out of the range of the array,// this will throw automatically and revert all// changes.proposals[proposal].voteCount += sender.weight;
}/// @dev Computes the winning proposal taking all
/// previous votes into account.找出投票数最多的议案
function winningProposal() public viewreturns (uint winningProposal_)
{uint winningVoteCount = 0;for (uint p = 0; p < proposals.length; p++) {if (proposals[p].voteCount > winningVoteCount) {winningVoteCount = proposals[p].voteCount;winningProposal_ = p;}}
}// Calls winningProposal() function to get the index
// of the winner contained in the proposals array and then
// returns the name of the winner
function winnerName() public viewreturns (bytes32 winnerName_)
{winnerName_ = proposals[winningProposal()].name;
}
}
如果这个demo代码基本能够看明白,那应该是可以直接实战开启以太坊区块链的学习进程了,分享两个教程,都可以通过在线编程环境实战学习:
1.适合区块链新手的以太坊DApp开发: http://xc.hubwiz.com/course/5a952991adb3847553d205d1 2.用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建以太坊DApp电商平台: http://xc.hubwiz.com/course/5abbb7acc02e6b6a59171dd6
相关文章:

Java学习笔记七——数组工具类Arrays
数组工具类Arrays Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组。若将里面的方法用熟的话,那开发效率会大大提高。下面介绍其中的方法。 List<T> asList(T... a) 作用:将指定数组或数组元素,转换成固定大小的List。…

c++窗口管理系统是什么_优秀的食堂管理系统让你对校园生活更充满希望
面对今年疫情环境下的种种困难,各大高校纷纷根据情况采取不同的措施,应对开学的各种难题。解决返校学生就餐就是一大难点。学校后勤工作人员少之又少,开设的食堂窗口也供不应求。这也直接导致了后勤人员懒散,食堂阿姨给菜“手抖”…

ACM训练小结-2018年6月16日
今天题目情况如下:A题:线段树XOR性质。情况:由于写法问题,调试困难,浪费大量时间。B题:(对所有满足i mod pq,求a[i]之和),无修改,直接上n*sqrt(n)…

加密货币的本质
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 去年,比特币暴涨,其他币也像雨后春笋一样冒出来,已经有1000多种了。 很多人都在问,加密货币&#…

「2018山东一轮集训」 Tree
为什么出题人这么毒瘤啊??!!一个分块还要带log的题非要出成n<2*1e5。。。。。。。 为了卡过最后两个点我做了无数常数优化,包括但不限于:把所有线段树改成 存差分的树状数组;把树剖求LCA的极…

mysql 表空间收缩_mysql表碎片清理和表空间收缩
mysql表碎片清理和表空间收缩(即清理碎片后report_site_day.ibd文件磁盘空间减小,该方案基于独立表空间存储方式)OPTIMIZETABLE [tablename],当然这种方式只适用于独立表空间清除碎片的优点:降低访问表时的IO,提高mysql性能,释放表空间降低磁盘空间使用率OPTIMIZE TABLE ipvacl…

spring security remember me实现自动登录
1 默认策略 在我们自定义的login中增加一个选择框 <input type"submit" value"Login" /> <br/> <br/> <input type"checkbox" valuetrue name"_spring_security_remember_me" />记住密码 <!-- 记住…

野指针与内存泄漏那些事
野指针:不是NULL指针,是指向垃圾内存的指针 野指针成因: 1.指针变量没有被初始化:指针变量在创建时同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。 2.指针p被free或者delete,没有被设置为…

参数等效模型可以用于_等效媒质理论(介电参数反演)
听说过超材料的读者大概率会了解一个知识点,复杂的媒质块可以等效为一块平板,当然这是有条件的。比如模型小于十分之一波长之类的,尤其对模型厚度要求严格些。大家在查找等效媒质理论文献的时候,可能会被繁杂的理论解释弄得爆炸&a…

js日期格式化Date
使用Date类进行日期格式化。 1 输入“yyyy-MM-dd hh:mm:ss”格式的String字符串,返回字符串 做一个简单判定,在当日显示为几点几分,同年为月日,不同年显示年月 1 function dateFormat(str){2 //str格式为yyyy-mm-dd h…

(十九)异常处理
什么是异常处理 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下 语法错误&…

jquery 获取一组元素的选中项 - 函数、jquery获取复选框值、jquery获取单选按钮值...
做表单提交时,如果现在还在用form提交,用户体验很差,所以一般使用ajax提交。 其中需要获取每个表单输入元素的值,获取的时候像文本框这些还好说,Jquery提供了 .val() 方法,获取很方便,但是获取复…

geany怎么创建文件夹_教程详情|Geany怎么使用,Geany安装使用教程_234游戏网
Geany是利用GTK 2工具包开发的一个快速、轻巧的集成开发环境,具有良好的可移植性和通用性、安全性,广泛应用于各个行业。Geany具有语法高亮、代码折叠、代码自动完成等功能,非常适合开发人员使用。下面是关于Geany安装使用教程,希…

Django模板系统和admin模块
只需要记两种特殊符号:{{ }}和 {% %}变量相关的用 {{}}, 逻辑相关的用 {%%}。 Filters 语法: {{ value|filter_name:参数 }}default{{ value|default: "nothing"}} 如果value值没传的话就显示nothinglength{{ value|length }}|左右…

finalshell文件列表不显示_Jira面板配置_待办事项不显示问题列表
最近,使用jira进行项目管理,出现一些问题,对于其中一些配置,做下记录,后续方便查看,也给需要的人一个参考,传送门:jira使用文档_Java_pang787559613的博客-CSDN博客blog.csdn.netj…

背单词:3年,34150分钟!
转载于:https://www.cnblogs.com/sx00xs/p/6128618.html

如何学习区块链技术
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 有效地学习区块链技术,您需要深入了解区块链协议和一些编程语言。记住区块链是一种可以用各种编程语言实现的协议。看下面的例子&#…

.net里鼠标选中的text数据怎么获取_Python数据科学实践 | 爬虫1
点击上方蓝色字体,关注我们大家好,基于Python的数据科学实践课程又到来了,大家尽情学习吧。本期内容主要由智亿同学与政委联合推出。前面几章大家学习了如何利用Python处理与清洗数据,如何探索性数据分析,以及如何利用…

redis实现对账(集合比较)功能
现状:每日在进行系统之间的订单对账时,往往是这样的操作流程; 1.从外部系统拉取数据存入本地数据库; 2.查询本地订单数据集合localSet; 3.查询外部系统订单数据集合outerSet; 4.以本地localSet为基准,对照o…

Javascript刷题 》 查找数组元素位置
找出元素 item 在给定数组 arr 中的位置 输出描述: function indexOf(arr, item) {..... } 如果数组中存在 item,则返回元素在数组中的位置,否则返回 -1 输入例子: indexOf([ 1, 2, 3, 4 ], 3) 输出例子: 2 实现方法 1、先将arr转换成字符串,…

Go 语言函数
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 函数是基本的代码块,用于执行一个任务。 Go 语言最少有个 main() 函数。 你可以通过函数来划分不同功能,逻辑上每个函数执…

终端主题_再见 XShell 和 ITerm 2,是时候拥抱全平台高颜值终端工具 Hyper 了!
点击上方“涛哥聊Python”,选择“星标”公众号重磅干货,第一时间送达转自:运维之美不论是 macOS 还是 Windows 下,我们都不推荐使用系统自带终端。无论是可拓展性还是可编程性都被「系统自带」这样的特点限制。特别是 Windows 下的…

每天一个linux命令(8):cp 命令
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一。一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数。但是如果是在shell脚本…

samba srver on centos-7
切换到root用户安装samba,将windows登录用户admin映射到linux用户centos 安装samba并准备工作目录 yum install -y samba samba-client mkdir -p /var/samba/code chown -R centos:centos /var/samba/codetouch /etc/samba/smbusersecho "centos admin "…

以太坊数据结构MPT
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 MPT(Merkle Patricia Tries)是以太坊存储数据的核心数据结构,它是由Merkle Tree和Patricia Tree结合的一种树形结构,理解MP…

lambda在python中的用法_在python中对lambda使用.assign()方法
我在Python中运行以下代码:#Declaring these now for later use in the plotsTOP_CAP_TITLE Top 10 market capitalizationTOP_CAP_YLABEL % of total cap# Selecting the first 10 rows and setting the indexcap10 cap.loc[:10, :].set_index(id)# Calculating…

react 开发过程中的总结/归纳
1、点击元素,获取绑定该事件的父级元素,使用 e.currentTarget。e.target 获取的是,出发该事件的元素,该元素有可能是所绑定事件的元素的子元素。 2、使用 react router4 history 只能传递给儿子组件,不能传递给孙子组件…

kvm虚拟机--存储池配置梳理(转)
1.创建基于文件夹的存储池(目录) 2.定义存储池与其目录 1 # virsh pool-define-as vmdisk --type dir --target /data/vmfs 3.创建已定义的存储池 (1)创建已定义的存储池 1 # virsh pool-build vmdisk (2)查看已定义的存储池,存储池不激活无法…

区块链概况:什么是区块链
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 区块链技术自身仍然在飞速发展中,目前还缺乏统一的规范和标准。 wikipedia 给出的定义为: A blockchain —originally, b…

drx功能开启后_简单实用!小米手机中这些新功能真香
小米手机作为国产机热销品牌之一,它除了有好看的外观,还有很多隐藏的实用功能,今天小编就来和大家分享5个小米手机里你不知道的功能。Al电话助理看到陌生号码时,很多人第一反应就是挂掉,不想接听,但又担心自…