2023-09-19 15:36:24
群里有人说friend tech 第一笔交易只能自己购买1笔?
我当时就反驳了他,毕竟我也算看过 friend tech 合约代码的人,合约没有限制只能买 1 笔啊
1 |
function buyShares(address sharesSubject, uint256 amount) public payable { |
一看代码很简单,唯一限制的就这一句
require(supply > 0 || sharesSubject == msg.sender, "Only the shares' subject can buy the first share");
这句话的意思 新注册用户,只能自己买入第一笔. 也没有限制买多少key啊…
那别人为啥还言之凿凿说确实只能买 1 个key 呢?
严谨一点直接用forge模拟买买看就知道了.
1 |
import {TestHarness} from "../../TestHarness.sol"; |
你别说,还真失败了…报错为 [FAIL. Reason: Arithmetic over/underflow] test_attack() (gas: 3252)
显示溢出报错.肯定是哪里做运算出错了
再回头看buyShares
的代码,唯一有疑点的地方就是getPrice
1 |
function getPrice(uint256 supply, uint256 amount) public view returns (uint256) { |
出现问题在sum2… supply-1+amount这边就出错了…毕竟 solidity 语言有点傻,0-1=-1就直接溢出了…
好吧,原来不能第一次买多个的原因是 团队写 bug 了…改正也很简单,先+后-就可以了,这也算 solidity 开发常见的问题了,要先加后减,先乘后除
(supply - 1 + amount) * (supply + amount) * (2 * (supply - 1 + amount) + 1) / 6;
(supply + amount - 1) * (supply + amount) * (2 * (supply + amount - 1) + 1) / 6;
再回头看getPrice的代码.
估计第一眼看过去的都会比较迷糊,这到底是干啥了…当然数学大神一下就能看出来这是平方和公式
我们可以借助 ChatGPT
1 |
Q: (supply - 1) * (supply) * (2 * (supply - 1) + 1) / 6 这是什么公式? |
知道这是平方求和公式就简单了,这段代码就很好理解了((supply-1+amount)的平方和 - (supply-1)的平方和) / 16000
2023-09-18 23:24:45
最近有准备搞一下friend tech的套利…
就写个 sql看看目前有多少人盈利.这个数据不会基于没有卖出去的key
按照盈利金额排序
按照亏损金额排序
头几个盈利的肯定是机器人账号.就看看他们的数据,这一看就发现了一些问题.
所有的数据基于block 411977,真实用户0xda, 购买 tx
1 |
|
1 |
import json |
可以看到整个区块交易517 条,其中和da68相关的 506. 就非常离谱,97.87%的用户都是来抢跑的.
我们这边按照合约地址分一下类. 可以看到有几个头部机器人.
前3 占了大部分交易.
1 |
to_count = df['to'].value_counts() |
看看这几个机器人花了多少gas费,没想到发送 184 条交易才花 7.69刀.
1 |
ethprice = 1640 |
再看看这些机器人有多少小号
有发现几个菜鸟机器人…
1 |
for to in to_count.index: |
26是用户的交易.可以看到所有的 gasPrice都和用户的一样…
1 |
# 筛选出 transactionIndex 在 16-40 范围内的数据 |
2023-09-16 22:11:33
家里有台服务器,想着能远程 ssh上去改改 bug 啥的,发现无公网 ip
网上搜了一堆方案,发现都挺麻烦,有的确实不需要公网 ip,但是他却要有一台有公网 ip的服务器…
本次实现要感谢这篇文章 使用Cloudfalre Tunnels实现内网穿透,同时突破80/443限制
他这篇主要讲的是80,443端口,那么同理 22 应该也没有问题
Subdomain选择你想要的前缀(随便写都可以)
domain选择你注册的域名
type记得选择 ssh
URL 选择localhost:22(如果你把自己 sshd端口改了,那这边写你改以后的.)
操作流程我复制一下
vim ~/.ssh/config
新增下面的内容,把下面的ssh.example.com 替换成你的,比如我就应该替换成ssh.igaojin.me
还需要注意的是 cloudflared的位置.记得where cloudflared看一下,如果不一致就替换成你的
1 |
Host ssh.example.com |
ssh
2021-07-01 12:08:00
最近在B站看了一个纪录片 超级仿生
我们如何利用自然界最伟大的运动员 - 植物群和动物群的潜力来发挥我们的优势?我们怎样才能从自然的现象力量中获得灵感,并复制它并进化发展出超级解决方案,以满足特定的人类需求,解决我们的问题,限制或修复人类活动已经造成的损害?通过仿生学,精美的3D效果和CGI,本片讲述了一个更加理想和可持续发展的世界的故事。我们将逐步揭示我们的未来。在全球范围内,越来越多的研究人员和企业家,真正的“未来创造者”,正在利用自然界40亿年积累的智慧而获得的惊人成果,开始改变今天和明天世界。
最近国内禁止挖矿,导致BTC算力猛降.市场上蛮多二手矿机的,我最近在研究能不能抄点显卡挖挖看。
看纪录片的时候 我突然想到,植物是不会也会数学呢.
能不能用来计算hash呢.
找到这篇文章植物「會數學」
當植物在夜間無法通過光合作用,將二氧化碳轉化為糖和澱粉時,它們必須自身規劃好所需儲備的澱粉的量,以幫助它們在黎明到來前,有足夠的能量。
這項實驗在位於諾維奇的約翰-因斯中心進行。實驗表明,植物能如此精確地調整它所需的澱粉消耗量。這種現象只能有一種解釋,該植物一定進行了完整的數學運算,而且進行的還是除法。
負責這項研究的史密斯教授(Prof Alison Smith)向BBC表示:「植物實際上是通過一種簡單的化學方式,在做數學題。 當我們這些科學家看到這個實驗結果時,我們不僅欣喜異常,而且應該說是給嚇著了。」
他說:「植物進行的運算,是初中水平的數學計算。」
科學家們還通過建立數學模塊的方式,對植物體內如何通過除法進行運算,展開了深入研究。
在整個晚上,植物葉片內的組織計算所需的澱粉儲備。時間信息通過植物體內的生物鐘完成,與人類的生物鐘相似。
「複雜」
研究人員猜測,這項計算通過植物體內的兩種分子來完成,它們分別是代表澱粉的「S」分子、和代表時間的「T」分子。
如果「S」分子能激發澱粉儲備的臨界點,而「T」分子能阻止澱粉消耗殆盡的話,植物體內的澱粉消耗量則能通過兩個分子之間的比率設定出來。換句話說,就是用「S」除以「T」。
該研究中心的霍華德教授(Prof Martin Howard)說:「這是證明生物能進行如此複雜的算數運算的力證。」
科學家們推想,這種運算能力也在動物界被廣泛使用,比如鳥類在遷徙、或孵化過程中,能有效控制自己體內的脂肪儲備。
所以理论上植物是会数学的.未来会不会出现养一大堆植物就是为了 计算hash呢
当然更可能的是出现植物类的计算机。
2020-05-23 22:26:52
之前爬虫 驱动个selenium基本上就可以了.
但是现在各种检测浏览器环境…特别是不熟悉js的同学就更烦了
本文是直接把 selenium pyppeteer 以及正常打开浏览器 的环境差异直接列出来
这样你就可以更愉快的爬虫了(可以直接把环境全部模拟上,或者大概看看有啥,下次看人家混淆js的时候心里有个数)
就是遍历window对象,把属性全部保存成json文件
1 |
function recur(obj) { |
然后分别正常打开,selenium打开,pyppeteer打开
再查看方法的差异
下载本项目
启动本地server python -m http.server 80
正常打开最好是无痕模式,因为浏览器扩展可能会导致多出很多浏览器扩展的属性
打开网页以后 -> 打开开发者工具 -> 切换到console
然后点击copy,粘贴json到对应的文件内
selenium pyppeteer 打开可以参考getEnvironment.py
直接运行 python diff.py
就可以了.
下面可以看到
差异有
root[‘navigator’][‘webdriver’], root[‘clientInformation’][‘webdriver’] 等等
这个算是目前检测用的比较多的,还有一些其他的可以自己运行看看
1 |
selenuim 与正常环境的差异 |
2020-05-18 10:14:12
1 |
var str = "A"; |
1 |
s = 'A' |
1 |
window.btoa("python123") //cHl0aG9uMTIz |
1 |
import base64 |
https://github.com/brix/crypto-js 基于这个库
参考 https://cryptojs.gitbook.io/docs/#ciphers
1 |
var CryptoJS = require("crypto-js"); |
CryptoJS supports the following modes:
And CryptoJS supports the following padding schemes:
https://pypi.org/project/pycrypto/ 基于这个库
1 |
from Crypto.Cipher import AES |
使用的js库 是 https://github.com/travist/jsencrypt
1 |
var publicKey = `-----BEGIN PUBLIC KEY----- |
1 |
#参考 https://stackoverflow.com/questions/21327491/using-pycrypto-how-to-import-a-rsa-public-key-and-use-it-to-encrypt-a-string |