智能合约开发solidity编程语言实例

 智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战示例快速入门,用例子深入浅出智能合约开发,体会以太坊构建去中心化可信交易技术魅力。智能合约其实是“执行合约条款的计算机交易协议”。区块链上的所有用户都可以看到基于区块链的智能合约。

维基上说智能合约(英语:Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。智能合约概念于1994年由Nick Szabo首次提出。智能合同的目的是提供优于传统合同方法的安全,并减少与合同相关的其他交易成本。

由于区块链上的所有用户都可以看到基于区块链的智能合约。这也会导致包括安全漏洞在内的所有漏洞都可见,并且可能无法迅速修复。这样的攻击难以迅速解决。

插曲,2016年6月The DAOEther的漏洞造成损失5000万美元,而开发者试图达成共识的解决方案。DAO的程序在黑客删除资金之前有一段时间的延迟。以太坊软件的一个硬分叉在时限到期之前完成了攻击者的资金回收工作。以太坊智能合约中的问题包括合约编程Solidity、编译器错误、以太坊虚拟机错误、对区块链网络的攻击、程序错误的不变性以及其他尚无文档记录的攻击。

部署智能合约的经典案例有:

1. 以太坊在其区块链上实施了一种近乎图灵完备的语言,这是一个突出的智能合约框架。
2. RootStock (RSK) 是一个智能合约平台,通过侧链技术连接到比特币区块链。 RSK兼容为以太坊创造的智能合约。

一个典型的智能合约的solidity语言编程示例或者叫实例如下一个委托投票系统,做了一些备注:

官网示例原文: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 winnerfunction winnerName() public viewreturns (bytes32 winnerName_){winnerName_ = proposals[winningProposal()].name;}
}

 

如果这个代码基本能够看明白,那应该是可以直接实战开启以太坊区块链的学习进程了。

安利个教程可以通过在线编程环境实战学习:以太坊DApp实战开发

 

转载于:https://www.cnblogs.com/helloworld2018/p/8886861.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vba九九乘法表代码_VBA代码模块化--数据透视表

本周工作中&#xff0c;用到了数据透视表的操作&#xff0c;这里汇总一下&#xff0c;学习途径来自网络&#xff0c;学习成果我也乐于分享一二~&#xff0c;代码整理为模块&#xff0c;供大家举一反三&#xff0c;可以套用。① 创建数据透视表&#xff0c;及基本设置先展示数据…

IoT 、5G与边缘计算将会擦出怎样的火花?

来源&#xff1a;半导体行业观察边缘计算是数字世界中最令人兴奋的新概念之一。利用占用空间很少的微型数据中心网络&#xff0c;边缘计算使系统能够实时收集并分析重要数据&#xff0c;而不会增加现有基础设施的负担。在物联网系统中&#xff0c;通常以端到端的方式&#xff0…

js 读取php文件内容为空,PHP 读取文件内容代码(txt,js等)

