solidity 第三天

pragma solidity ^0.4.0;
contract TransTest {
      //
      address public owner;
      address[] public aaddress  = new address[](1);
      mapping(address=>uint)  amoneycount;
	  address[] public baddress  = new address[](1);
	  mapping(address=>uint)  bmoneycount;
 	  address[] public caddress  = new address[](1);
 	   mapping(address=>uint)  cmoneycount;
 	  
 	   bool isvoting = false;
 	     
 	   function TransTest() public {
 	       owner = msg.sender;
 	   }
 	   
	  function voting(uint a) payable public returns (uint){
	      //地址===》投票 金额 
	       require(isvoting);
	      if(a== 1){
		      aaddress.push(msg.sender);
		      amoneycount[msg.sender] = msg.value;
		       return aaddress.length;
	      }else if(a==2){
		        baddress.push(msg.sender);
		        bmoneycount[msg.sender] = msg.value;
		        return baddress.length;
		 }else if(a==0){
		        caddress.push(msg.sender);
		        cmoneycount[msg.sender] = msg.value;
		        return caddress.length;
		 }else{
		     return  0;
		 }
		 
	  }
	  
	  modifier isOwner(){
	      if(msg.sender==owner){
	          _;
	      }
	  }
	  function setVoting(bool isvoting2) public isOwner returns(bool){
	      isvoting = isvoting2;
	      return isvoting;
	  }
	 function getAL()public constant returns (uint){
	      return aaddress.length;
	 }
	 function getBL()public constant returns (uint){
	      return baddress.length;
	 }
	 function getCL()public constant returns (uint){
	      return caddress.length;
	 }
     function getA(uint i) public constant returns (address,uint){
          require(i<aaddress.length);
          return (aaddress[i],amoneycount[aaddress[i]]);
     }
     function getB(uint i) public constant returns (address,uint){
          require(i<baddress.length);
          return (baddress[i],bmoneycount[baddress[i]]);
     }
     function getC(uint i) public constant returns (address,uint){
          require(i<caddress.length);
          return (caddress[i],cmoneycount[caddress[i]]);
     }
     
     function clearData()  public returns (bool) {
         require(msg.sender==owner);
         aaddress.length = 0;
         baddress.length = 0;
         caddress.length = 0;
         
         return true;
         
     }
     
      
   
}
pragma solidity ^0.4.18;


interface token {
    function transfer(address _to, uint256 _value) public returns (bool);
}

contract Sale {
   
    token public tokenReward;    // 要卖的token
    address public owner;  
    
    function Sale(address addressOfTokenUsedAsReward) public{
         tokenReward = token(addressOfTokenUsedAsReward);
         owner = msg.sender;  
     }
     
     //通过eth买代币
    function buy() payable public returns(bool) {
        return tokenReward.transfer(msg.sender, msg.value*10000);
    }
    
    function () payable public {
        
    }
    //查询当前的余额  
    function getBalance() constant public returns(uint){  
          return this.balance;  
     }
     //直接转账  
    function transferETH(address _to)  public returns (bool){ 
            require(msg.sender==owner); 
            _to.transfer(this.balance);  
             return true;  
    }  
}




### Solidity 初体验第二关解析 Solidity 是一种用于编写智能合约的编程语言,其语法类似于 JavaScript 和 C++。以下是关于 Solidity 第二关的一些核心知识点及其解决方案。 #### 枚举类型的使用 枚举类型允许开发者将变量的取值范围限定在一个预定义集合中,从而提高代码的安全性和可读性。例如,在 `UserState` 合约中,我们可以通过如下方式实现状态管理[^1]: ```solidity contract UserState { enum State { Online, Offline, Unknown } State public status; function get() public view returns (State) { return status; } function set(State _status) public { status = _status; } function off() public { status = State.Offline; } function reset() public { delete status; // 将状态重置为第一个值(Online) } } ``` #### 数组的操作 在 Solidity 中,数组分为固定长度和动态长度两种形式。对于固定长度数组,一旦初始化完成,其大小不可更改;而对于动态长度数组,则支持调整尺寸以及追加新元素操作[^2]。 ##### 固定长度数组示例 ```solidity pragma solidity ^0.4.4; contract FixArray { uint[5] arr = [1, 2, 3, 4, 5]; function init() public { arr[0] = 100; arr[1] = 200; } function getArrayContent() public view returns (uint[5]) { return arr; } function calculateSum() public view returns (uint) { uint grade = 0; for (uint i = 0; i < 5; i++) { grade += arr[i]; } return grade; } } ``` ##### 动态长度数组示例 ```solidity pragma solidity ^0.4.4; contract DynamicArray { uint[] grades; function addGrade(uint value) public { grades.push(value); } function removeLastGrade() public { if (grades.length > 0) { grades.pop(); } } function getTotalGrades() public view returns (uint[]) { return grades; } function adjustSizeTo(uint newSize) public { while (grades.length > newSize) { grades.pop(); } while (grades.length < newSize) { grades.push(0); // 填充零作为占位符 } } } ``` #### 接口识别与多返回值处理 当函数具有多个返回值时,可以直接利用解构赋值的方式获取所需数据[^3]。下面展示了如何优雅地提取特定部分的信息而忽略其余内容: ```solidity function multipleReturns() internal pure returns (uint a, uint b, uint c) { return (1, 2, 3); } function processSpecificReturn() external pure returns (uint result) { (,,result) = multipleReturns(); // 忽略前两个返回值 } ``` #### 类型转换及数值溢出防护 由于区块链环境下的资源有限制,因此必须谨慎对待各种基本数据类型的边界条件。比如整数越界问题可能导致意外行为发生。这里提供了一个简单的例子说明如何正确设置初始值并避免潜在风险[^4][^5]: ```solidity // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.6.0; contract MathOperations { uint8 numA = 255; // 达到最大值 int8 numB = -128; // 达到最小负值 int numC = 255; // 正常范围内 function checkOverflow() public pure returns (bool success) { try this.addition(numA, 1) {} catch { return false; // 如果尝试增加会超出界限则失败 } return true; } function addition(uint8 x, uint y) public pure returns (uint z) { require((z = x + y) >= x, "Addition overflowed"); return z; } } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值