menu 牢记自己是菜
智能合约安全分析学习----Day5 初级Solidity理论与高级安全防护
1178 浏览 | 2020-08-05 | 阅读时间: 约 1 分钟 | 分类: 智能合约 | 标签:
请注意,本文编写于 1363 天前,最后修改于 1184 天前,其中某些信息可能已经过时。

0x1 前言

啊这!今天已经是和鼎哥失联的第四天了。难受,确实应该是我自己的问题,所有小伙伴的的Github pages都无法访问了。今天研究了一下午,我都没有找到解决方法。真的奇怪,我在Windows下使用cmd,ping鼎哥直接超时。但是在Linux使用ping鼎哥博客的时候是可以ping通的。现在我收是可以访问GitHub的(挂梯子和不挂梯子都可以),但是就是不能访问博客。明天抽空问一下师傅们吧!
今天主要是学习了Solidity的编程开发,总体给我的感觉就是与C++很像,感觉功能还要强大一点。对于本书对该语言的高级安全防护,主要是一些代码上的规范手段。比如:自动获取的地址,个函数的私用公有继承问题。


0x2 部分开发合约代码

第一部分:

pragma solidity ^0.4.20;
contract ZombieFactory{
    event NewZombie(uint zombeiID,string name, uint dna);
    uint dnaDigits = 16;
    uint dnaModulus= 10**dnaDigits;
    
    struct Zombie{
        string name;
        uint dna;
    }
    Zombie[] public zombies;
    
    mapping(uint=>address) public zombieToOwner;
    mapping(address=>uint) ownerZombieCount;
    function _createZombie(string_name,uint_dna) internal{
        Zombie z=Zombie(_name,_dna);
        uint id =zombies.push(z)-1;
        zombieToOwner[id]=msg.sender;
        ownerZombieCount[msg.sender]++;
        NewZombie(id,_name,_dna);
    } 
    function _generateRandomDna(string_str) private view returns(uint){
        uint rand=uint(keccak256(_str));
        return rang%dnaModulus;
    }
    function createRandomZombie(string_name) public{
        require(ownerZombieCount[msg.sender]==0);
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name,randDna);
    }
}

第二部分:

pragma solidity ^0.4.20;

import "./zombiefactory.sol";
contract KittyInterface{
    function getkitty(uint256 _id) external view returns(
        bool isGestating,
        bool isReady,
        uint256 cooldownIndex,
        uint256 nextActionAt,
        uint256 siringWithId,
        uint256 birthTime,
        uint256 matronId,
        uint256 sireId,
        uint256 generation,
        uint256 genes);
}
contract zombieFeeding is ZombieFactory{
    address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d;
    KittyInterface kittyContract =KittyInterface(ckAddress);
    
    function feedAndMultiply(uint _zombieId, uint _targetDna) public{
        require(msg.sender == zombietoOwner[_zombieId]);
        Zombie storage myZombie = zombies[_zombieId];
        _targetDna =_targetDna%dnaModulus;
        uint newDna =(myZombie.Dna+_targetDna)/2;
        if(keccak256(_species)==keccak256("kitty")){
            newDna = newDna -newDna%100 + 99;
        }
        _createZombie("NoName",newDna);
    }
    
    function feedOnkitty(uint _zombieId, uint _kittyId) public{
        uint kitttDna;
        (,,,,,,,,,kitttDna)=kittyContract.getkitty(_kittyId);
        feedAndMultiply(_zombieId,kitttDna);
    }
}

本章主要记录一下合约代码,具体的语法还是要自己学习的。今天为止应该是完成了合约开发的所有内容了,明天就应该可以进入合约安全分析了。虽然语言掌握的不熟练,在之后的学习中应该会和汇编语言一样,慢慢好起来的。

发表评论

email
web

全部评论 (共 1 条评论)

    Ld1ng
    2020-08-06 22:41
    呜呜呜只能我来你博客逛逛了(虽然什么也看不懂) (๑•̀ㅁ•́ฅ)