区块链实验九 :智能合约开发

实验报告09orz

      • 实验目的及要求
      • 实验基本原理
      • 实验实施环境
      • 实验概述
      • 实验内容
        • 在remix网页中,编译部署简单投票合约
        • (选作)深入理解solidity

实验目的及要求

了解以太坊的基本逻辑,理解以太坊的运行机理。能正确进行智能合约设计开发和部署。

实验基本原理

了解智能合约设计开发和部署。熟悉工具。

实验实施环境

Firefox & Metamask插件扩展
Remix网页:remix.ethereum.org

实验概述

在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;  
            }  
        }  
    }  
} 

运行结果截图:
区块链实验九 :智能合约开发_第1张图片

(选作)深入理解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)

你可能感兴趣的:(区块链,以太坊,remix,智能合约)