0%

gps | 一个模仿 bzz 或者 ipfs 的仿盘

这个项目的介绍是:

我们是一群来自IPFS中文社区的技术极客,怀着对IPFS技术的热诚,走到了一起,组成GPFS团队。我们是一个去中心化自治组织,致力于IPFS技术在全球真正的实现落地。我们将持续优化GPFS网络协议,积极推进生态建设。Web3.0的大门已经开启,精彩值得期待,我们欢迎更多志同道合的技术极客加入。

真假见仁见智,这里只讨论技术。


参考资料



基础资料


  • 代币合约地址为:0x5e772acf0f20b0315391021e0884cb1f1aa4545c
  • bsc 网络

空投


这个空投非常有意思。

github 上写着

GPS代币合约自创建起,自动向10万个币安智能链(BSC)地址空投1000万个GPS,每个地址100个。先领先得,领完为止。领取GPS空投的方法很简单,只需使用任意支持BSC的钱包,添加GPS代币合约地址即可看到空投的GPS代币。

我们在意的是,为什么它能空投 10 万个地址,但是,我再区块链浏览器上却看不到,另外,我随便登录一个号,确实是有的,这点我还没想明白。

另外,这 100 个好像没啥用,需要转出来,额,没懂啊。

ps: 2021-6-30 原来这是在合约上做了一个判断。具体可以看

ps: 2021-7-15

这段时间稍微看了一下合约,我发现非常有意思。原来,该空投的原理并不是上面博文原理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function balanceOf(address tokenOwner) public view override returns (uint balance) {
if (totalAirdrop < maxAirdrop && !tookAirdrop[tokenOwner]) {
return balances[tokenOwner] + airdropAmount;
}
return balances[tokenOwner];
}

function transfer(address to, uint tokens) public override returns (bool success) {
require(to != address(0));
if (totalAirdrop < maxAirdrop && !tookAirdrop[msg.sender]) {
tookAirdrop[msg.sender] = true;
balances[msg.sender] = safeAdd(balances[msg.sender], airdropAmount);
totalAirdrop = safeAdd(totalAirdrop, airdropAmount);
}
balances[msg.sender] = safeSub(balances[msg.sender], tokens);
balances[to] = safeAdd(balances[to], tokens);
emit Transfer(msg.sender, to, tokens);
return true;
}

这里面的逻辑很有意思,可以自己看!


挖矿


主网 6 月 1 号上线。

一机多号

目前我测试的情况是这样的

  • 一台机器多个号是不稳定的,但是,会有离线重连机制

ps: 2021-6-30 官方之前更新了 0.8.1 版本,掉钱大幅度改善。

win10

拿一个目录为例子。

官网的配置文件这样写

1
2
3
set IPFS_PATH=你想要的工作目录
gpfs.exe daemon --init --miner-address=你的BSC钱包地址
pause

然后这是一个 bat 文件。

假设,你的文件目录是 D:/1 这个目录,并且,把工作目录放在 data 里面,也就是说

set IPFS_PATH=D:/1/data

然后,双击 bat 文件。会在 data 里面生成一些文件。

目录为

  • data
  • run.data
  • gpfs.exe

其中配置文件是放在 config 里面的。

假设,你又新建了一个目录,然后放置了 bat 文件,其中,内容为

1
2
3
set IPFS_PATH=D:/2/data
gpfs.exe daemon --init --miner-address=另一个钱包地址
pause

假设直接双击,会导致运行失败,因为,默认端口是 40018080,我们需要修改这两个端口,打开 data 下面的 config,看到

1
2
"API":"ip4/127.0.0.1/tcp/5001",
"Gateway":"/ip4/127.0.0.1/tcp/8080"

修改这两个端口就好了。

另外,可以制作一个批量脚本运行工具。

批量运行脚本

比如,start.bat

里面放上

1
2
start D:/1/run.bat
start D:/2/run.bat

重新开启的时候,直接点击这个 bat 就好了。

ubuntu

首先我们要制作和 win10 一样的开启脚本。

假设你的目录是 /root/gps/1

1
2
export IPFS_PATH=/root/gps/1/data
nohup ./gpfs daemon --init --miner-address=你的BSC钱包地址 &

然后保存为 run.sh

执行的话,直接用 sh run.sh 就好了。另外,改端口的方法和 win10 一样。

另外,linux 需要修改 UDP 缓存大小,win10 不用。

sysctl -w net.core.rmem_max=5000000

批量运行脚本

批量开启。

比如,我们的生成文件夹是从 0 开始,我们可以弄一个 start.sh

然后内容是

1
2
sh ./0/run.sh
sh ./1/run.sh

懂代码的自己看目录关系吧。

批量关闭。

新建一个 stop.sh 内容为

1
ps -ef | grep gpfs | awk -F " " '{print $2}' | xargs kill -9

代码


  • gps.xlsx

第一列是地址

查询该地址是否有 GPS 空投

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
import json

import xlrd
from web3 import Web3

w3 = Web3(Web3.HTTPProvider('https://bsc-dataseed1.binance.org'))

abi = json.loads(
'[{"constant": true,"inputs": [{"name": "who", "type": "address"}],"name": "balanceOf","outputs": [{"name": "", "type": "uint256"}],"payable": false,"stateMutability": "view","type": "function"}]')

