实验报告09orz
实验目的及要求实验基本原理实验实施环境实验概述实验内容在remix网页中,编译部署简单投票合约(选作)深入理解solidity实验目的及要求
了解以太坊的基本逻辑,理解以太坊的运行机理。能正确进行智能合约设计开发和部署。
实验基本原理
了解智能合约设计开发和部署。熟悉工具。
实验实施环境
Firefox & Metamask插件扩展
Remix网页:
实验概述
在remix中编写智能合约,并进行合约的测试。
实验内容
在remix网页中,编译部署简单投票合约
学习地址👉 点击直达
代码:
pragma solidity ^0.4.0; contract Ballot{struct Voter{uint weight; bool voted; uint8 vote; address delegate; } struct Proposal{uint voteCount; } address public chairperson; Proposal[] proposals; mapping(address=>Voter) voters; constructor(uint _numberProposals){chairperson = msg.sender; voters[chairperson].weight = 1; proposals.length = _numberProposals; } function giveRightToVote(address voter) public {require(msg.sender == chairperson); require(!voters[voter].voted); require(voters[voter].weight == 0); voters[voter].weight = 1; } function delegate(address to)public {Voter storage sender = voters[msg.sender]; require(!sender.voted); while(voters[to].delegate!=address(0) && voters[to].delegate != msg.sender){to = voters[to].delegate; } require(to != msg.sender); sender.voted = true; sender.delegate = to; Voter storage delegateTo = voters[to]; if(delegateTo.voted){proposals[delegateTo.vote].voteCount += sender.weight; } else {delegateTo.weight += sender.weight; } } function vote(uint8 proposal) public {Voter storage sender = voters[msg.sender]; require(!sender.voted); sender.voted = true; sender.vote = proposal; proposals[proposal].voteCount += sender.weight; } function winningProposal() public view returns(uint8 _winningProposal){uint winningCount = 0; for(uint8 prop = 0;prop < proposals.length; prop ++){if(proposals[prop].voteCount > winningCount){winningCount = proposals[prop].voteCount; _winningProposal = prop; } } } }
运行结果截图:
(选作)深入理解solidity
学习地址👉点击直达
Pragma(版本杂注)
源文件可以被版本杂注pragma所注解,表明要求的编译器的版本,例如:pragma solidity ^0.4.0;
源文件将既不允许低于0.4.0版本的编译器编译,也不允许高于(包含)0.5.0版本的编译器编译(第二个条件因使用^添加)
Import
Solidity所支持的导入语句import,语法同js(从ES6 起)非常类似
Import(导入)Import “filename”:从filename中导入所有的全局符号到当前全局作用域中Import * as symbolName from “filename”:创建一个新的全局符号symbolname,其成员均来自“filename”中全局符号Import {symbol1 as alias,symbol2} from “filename”:创建新的全局符号alias和symbol2,分别从“filename”引用symbol1和symbol2;Import “filename” as symbolName:这条语句等同于import * as symbolName from “filename”;
Solidity值类型
布尔(Booleans)整型(Integer)地址(Address)定长字节数组(fixed byte arrays)有理数和整型(Rational and Integer Literals,String literals)枚举类型(Enums)函数(Function Types)
Solidity引用类型
不定长字节数组(bytes)字符串(string)数组(Array)结构体(Struts)