PHP 读取文件内容代码(txt,js等)发布于 2014-10-15 20:15:37 | 128 次阅读 | 评论: 0 | 来源: 网友投递PHP开源脚本语言PHP(外文名: Hypertext Preprocessor&#xff0c;中文名&#xff1a;“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点&…

设计法则 - 菲茨定律 (转)

在看张小龙传时&#xff0c;无意间看到了菲茨定律这个设计法则&#xff0c;研究起来十分有趣&#xff0c;在web、app都广泛应用这个法则。而在简书上有人详细介绍了它&#xff0c;已经非常优秀了&#xff0c;所以这里放个链接&#xff0c;供参考学习。 设计法则&#xff1a; Fi…

windows安装pygame(python3.6)_当我试图安装PyGameforPython3.6时,Pip不起作用[过时]

我正在使用windows 10家庭版64位版本。我正在使用Python3.6 64位版本。我试图通过运行python的干净安装来解决这个错误&#xff0c;但这并没有解决问题。我试图通过pip安装pygame&#xff0c;但产生了以下结果&#xff1a;C:\Windows\system32>pip install pygameCollecting…

“嫦娥上月球挖土”!打破尘封44年的人类历史,中国航天实现“五个首次”...

资料来源&#xff1a;人民网、中国新闻网、智东西等物联网智库 整理发布转载请注明来源和出处3&#xff01;2&#xff01;1&#xff01;点火&#xff01;随着一声声振奋人心的倒计时&#xff0c;北京时间11月24日4时30分&#xff0c;搭载嫦娥五号月球探测器的长征五号遥五运载火…

就php干活,php可以做什么?,懂得这些技巧就够了

PHP&#xff0c;是英文超文本预处理语言Hypertext Preprocessor的缩写。PHP 是一种 HTML 内嵌式的语言&#xff0c;是一种在服务器端执行的嵌入HTML文档的脚本语言&#xff0c;语言的风格有类似于C语言&#xff0c;被广泛地运用。工具/材料电脑PHP操作方法011、运行在服务器端&…

世界上有没有无法破解的密码?揭秘量子通信 | 图图是道

来源&#xff1a;文章2020年11月23日发表于《中国日报》的微信公众号 图图是道科学顾问 / 中国科学技术大学副教授 袁岚峰监制 / 柯荣谊 联合监制 / 邢志刚 统筹 / 张若琼总策划 / 王晓莹 主笔 / 张周项 绘制 / 吴洋未来智能实验室的主要工作包括&#xff1a;建立AI智能…

python怎么发图文_用Python发一封图文并茂的邮件

最近使用了不少通讯工具的接口, 比如企业微信机器人&#xff0c;钉钉&#xff0c;微信公众号的接口(未认证的订阅公众号)&#xff0c;相对于邮件来说&#xff0c;它们的表现形式太弱。比如没有更丰富的版本方式。当然了&#xff0c;并不是说表现形式越棒就是约好的通知手段&…

evalin matlab,求解MATLAB问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这个是代码&#xff1a;syms x y z[deltafd]xlsread(附件2.xls,FDOA,B2:B290);[x1]xlsread(附件3.xls,主星星历,B2:B290);[x2]xlsread(附件3.xls,邻星星历,B2:B290);[y1]xlsread(附件3.xls,主星星历,C2:C290);[y2]xlsread(附件3.xl…

从源码的角度再看 React JS 中的 setState

在这一篇文章中&#xff0c;我们从源码的角度再次理解下 setState 的更新机制&#xff0c;供深入研究学习之用。 在上一篇手记「深入理解 React JS 中的 setState」中&#xff0c;我们简单地理解了 React 中 setState “诡异”表现的原因。 源码的部分为了保证格式显示正常就截…

科普|深度解析5G与未来天线技术

来源&#xff1a;电子万花筒过去二十年&#xff0c;我们见证了移动通信从1G到4G LTE的转变。在这期间&#xff0c;通信的关键技术在发生变化&#xff0c;处理的信息量成倍增长。而天线&#xff0c;是实现这一跨越式提升不可或缺的组件。按照业界的定义&#xff0c;天线是一种变…

python的百分号和斜杠 除_关于python:如何替换除字母,数字,正斜杠和反斜杠之外的所有字符...

想要解析文本并仅返回字母&#xff0c;数字&#xff0c;正斜杠和反斜杠&#xff0c;并用替换所有其他斜杠。是否可以仅使用一种正则表达式模式&#xff0c;而不是随后需要循环的几种正则表达式模式&#xff1f; 无法获取下面的样式&#xff0c;不能替换正斜杠。line1 "1/R…

php-curl-class,一个简单PHP CURL类

这里要说明一下...这个类的形成是参考了晚上前辈们的代码加上我自己的理解见解而集成的...前辈们的代码出处已经忘记了我在这里感谢这些前辈们给我的启发...希望这个类能给大家带来帮助...如果有不足的地方...请大家多多指点指点这是一个PHP CURL的类public $cookieFile; …

input输入数字验证

function clearNoNum(obj){obj.value obj.value.replace(/[^\d.]/g,""); //清除“数字”和“.”以外的字符obj.value obj.value.replace(/\.{2,}/g,"."); //只保留第一个. 清除多余的obj.value obj.value.replace(".","$#$").repl…

平行进化论再添证据 牙形刺远隔千里却发育模式相同

来源&#xff1a;科技日报记者&#xff1a;聂翠蓉平行进化观点认为&#xff0c;具有共同祖先的有机体即使彼此被分隔在相距千里的不同地域&#xff0c;也会以同样的方式进化。据物理学家组织网11月23日报道&#xff0c;德国爱尔兰根-纽伦堡大学和加拿大卡尔加里大学的古生物学家…

word光标一直闪动_6个一分钟就能学会的Word实用小技巧,你会几个?【Word教程】...

点击图片 1元抢购 Excel、Word、PPT全套课程你用word有几年了&#xff1f;一年、两年、三年......甚至更久&#xff1f;我相信你应该也是曾受到Word折磨的人吧&#xff01;为什么&#xff1f;因为曾有很多人都不知道Word的一些小技巧&#xff0c;因此工作上浪费了不少时间。于…

timewait php,timewait是什么意思

一、IME_WAIT的意思是结束了这次连接。二、以tcp中time_wait状态为例如下&#xff1a;1、简单来说&#xff1a;time_wait状态是四次挥手中server向client发送FIN终止连接后进入的状态。2、从上图能够看到time_wait状态存在于client收到serverFin并返回ack包时的状态 &#xff0…

DARPA新局长维多利亚·科尔曼展望未来发展

来源&#xff1a;空天防务观察2020年11月20日&#xff0c;美空军协会《空军杂志》网站报道称&#xff0c;在入主美国防部国防高级研究计划局&#xff08;DARPA&#xff09;之前&#xff0c;新任局长维多利亚科尔曼&#xff08;Victoria Coleman&#xff09;大多数职业生涯都在五…

死磕JDK源码之String

String本质是对char数组的封装 Serializable接口 实现Serializable接口的类可以被序列化 Comparable接口 实现Comparable接口的类可以支持排序&#xff0c;需要重写的compareTo方法返回两个字符串中第一个不同的字符的ASCII码差值 CharSequence接口 多态&#xff0c;String、St…