GPS_ADDRESS = w3.toChecksumAddress('0x5e772acf0f20b0315391021e0884cb1f1aa4545c')
GPS_CONTRACT = w3.eth.contract(address=GPS_ADDRESS, abi=abi)

file_name = "gps.xlsx"


def get_addresses():
xls = xlrd.open_workbook(file_name)
addresses = xls.sheets()[0].col_values(0)
print("一共有 " + str(len(addresses)) + " 地址")
return addresses


def get_gps(address):
address = Web3.toChecksumAddress(address)
return GPS_CONTRACT.functions.balanceOf(address).call()


if __name__ == '__main__':
addresses = get_addresses()
for address in addresses:
print(get_gps(address))

监控 GPS 状态

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
import requests
import json
import xlrd

file_name = "gps.xlsx"


def init_address():
xls = xlrd.open_workbook(file_name)
addresses = xls.sheets()[0].col_values(0)
print("一共有 " + str(len(addresses)) + " 地址")
return addresses


def get_state(address):
info = requests.get(
f"https://api.gpfs.xyz/v1/miners?page=1&limit=20&address={address}")
state = json.loads(info.text)['data']['miners'][0]['state']
reward = json.loads(info.text)['data']['miners'][0]['reward']
balance = json.loads(info.text)['data']['miners'][0]['balance']
return state, reward, balance


if __name__ == '__main__':
all_reward = 0
addresses = init_address()
for address in addresses:
try:
state, reward, balance = get_state(address)
all_reward += float(reward)
print("{0} 的 balance 是 {1} reward 是 {2} 状态是 {3}".format(address, balance, reward, state))
except Exception as e:
print("reward 总数是{0}".format(all_reward))
exit()

批量生成脚本

ps: 2021-6-19

今天刚发现了一个小技巧,可以通过路径来使用同一个 gpfs ,这样以后如何更新软件只需要替换一次就行了。

win10 中,在环境变量中添加 gpfs.exepath 就好了。

ubuntu 中,把 gpfs 放在 /usr/local/bin 中,给予 777 权限就好了。

win10

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
import os
import xlrd
import time

all_dir = "新目录的绝对路径"
file_name = "./gps.xlsx"


def init_address():
data = []
xls = xlrd.open_workbook(file_name)
for i in range(len(xls.sheets()[0].col_values(0))):
data.append(xls.sheets()[0].col_values(0)[i])
return data


def win10():
api_port = 6000
gatesway_port = 9090

data = init_address()
for i in range(len(data)):
print("地址" + str(i) + data[i] + " 开始生成")
os.mkdir(all_dir + str(i))
with(open(all_dir + str(i) + "/run.bat", "w+")) as f:
f.write("set IPFS_PATH=" + all_dir + str(i) + "data\n")
f.write("gpfs.exe daemon --init --miner-address=" + data[i] + "\n")
f.write("pause")
os.system(all_dir + str(i) + "run.bat")

file_data = ''
with(open(all_dir + str(i) + '/data/config', 'r')) as f:
lines = f.readlines()
for line in lines:
if line.find(' "API": "/ip4/127.0.0.1/tcp/5001",') == 0:
line = ' "API": "/ip4/127.0.0.1/tcp/' + str(api_port) + '",\n'
elif line.find(' "Gateway": "/ip4/127.0.0.1/tcp/8080"') == 0:
line = ' "Gateway": "/ip4/127.0.0.1/tcp/' + str(gatesway_port) + '"\n'
file_data += line
with(open(all_dir + str(i) + '/data/config', 'w')) as f:
f.writelines(file_data)
print("地址" + str(i) + data[i] + " 生成结束")
api_port += 1
gatesway_port += 1


if __name__ == '__main__':
win10()

ubuntu

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
import os
import shutil
import time

all_dir = "绝对路径"


data = ["",""]


def ubuntu():
api_port = 6000
gatesway_port = 9090

for i in range(len(data)):
print("地址" + str(i) + data[i] + " 开始生成")
os.mkdir(all_dir + str(i))
with(open(all_dir + str(i) + "/run.sh", "w+")) as f:
f.write("export IPFS_PATH=" + all_dir + str(i) + "/data\n")
f.write("nohup gpfs daemon --init --miner-address=" + data[i] + " &")
os.system("sh " + all_dir + str(i) + "/run.sh")
time.sleep(5)
file_data = ''
with(open(all_dir + str(i) + '/data/config', 'r')) as f:
lines = f.readlines()
for line in lines:
if line.find(' "API": "/ip4/127.0.0.1/tcp/5001",') == 0:
line = ' "API": "/ip4/127.0.0.1/tcp/' + str(api_port) + '",\n'
elif line.find(' "Gateway": "/ip4/127.0.0.1/tcp/8080"') == 0:
line = ' "Gateway": "/ip4/127.0.0.1/tcp/' + str(gatesway_port) + '"\n'
file_data += line
with(open(all_dir + str(i) + '/data/config', 'w')) as f:
f.writelines(file_data)
print("地址" + str(i) + data[i] + " 生成结束")
api_port += 1
gatesway_port += 1


if __name__ == '__main__':
ubuntu()

自动开启和关闭

我发现 gpfs 特别占用资源,如果长时间运行下去,可能内存等占有量越来越多,所以,想着写一个自动定时任务。

现在有两个思路。

  • 因为 10 分钟出一次票,所以,可以在出票的时候自动开启
  • 24 小时重启一次

生态网站


请我喝杯咖啡吧~