2026-04-18 22:37:45
<blockquote><p>当内存特征扫描失效、标准 Hook 无功而返时,一个开发者与 AI 如何通过多轮迭代,最终找到微信 4.1.8 的密钥派生入口。</p></blockquote><hr><h2 id="一、背景:旧方案突然失效"><a href="#一、背景:旧方案突然失效" class="headerlink" title="一、背景:旧方案突然失效"></a>一、背景:旧方案突然失效</h2><p><code>chatlog</code> 项目长期依赖一套相对稳定的 macOS 密钥提取逻辑:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vmmap 定位内存区域 → lldb dump 内存 → 搜索 fts5(% 特征字节 → 固定偏移取 32B Key → DB 验证</span><br></pre></td></tr></table></figure><p>但在用户升级到 <strong>微信 4.1.8</strong> 后,这条链路彻底断裂。运行 <code>./bin/chatlog key --debug</code> 时,程序能正常读完 94 个内存区域,然后陷入漫长的静默,最终超时退出——<strong>Key 一个都没找到</strong>。</p><hr><h2 id="二、第一回合:AI-做诊断,人类给环境"><a href="#二、第一回合:AI-做诊断,人类给环境" class="headerlink" title="二、第一回合:AI 做诊断,人类给环境"></a>二、第一回合:AI 做诊断,人类给环境</h2><p>用户把问题抛给 AI:</p><blockquote><p>“我发现现在微信版本升级了,无法获取到 key。”</p></blockquote><p>AI 的第一反应是排查代码路径。通过阅读 <code>chatlog</code> 源码,AI 迅速定位到 V4 Extractor 的两个 Pattern:</p><ul><li>Pattern 1: <code> fts5(%</code>(<code>20 66 74 73 35 28 25 00</code>)</li><li>Pattern 2: 16 个零字节(<code>00 00 ...</code>)</li></ul><p>AI 列出可能的故障点,但用户没有手动去贴日志,而是直接说:</p><blockquote><p><strong>“你直接运行看看吧。”</strong></p></blockquote><p>AI 执行 <code>./bin/chatlog key --debug</code>,观察到内存读取正常、但匹配全部失败。接着 AI 检查微信二进制:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">strings /Applications/WeChat.app/Contents/MacOS/WeChat | grep -c <span class="string">"fts5"</span></span><br><span class="line"><span class="comment"># 输出: 0</span></span><br></pre></td></tr></table></figure><p><strong>关键发现:<code>fts5</code> 在微信 4.1.8 里完全消失了。</strong> 这是旧方案失效的根因。</p><hr><h2 id="三、第二回合:人类抛出新线索,AI-转换思路"><a href="#三、第二回合:人类抛出新线索,AI-转换思路" class="headerlink" title="三、第二回合:人类抛出新线索,AI 转换思路"></a>三、第二回合:人类抛出新线索,AI 转换思路</h2><p>AI 解释了问题的本质:内存布局变了,需要找新的 Pattern 或换更稳定的 Hook 思路。此时用户提供了一个关键的外部信息:</p><blockquote><p><strong>“wx_key 你参考看看这个项目是 windows 的,但是你看看他是怎么找 key 的”</strong></p></blockquote><p>AI 读取 <code>wx_key</code> 的源码后,核心思路被点亮:</p><blockquote><p><strong>Windows 版不扫描数据,而是 Hook 函数。</strong> 它在 <code>Weixin.dll</code> 代码段里搜索机器码 pattern,定位到处理 Key 的函数,安装 Inline Hook,等微信调用时直接拦截参数。</p></blockquote><p>这是一个比内存扫描稳定得多的方案。用户接着问:</p><blockquote><p><strong>“frida hook 你能做吗”</strong></p></blockquote><p>AI 回答:能。于是进入下一轮技术攻坚。</p><hr><h2 id="四、第三回合:AI-搭建-Frida-环境,踩坑与修正"><a href="#四、第三回合:AI-搭建-Frida-环境,踩坑与修正" class="headerlink" title="四、第三回合:AI 搭建 Frida 环境,踩坑与修正"></a>四、第三回合:AI 搭建 Frida 环境,踩坑与修正</h2><p>AI 开始动手:</p><ol><li><strong>安装 Frida</strong>:<code>pip3 install frida-tools</code></li><li><strong>寻找目标函数</strong>:先尝试 Hook <code>libsqlite3.dylib</code> 的 <code>sqlite3_key</code> / <code>sqlite3_key_v2</code></li></ol><h3 id="坑-1:Frida-17-API-变更"><a href="#坑-1:Frida-17-API-变更" class="headerlink" title="坑 1:Frida 17 API 变更"></a>坑 1:Frida 17 API 变更</h3><p>写脚本时踩了第一个坑——旧教程里的 <code>Module.findExportByName</code> 在 Frida 17 中报错:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">TypeError: not a function</span><br></pre></td></tr></table></figure><p>AI 通过快速测试定位到新 API:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 正确写法</span></span><br><span class="line"><span class="title class_">Process</span>.<span class="title function_">getModuleByName</span>(<span class="string">"libsqlite3.dylib"</span>).<span class="title function_">findExportByName</span>(<span class="string">"sqlite3_key"</span>)</span><br><span class="line"><span class="comment">// 或</span></span><br><span class="line"><span class="title class_">Module</span>.<span class="title function_">getGlobalExportByName</span>(<span class="string">"sqlite3_key"</span>)</span><br></pre></td></tr></table></figure><h3 id="坑-2:sqlite3-key-根本没被调用"><a href="#坑-2:sqlite3-key-根本没被调用" class="headerlink" title="坑 2:sqlite3_key 根本没被调用"></a>坑 2:sqlite3_key 根本没被调用</h3><p>修正 API 后,Hook 安装成功。AI 让用户关闭微信,用 <code>frida.spawn</code> 重新启动并注入脚本。用户登录微信,AI 监控输出——<strong>60 秒内一个 Key 都没捕获到</strong>。</p><p>这说明 <strong>微信 4.1.8 macOS 并未使用标准 SQLCipher 的 <code>sqlite3_key</code> 接口</strong>。加密逻辑完全内嵌在 140MB 的 <code>wechat.dylib</code> 中,自己管理密钥派生和 VFS 层加解密。</p><hr><h2 id="五、第四回合:转移战场到-PBKDF2"><a href="#五、第四回合:转移战场到-PBKDF2" class="headerlink" title="五、第四回合:转移战场到 PBKDF2"></a>五、第四回合:转移战场到 PBKDF2</h2><p>既然 <code>chatlog</code> 的解密代码明确告诉我们:</p><ul><li><strong>算法</strong>:PBKDF2-HMAC-SHA512</li><li><strong>迭代次数</strong>:256000</li><li><strong>输出长度</strong>:32 字节</li></ul><p>那么微信启动数据库时,<strong>一定会在某个时刻做密钥派生</strong>。macOS 上最可能的系统入口是 <code>CommonCrypto</code> 中的 <code>CCKeyDerivationPBKDF</code>。</p><p>AI 更新 Frida 脚本,新增对 <code>CCKeyDerivationPBKDF</code> 的 Hook,并加上过滤条件:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> pbkdf2 = <span class="title class_">Module</span>.<span class="title function_">getGlobalExportByName</span>(<span class="string">"CCKeyDerivationPBKDF"</span>);</span><br><span class="line"></span><br><span class="line"><span class="title class_">Interceptor</span>.<span class="title function_">attach</span>(pbkdf2, {</span><br><span class="line"> <span class="attr">onEnter</span>: <span class="keyword">function</span>(<span class="params">args</span>) {</span><br><span class="line"> <span class="keyword">var</span> algo = args[<span class="number">0</span>].<span class="title function_">toInt32</span>(); <span class="comment">// 2 = kCCPBKDF2</span></span><br><span class="line"> <span class="keyword">var</span> prf = args[<span class="number">5</span>].<span class="title function_">toInt32</span>(); <span class="comment">// 5 = kCCPRFHmacAlgSHA512</span></span><br><span class="line"> <span class="keyword">var</span> rounds = args[<span class="number">6</span>].<span class="title function_">toInt32</span>();</span><br><span class="line"> <span class="keyword">var</span> pwdLen = args[<span class="number">2</span>].<span class="title function_">toInt32</span>();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (algo === <span class="number">2</span> && prf === <span class="number">5</span> && rounds > <span class="number">1000</span>) {</span><br><span class="line"> <span class="keyword">var</span> hex = <span class="title function_">toHex</span>(args[<span class="number">1</span>], pwdLen);</span><br><span class="line"> <span class="title function_">send</span>({<span class="attr">type</span>: <span class="string">"key"</span>, <span class="attr">key</span>: hex, <span class="attr">rounds</span>: rounds, <span class="attr">len</span>: pwdLen});</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">});</span><br></pre></td></tr></table></figure><hr><h2 id="六、第五回合:捕获成功,人类验证"><a href="#六、第五回合:捕获成功,人类验证" class="headerlink" title="六、第五回合:捕获成功,人类验证"></a>六、第五回合:捕获成功,人类验证</h2><p>脚本就绪后,用户让AI 关闭微信,运行脚本</p><p>几秒钟后,终端输出:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[KEY] via CCKeyDerivationPBKDF len=32 rounds=256000 dkLen=32</span><br><span class="line"> 24f52f003edd470e97e73fc63f4b89bb0cb9efa09b8a40d685c75c47df21fc11</span><br></pre></td></tr></table></figure><p><strong>Key 捕获成功。</strong></p><p>但还没完。用户紧接着提出验证要求:</p><blockquote><p><strong>“你根据这个 key 测试一下是否能 chatlog decrypt”</strong></p></blockquote><p>AI 立刻用捕获到的 Key 执行解密:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">./bin/chatlog decrypt \</span><br><span class="line"> --data-dir ~/Library/Containers/com.tencent.xinWeChat/Data/Documents/xwechat_files/... \</span><br><span class="line"> --data-key 24f52f003edd470e97e73fc63f4b89bb0cb9efa09b8a40d685c75c47df21fc11 \</span><br><span class="line"> --work-dir /tmp/chatlog_test</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">decrypt success</span><br></pre></td></tr></table></figure><p><strong>Key 有效,数据库成功解密。</strong></p><hr><h2 id="七、核心方法论:人机协作的分工"><a href="#七、核心方法论:人机协作的分工" class="headerlink" title="七、核心方法论:人机协作的分工"></a>七、核心方法论:人机协作的分工</h2><p>回顾整个过程,人类与 AI 的分工非常清晰:</p><table><thead><tr><th>角色</th><th>贡献</th></tr></thead><tbody><tr><td><strong>人类</strong></td><td>提供运行环境、触发问题、给出关键外部线索(<code>wx_key</code>)、决定尝试 Frida、执行微信登录操作、提出最终验证需求</td></tr><tr><td><strong>AI</strong></td><td>快速阅读大量源码做根因分析、搭建 Frida 环境、编写/调试 Hook 脚本、处理 API 兼容性问题、执行最终验证</td></tr></tbody></table><p>如果没有人类抛出的 <code>wx_key</code> 项目,AI 可能会继续在内存扫描或 sqlite3 Hook 的思路上打转;如果没有 AI 的快速代码阅读和脚本编写能力,从诊断到验证可能需要数小时甚至数天。</p><hr><h2 id="八、关键踩坑清单"><a href="#八、关键踩坑清单" class="headerlink" title="八、关键踩坑清单"></a>八、关键踩坑清单</h2><h3 id="1-特征字节依赖生命周期极短"><a href="#1-特征字节依赖生命周期极短" class="headerlink" title="1. 特征字节依赖生命周期极短"></a>1. 特征字节依赖生命周期极短</h3><p>微信 4.1.8 直接从二进制中移除了 <code>fts5</code> 字符串,导致基于内存布局的扫描方案瞬间破产。</p><h3 id="2-标准-SQLCipher-API-是个假目标"><a href="#2-标准-SQLCipher-API-是个假目标" class="headerlink" title="2. 标准 SQLCipher API 是个假目标"></a>2. 标准 SQLCipher API 是个假目标</h3><p>macOS 系统库里有 <code>sqlite3_key</code>,但微信根本不调用。Hook 之前必须做实际验证,不能凭假设行事。</p><h3 id="3-Frida-版本陷阱"><a href="#3-Frida-版本陷阱" class="headerlink" title="3. Frida 版本陷阱"></a>3. Frida 版本陷阱</h3><p>Frida 17 废弃了 <code>Module.findExportByName</code>,大量网络教程已过时。实际动手测试才能发现。</p><h3 id="4-必须在-spawn-模式下拦截"><a href="#4-必须在-spawn-模式下拦截" class="headerlink" title="4. 必须在 spawn 模式下拦截"></a>4. 必须在 <code>spawn</code> 模式下拦截</h3><p>attach 到已运行的微信会错过所有启动时的密钥派生。先 <code>pkill WeChat</code>,再用 <code>frida.spawn()</code> 启动,是捕获 Key 的必要条件。</p><hr><h2 id="九、完整可用脚本"><a href="#九、完整可用脚本" class="headerlink" title="九、完整可用脚本"></a>九、完整可用脚本</h2><p>以下脚本已保存至项目根目录 <code>wechat_key_hook.py</code>,可直接使用:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env python3</span></span><br><span class="line"><span class="keyword">import</span> frida</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line">JS = <span class="string">r"""</span></span><br><span class="line"><span class="string">function toHex(ptr, len) {</span></span><br><span class="line"><span class="string"> try {</span></span><br><span class="line"><span class="string"> var arr = new Uint8Array(ptr.readByteArray(len));</span></span><br><span class="line"><span class="string"> return arr.map(b => b.toString(16).padStart(2, '0')).join('');</span></span><br><span class="line"><span class="string"> } catch(e) { return null; }</span></span><br><span class="line"><span class="string">}</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">var pbkdf2 = Module.getGlobalExportByName("CCKeyDerivationPBKDF");</span></span><br><span class="line"><span class="string">if (pbkdf2) {</span></span><br><span class="line"><span class="string"> Interceptor.attach(pbkdf2, {</span></span><br><span class="line"><span class="string"> onEnter: function(args) {</span></span><br><span class="line"><span class="string"> var algo = args[0].toInt32();</span></span><br><span class="line"><span class="string"> var prf = args[5].toInt32();</span></span><br><span class="line"><span class="string"> var rounds = args[6].toInt32();</span></span><br><span class="line"><span class="string"> var pwdLen = args[2].toInt32();</span></span><br><span class="line"><span class="string"> if (algo === 2 && prf === 5 && rounds > 1000) {</span></span><br><span class="line"><span class="string"> var hex = toHex(args[1], pwdLen);</span></span><br><span class="line"><span class="string"> if (hex) send({type:"key", key:hex, rounds:rounds, len:pwdLen});</span></span><br><span class="line"><span class="string"> }</span></span><br><span class="line"><span class="string"> }</span></span><br><span class="line"><span class="string"> });</span></span><br><span class="line"><span class="string"> send("[+] CCKeyDerivationPBKDF hooked @ " + pbkdf2);</span></span><br><span class="line"><span class="string">}</span></span><br><span class="line"><span class="string">"""</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">"[*] Spawning WeChat..."</span>)</span><br><span class="line">pid = frida.spawn(<span class="string">"/Applications/WeChat.app/Contents/MacOS/WeChat"</span>)</span><br><span class="line">session = frida.attach(pid)</span><br><span class="line">script = session.create_script(JS)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">on_msg</span>(<span class="params">message, data</span>):</span><br><span class="line"> <span class="keyword">if</span> message[<span class="string">'type'</span>] == <span class="string">'send'</span>:</span><br><span class="line"> payload = message[<span class="string">'payload'</span>]</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">isinstance</span>(payload, <span class="built_in">dict</span>) <span class="keyword">and</span> payload.get(<span class="string">'type'</span>) == <span class="string">'key'</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">f"\n[!!!] KEY CAPTURED: <span class="subst">{payload[<span class="string">'key'</span>]}</span>"</span>)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="built_in">print</span>(payload)</span><br><span class="line"></span><br><span class="line">script.on(<span class="string">'message'</span>, on_msg)</span><br><span class="line">script.load()</span><br><span class="line">frida.resume(pid)</span><br><span class="line"></span><br><span class="line">time.sleep(<span class="number">60</span>)</span><br><span class="line">session.detach()</span><br></pre></td></tr></table></figure><hr><h2 id="十、后续展望"><a href="#十、后续展望" class="headerlink" title="十、后续展望"></a>十、后续展望</h2><p>这次实践验证了 <strong>Hook 加密算法入口</strong> 比 <strong>内存特征扫描</strong> 更稳定、更跨版本。下一步可以将 Frida Hook 封装为 <code>chatlog key</code> 的新后端(例如 <code>--frida</code> 模式),让 macOS 用户不再需要关闭 SIP 或依赖 <code>lldb</code>,大幅降低使用门槛。</p><blockquote><p><strong>一个人类开发者 + 一个能读代码、写脚本、跑验证的 AI,可以在一个小时内完成传统上需要数天的逆向工程闭环。</strong></p></blockquote><p><br /><strong>本文作者</strong>:高金<br /><strong>本文地址</strong>: <a href="https://igaojin.me/2026/04/18/%E4%BA%BA%E6%9C%BA%E5%8D%8F%E4%BD%9C%E9%80%86%E5%90%91%EF%BC%9A%E7%94%A8-AI-Frida-%E6%89%93%E9%80%9A%E5%BE%AE%E4%BF%A1-4-1-8-macOS-%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AF%86%E9%92%A5%E6%8F%90%E5%8F%96/">https://igaojin.me/2026/04/18/人机协作逆向:用-AI-Frida-打通微信-4-1-8-macOS-数据库密钥提取/</a> <br /><strong>版权声明</strong>:转载请注明出处!</p><div id="gitalk-container"></div><script src="https://cdn.bootcss.com/blueimp-md5/2.12.0/js/md5.min.js"></script><link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css"><script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script><script>var gitalkConfig = {"clientID":"935e92a5333436856348","clientSecret":"e655566eaf920d216ec6283978d67874bf0850a6","repo":"jin10086.github.io","owner":"jin10086","admin":["jin10086"],"distractionFreeMode":false,"id":"page.date","createIssueManually":false}; gitalkConfig.id = md5(location.pathname);var gitalk = new Gitalk(gitalkConfig); gitalk.render("gitalk-container"); </script>
2025-01-01 21:09:43
<h3 id="情绪价值与求真:如何平衡与应对?"><a href="#情绪价值与求真:如何平衡与应对?" class="headerlink" title="情绪价值与求真:如何平衡与应对?"></a>情绪价值与求真:如何平衡与应对?</h3><p>今天看到一个帖子,讲述了一位司机在开车时因前车突然停车,险些追尾后,害怕得哭了起来。她打电话向对象倾诉,却遭到了对方的“教训”:对方告诉她以后要注意保持车距,因为“开车时,我们无法改变别人的行为,只能改变自己。”</p><p><strong>如果你遇到类似的情况,你会怎么做呢?</strong></p><h4 id="之前的我:只追求“求真”"><a href="#之前的我:只追求“求真”" class="headerlink" title="之前的我:只追求“求真”"></a><strong>之前的我:只追求“求真”</strong></h4><p>如果是以前的我,可能会像帖子中的对象一样,选择直接解决问题。因为在我看来,你打电话给我就是为了找到解决方案。所以,我会告诉你:“保持车距,下次注意。” </p><p>但现在的我,可能会选择另一种方式。</p><h4 id="现在的我:理解情绪价值的重要性"><a href="#现在的我:理解情绪价值的重要性" class="headerlink" title="现在的我:理解情绪价值的重要性"></a><strong>现在的我:理解情绪价值的重要性</strong></h4><p>如果有人哭着或情绪不稳定地向我倾诉,我会先安慰她,让她冷静下来。等事情结束、情绪稳定之后,再谈如何避免类似的情况发生。 </p><p>这种转变,让我开始思考“情绪价值”和“求真”的区别,以及在不同场景下如何正确应对。</p><hr><h3 id="情绪价值与求真:如何定义?"><a href="#情绪价值与求真:如何定义?" class="headerlink" title="情绪价值与求真:如何定义?"></a><strong>情绪价值与求真:如何定义?</strong></h3><p>首先要明确,<strong>情绪价值和求真是对方的需求,而不是我们自以为的选择</strong>。 </p><ul><li><strong>情绪价值</strong>:让对方在当下感到舒服,给予安慰与支持,使其情绪稳定下来。这是一种“同频”的陪伴和理解。 </li><li><strong>求真</strong>:帮助对方客观地解决问题,从逻辑和事实出发,提供有效的建议。</li></ul><hr><h3 id="错误应对:情绪价值-vs-求真"><a href="#错误应对:情绪价值-vs-求真" class="headerlink" title="错误应对:情绪价值 vs 求真"></a><strong>错误应对:情绪价值 vs 求真</strong></h3><p>曾经的我,总认为无论什么情况,都应该以“求真”为优先。比如对方因为开车差点出事而情绪激动,我会告诉她“保持车距,下次注意”。<br>但仔细想想,这种建议其实显得很可笑。对方难道不知道保持车距的重要性吗?🤔 </p><h4 id="问题的本质"><a href="#问题的本质" class="headerlink" title="问题的本质"></a><strong>问题的本质</strong></h4><p>我们之所以回应对方,是因为关心,希望对方过得更好。然而,如果对方此刻需要的是情绪价值,而我们却只强调“求真”,不仅达不到预期效果,反而可能让对方感到更沮丧。</p><h4 id="情绪中的“讲道理”有用吗?"><a href="#情绪中的“讲道理”有用吗?" class="headerlink" title="情绪中的“讲道理”有用吗?"></a><strong>情绪中的“讲道理”有用吗?</strong></h4><p>想象一下,当你情绪激动、愤怒或悲伤时,有人试图和你讲道理。这样做真的能让你心情变好吗?大多数时候,只会让人更加不悦。</p><p>这并不是说“求真”不重要,而是<strong>需要分清对方当下的需求</strong>。在情绪稳定之后,再进行“求真”的讨论,效果会好很多。</p><hr><h3 id="如何判断对方需要情绪价值还是求真?"><a href="#如何判断对方需要情绪价值还是求真?" class="headerlink" title="如何判断对方需要情绪价值还是求真?"></a><strong>如何判断对方需要情绪价值还是求真?</strong></h3><h4 id="最简单的方式:直接问对方"><a href="#最简单的方式:直接问对方" class="headerlink" title="最简单的方式:直接问对方"></a><strong>最简单的方式:直接问对方</strong></h4><p>如果你不确定对方当下的需求,可以直接询问:“你是想让我安慰你,还是帮你找个解决方法?” </p><h4 id="根据对方的状态判断"><a href="#根据对方的状态判断" class="headerlink" title="根据对方的状态判断"></a><strong>根据对方的状态判断</strong></h4><ol><li><strong>对方情绪激动或低落</strong>:大概率需要情绪价值。 </li><li><strong>对方语气冷静、直奔主题</strong>:可能更倾向于“求真”。</li></ol><h4 id="避免两种极端"><a href="#避免两种极端" class="headerlink" title="避免两种极端"></a><strong>避免两种极端</strong></h4><ul><li><strong>一味给予情绪价值</strong>:当对方需要求真时,你一直安慰,会让对方觉得你不够可靠,逐渐不再向你寻求建议。 </li><li><strong>过度强调求真</strong>:当对方情绪激动时,只讲解决方案,可能会让对方感到疏离和不被理解。</li></ul><hr><h3 id="总结:学会平衡情绪价值与求真"><a href="#总结:学会平衡情绪价值与求真" class="headerlink" title="总结:学会平衡情绪价值与求真"></a><strong>总结:学会平衡情绪价值与求真</strong></h3><p>与其将两者对立,不如将它们视为不同场景下的工具。 </p><ul><li>在对方情绪激动时,先提供情绪价值,让对方冷静。 </li><li>在对方冷静之后,再切换到求真,帮助其找到解决问题的方法。</li></ul><p>这不仅能让对方感到被理解,也能在事后更有效地解决问题。 </p><p>最终,我们的目标是让对方感受到关心,而不是单纯地“解决问题”或“安慰情绪”。</p><p><br /><strong>本文作者</strong>:高金<br /><strong>本文地址</strong>: <a href="https://igaojin.me/2025/01/01/%E6%83%85%E7%BB%AA%E4%BB%B7%E5%80%BC%E4%B8%8E%E6%B1%82%E7%9C%9F%EF%BC%9A%E5%A6%82%E4%BD%95%E5%B9%B3%E8%A1%A1%E4%B8%8E%E5%BA%94%E5%AF%B9%EF%BC%9F/">https://igaojin.me/2025/01/01/情绪价值与求真:如何平衡与应对?/</a> <br /><strong>版权声明</strong>:转载请注明出处!</p><div id="gitalk-container"></div><script src="https://cdn.bootcss.com/blueimp-md5/2.12.0/js/md5.min.js"></script><link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css"><script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script><script>var gitalkConfig = {"clientID":"935e92a5333436856348","clientSecret":"e655566eaf920d216ec6283978d67874bf0850a6","repo":"jin10086.github.io","owner":"jin10086","admin":["jin10086"],"distractionFreeMode":false,"id":"page.date","createIssueManually":false}; gitalkConfig.id = md5(location.pathname);var gitalk = new Gitalk(gitalkConfig); gitalk.render("gitalk-container"); </script>
2023-09-19 15:36:24
<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>群里有人说friend tech 第一笔交易只能自己购买1笔?</p><p>我当时就反驳了他,毕竟我也算看过 friend tech 合约代码的人,合约没有限制只能买 1 笔啊</p><h2 id="废话少说,直接看代码"><a href="#废话少说,直接看代码" class="headerlink" title="废话少说,直接看代码"></a>废话少说,直接看代码</h2><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">buyShares</span>(<span class="params">address sharesSubject, uint256 amount</span>) public payable {</span><br><span class="line"> uint256 supply = sharesSupply[sharesSubject];</span><br><span class="line"> <span class="built_in">require</span>(supply > <span class="number">0</span> || sharesSubject == msg.<span class="property">sender</span>, <span class="string">"Only the shares' subject can buy the first share"</span>);</span><br><span class="line"> uint256 price = <span class="title function_">getPrice</span>(supply, amount);</span><br><span class="line"> uint256 protocolFee = price * protocolFeePercent / <span class="number">1</span> ether;</span><br><span class="line"> uint256 subjectFee = price * subjectFeePercent / <span class="number">1</span> ether;</span><br><span class="line"> <span class="built_in">require</span>(msg.<span class="property">value</span> >= price + protocolFee + subjectFee, <span class="string">"Insufficient payment"</span>);</span><br><span class="line"> sharesBalance[sharesSubject][msg.<span class="property">sender</span>] = sharesBalance[sharesSubject][msg.<span class="property">sender</span>] + amount;</span><br><span class="line"> sharesSupply[sharesSubject] = supply + amount;</span><br><span class="line"> emit <span class="title class_">Trade</span>(msg.<span class="property">sender</span>, sharesSubject, <span class="literal">true</span>, amount, price, protocolFee, subjectFee, supply + amount);</span><br><span class="line"> (bool success1,) = protocolFeeDestination.<span class="property">call</span>{<span class="attr">value</span>: protocolFee}(<span class="string">""</span>);</span><br><span class="line"> (bool success2,) = sharesSubject.<span class="property">call</span>{<span class="attr">value</span>: subjectFee}(<span class="string">""</span>);</span><br><span class="line"> <span class="built_in">require</span>(success1 && success2, <span class="string">"Unable to send funds"</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>一看代码很简单,唯一限制的就这一句</p><p><code>require(supply > 0 || sharesSubject == msg.sender, "Only the shares' subject can buy the first share");</code></p><p>这句话的意思 新注册用户,只能自己买入第一笔. 也没有限制买多少key啊…</p><h2 id="没那么简单"><a href="#没那么简单" class="headerlink" title="没那么简单"></a>没那么简单</h2><p>那别人为啥还言之凿凿说确实只能买 1 个key 呢?</p><p>严谨一点直接用forge模拟买买看就知道了.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> {<span class="title class_">TestHarness</span>} <span class="keyword">from</span> <span class="string">"../../TestHarness.sol"</span>;</span><br><span class="line"></span><br><span class="line">interface iFriendtech {</span><br><span class="line"> <span class="keyword">function</span> <span class="title function_">buyShares</span>(<span class="params">address sharesSubject, uint256 amount</span>) external payable;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">contract fuck_friend_tech is <span class="title class_">TestHarness</span> {</span><br><span class="line"> iFriendtech friendtech = <span class="title function_">iFriendtech</span>(<span class="number">0xCF205808Ed36593aa40a44F10c7f7C2F67d4A4d4</span>);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">function</span> <span class="title function_">setUp</span>(<span class="params"></span>) external {</span><br><span class="line"> cheat.<span class="title function_">createSelectFork</span>(<span class="string">"base"</span>, <span class="number">4_119_770</span>);</span><br><span class="line"> cheat.<span class="title function_">deal</span>(<span class="title function_">address</span>(<span class="variable language_">this</span>), <span class="number">100</span> ether);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">function</span> <span class="title function_">test_attack</span>(<span class="params"></span>) external {</span><br><span class="line"> friendtech.<span class="property">buyShares</span>{<span class="attr">value</span>: <span class="number">100</span> ether}(<span class="title function_">address</span>(<span class="variable language_">this</span>), <span class="number">2</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="title function_">receive</span>() external payable {}</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>你别说,还真失败了…报错为 <code>[FAIL. Reason: Arithmetic over/underflow] test_attack() (gas: 3252)</code></p><p>显示溢出报错.肯定是哪里做运算出错了</p><p>再回头看<code>buyShares</code>的代码,唯一有疑点的地方就是<code>getPrice</code></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">getPrice</span>(<span class="params">uint256 supply, uint256 amount</span>) public view <span class="title function_">returns</span> (uint256) {</span><br><span class="line"> uint256 sum1 = supply == <span class="number">0</span> ? <span class="number">0</span> : (supply - <span class="number">1</span>) * (supply) * (<span class="number">2</span> * (supply - <span class="number">1</span>) + <span class="number">1</span>) / <span class="number">6</span>;</span><br><span class="line"> uint256 sum2 = supply == <span class="number">0</span> && amount == <span class="number">1</span></span><br><span class="line"> ? <span class="number">0</span></span><br><span class="line"> : (supply - <span class="number">1</span> + amount) * (supply + amount) * (<span class="number">2</span> * (supply - <span class="number">1</span> + amount) + <span class="number">1</span>) / <span class="number">6</span>;</span><br><span class="line"></span><br><span class="line"> uint256 summation = sum2 - sum1;</span><br><span class="line"> <span class="keyword">return</span> summation * <span class="number">1</span> ether / <span class="number">16_000</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>出现问题在sum2… supply-1+amount这边就出错了…毕竟 solidity 语言有点傻,0-1=-1就直接溢出了…</p><p>好吧,原来不能第一次买多个的原因是 团队写 bug 了…改正也很简单,先+后-就可以了,这也算 solidity 开发常见的问题了,<strong>要先加后减,先乘后除</strong></p><p><code>(supply - 1 + amount) * (supply + amount) * (2 * (supply - 1 + amount) + 1) / 6;</code><br><code>(supply + amount - 1) * (supply + amount) * (2 * (supply + amount - 1) + 1) / 6;</code></p><h2 id="getPrice-分析"><a href="#getPrice-分析" class="headerlink" title="getPrice 分析"></a>getPrice 分析</h2><p>再回头看getPrice的代码.<br>估计第一眼看过去的都会比较迷糊,这到底是干啥了…当然数学大神一下就能看出来这是平方和公式</p><p>我们可以借助 ChatGPT</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">Q: (supply - 1) * (supply) * (2 * (supply - 1) + 1) / 6 这是什么公式?</span><br><span class="line"></span><br><span class="line">A: </span><br><span class="line">这个公式是用来计算一个整数变量(通常表示为"supply")的平方和平方和的一种表示方式。公式的具体步骤如下:</span><br><span class="line"></span><br><span class="line">1. 先将"supply"的值减去1,即"(supply - 1)"。</span><br><span class="line">2. 然后将该值与"supply"相乘,即"(supply - 1) * supply"。</span><br><span class="line">3. 接下来,将2乘以"(supply - 1)",即"2 * (supply - 1)"。</span><br><span class="line">4. 将上一步骤的结果加1,即"2 * (supply - 1) + 1"。</span><br><span class="line">5. 最后,将前三步骤的结果相乘,并将其除以6,即"(supply - 1) * supply * (2 * (supply - 1) + 1) / 6"。</span><br><span class="line"></span><br><span class="line">这个公式可以用来计算一系列连续整数的平方和,其中"supply"代表整数的上限。这种形式的平方和通常在数学和统计学中有多种应用,比如计算方差、概率分布等。</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>知道这是平方求和公式就简单了,这段代码就很好理解了<br><code>((supply-1+amount)的平方和 - (supply-1)的平方和) / 16000</code></p><p><br /><strong>本文作者</strong>:高金<br /><strong>本文地址</strong>: <a href="https://igaojin.me/2023/09/19/friend-tech-%E7%AC%AC%E4%B8%80%E7%AC%94%E4%BA%A4%E6%98%93%E5%8F%AA%E8%83%BD%E4%B9%B0-1-%E4%B8%AAkey/">https://igaojin.me/2023/09/19/friend-tech-第一笔交易只能买-1-个key/</a> <br /><strong>版权声明</strong>:转载请注明出处!</p><div id="gitalk-container"></div><script src="https://cdn.bootcss.com/blueimp-md5/2.12.0/js/md5.min.js"></script><link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css"><script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script><script>var gitalkConfig = {"clientID":"935e92a5333436856348","clientSecret":"e655566eaf920d216ec6283978d67874bf0850a6","repo":"jin10086.github.io","owner":"jin10086","admin":["jin10086"],"distractionFreeMode":false,"id":"page.date","createIssueManually":false}; gitalkConfig.id = md5(location.pathname);var gitalk = new Gitalk(gitalkConfig); gitalk.render("gitalk-container"); </script>
2023-09-18 23:24:45
<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>最近有准备搞一下friend tech的套利…</p><p>就写个 sql看看目前有多少人盈利.这个数据不会基于没有卖出去的key</p><p><a href="https://dune.com/queries/3032730/5041320">数据在这friend tech top profit</a></p><p>按照盈利金额排序</p><img src="/2023/09/18/friend-tech-%E5%A5%97%E5%88%A9%E5%88%B0%E5%BA%95%E6%9C%89%E5%A4%9A%E5%8D%B7/friend_tech_top_profit1.png" class="" title="friend tech top profit"><p>按照亏损金额排序</p><img src="/2023/09/18/friend-tech-%E5%A5%97%E5%88%A9%E5%88%B0%E5%BA%95%E6%9C%89%E5%A4%9A%E5%8D%B7/friend_tech_top_profit2.png" class="" title="friend tech top profit"><p>头几个盈利的肯定是机器人账号.就看看他们的数据,这一看就发现了一些问题.</p><h2 id="数据分析"><a href="#数据分析" class="headerlink" title="数据分析"></a>数据分析</h2><p>所有的数据基于block <a href="https://basescan.org/txs?block=4119771&p=10">411977</a>,真实用户<a href="https://basescan.org/address/0xda68eee4c5b10d8a574b9ec072335c583b1c67a2">0xda</a>, <a href="https://basescan.org/tx/0x0c499027221fe9195f2b0b0f9038b97e0317b19cae9e55774ceb85767bd07d56">购买 tx</a></p><h3 id="数据长这样"><a href="#数据长这样" class="headerlink" title="数据长这样"></a>数据长这样</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">fromnoncetotransactionIndexgasPricegasFeestatusnew_status</span><br><span class="line">00xa3afA500e3d88CAfA41AA7B95a8dEF7d2CBce92b941660xfF231524719dB94a0Ef08A88fC4e6939134EadE811254698872434951723127900</span><br><span class="line">10x135557B95fc164cB152e853568b25880Ba06F94A94870x4Ff30D7222B852c67A66Dc8E8d56A8cf92B8411c21254698872394616413986700</span><br><span class="line">20x8ac85761268B9Ac3fDe06d381611b64B232CEa97662930x4Ff30D7222B852c67A66Dc8E8d56A8cf92B8411c31254698872397503555135900</span><br><span class="line">30x1BA4C73e7831b8099377c0583acfF4DBE488dFc6166260x4C99B25DdD0887D88b6C1364E3Df63a3bE76A5c341254698872428797029923900</span><br><span class="line">40xa92a6331d0174c0eDC463B097E8564a492D451FA936090xfF231524719dB94a0Ef08A88fC4e6939134EadE851254698872434951723127900</span><br><span class="line">50x9a34845CCBeA93925B15F5af6d9F4aFae4EC590a937550xfF231524719dB94a0Ef08A88fC4e6939134EadE861254698872434951723127900</span><br><span class="line">60x5ED1222A1c0BdBA479B61201231f539ac131DD69641310x4C99B25DdD0887D88b6C1364E3Df63a3bE76A5c371254698872428797029923900</span><br><span class="line">70xe8C5433d6E8Fc7a2b38eF0391FabA7470c9576e451420x4C99B25DdD0887D88b6C1364E3Df63a3bE76A5c381254698872428797029923900</span><br><span class="line">80x38Cd1a8474A948a5a3e4d4b06c4069F2116DD184855740x4Ff30D7222B852c67A66Dc8E8d56A8cf92B8411c91254698872406164978583500</span><br><span class="line">90x3c2c170296446e241dE2eE39d7036254d55Df9E4936020xfF231524719dB94a0Ef08A88fC4e6939134EadE8101254698872426290299680300</span><br></pre></td></tr></table></figure><h3 id="交易数量"><a href="#交易数量" class="headerlink" title="交易数量"></a>交易数量</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> hexbytes <span class="keyword">import</span> HexBytes</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'4119771_da681.json'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> txs = json.loads(f.read())</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">filter_da68</span>(<span class="params">txs</span>):</span><br><span class="line"> flashruntxs = []</span><br><span class="line"> <span class="keyword">for</span> tx <span class="keyword">in</span> txs:</span><br><span class="line"> _<span class="built_in">input</span> = tx[<span class="string">"input"</span>]</span><br><span class="line"> <span class="keyword">if</span> <span class="string">"da68ee"</span> <span class="keyword">in</span> _<span class="built_in">input</span>:</span><br><span class="line"> flashruntxs.append(</span><br><span class="line"> {</span><br><span class="line"> <span class="string">"from"</span>: tx[<span class="string">"from"</span>],</span><br><span class="line"> <span class="string">"nonce"</span>: tx[<span class="string">"nonce"</span>],</span><br><span class="line"> <span class="string">"to"</span>: tx[<span class="string">"to"</span>],</span><br><span class="line"> <span class="string">"transactionIndex"</span>: tx[<span class="string">"transactionIndex"</span>],</span><br><span class="line"> <span class="string">"gasPrice"</span>: tx[<span class="string">"gasPrice"</span>],</span><br><span class="line"> <span class="string">"gasFee"</span>: tx[<span class="string">"gasFee"</span>],</span><br><span class="line"> <span class="string">"status"</span>: tx[<span class="string">"status"</span>],</span><br><span class="line"> }</span><br><span class="line"> )</span><br><span class="line"> <span class="keyword">return</span> flashruntxs</span><br><span class="line"></span><br><span class="line">da68 = filter_da68(txs)</span><br><span class="line"></span><br><span class="line"><span class="built_in">len</span>(da68),<span class="built_in">len</span>(txs)</span><br><span class="line"></span><br><span class="line">(<span class="number">506</span>, <span class="number">517</span>)</span><br></pre></td></tr></table></figure><p>可以看到整个区块交易<strong>517</strong> 条,其中和da68相关的 <strong>506</strong>. 就非常离谱,97.87%的用户都是来抢跑的.</p><h3 id="一共有多少机器人?"><a href="#一共有多少机器人?" class="headerlink" title="一共有多少机器人?"></a>一共有多少机器人?</h3><p>我们这边按照合约地址分一下类. 可以看到有几个头部机器人.<br>前3 占了大部分交易.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">to_count = df[<span class="string">'to'</span>].value_counts()</span><br><span class="line">to_count</span><br><span class="line"></span><br><span class="line"><span class="number">0x4C99B25DdD0887D88b6C1364E3Df63a3bE76A5c3</span> <span class="number">184</span></span><br><span class="line"><span class="number">0xfF231524719dB94a0Ef08A88fC4e6939134EadE8</span> <span class="number">161</span></span><br><span class="line"><span class="number">0x4Ff30D7222B852c67A66Dc8E8d56A8cf92B8411c</span> <span class="number">123</span></span><br><span class="line"><span class="number">0xCF205808Ed36593aa40a44F10c7f7C2F67d4A4d4</span> <span class="number">19</span></span><br><span class="line"><span class="number">0xe27ddadbC8779D01fC539Bf5BA8529D728418625</span> <span class="number">9</span></span><br><span class="line"><span class="number">0x27E8A5B043d3f58dde1c7ab96d2E3cF07558A1f1</span> <span class="number">8</span></span><br><span class="line"><span class="number">0xAfE6795A9097BbCE00fe61462d22CCeeF706a3e8</span> <span class="number">2</span></span><br><span class="line">Name: to, dtype: int64</span><br></pre></td></tr></table></figure><p>看看这几个机器人花了多少gas费,没想到发送 184 条交易才花 7.69刀.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">ethprice = <span class="number">1640</span></span><br><span class="line"><span class="keyword">for</span> to <span class="keyword">in</span> to_count.index:</span><br><span class="line"> tteth = <span class="built_in">sum</span>(df[df.to==to].gasFee)/<span class="number">1e18</span></span><br><span class="line"> ttusd = tteth*ethprice</span><br><span class="line"> <span class="built_in">print</span>(tteth,ttusd)</span><br><span class="line"></span><br><span class="line"><span class="number">0.004690181471662096</span> <span class="number">7.691897613525838</span></span><br><span class="line"><span class="number">0.004104812550636566</span> <span class="number">6.731892583043968</span></span><br><span class="line"><span class="number">0.003097893590529322</span> <span class="number">5.080545488468088</span></span><br><span class="line"><span class="number">0.000457215606189089</span> <span class="number">0.749833594150106</span></span><br><span class="line"><span class="number">0.000226412037571068</span> <span class="number">0.3713157416165515</span></span><br><span class="line"><span class="number">0.00017632952477182</span> <span class="number">0.2891804206257848</span></span><br><span class="line"><span class="number">5.0244385725274e-05</span> <span class="number">0.08240079258944936</span></span><br></pre></td></tr></table></figure><p>再看看这些机器人有多少小号<br>有发现几个菜鸟机器人…</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> to <span class="keyword">in</span> to_count.index:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'to:'</span>,to)</span><br><span class="line"> <span class="built_in">print</span>(df[df.to==to][<span class="string">'from'</span>].value_counts())</span><br><span class="line"> <span class="built_in">print</span>()</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'#'</span>*<span class="number">30</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">to: <span class="number">0x4C99B25DdD0887D88b6C1364E3Df63a3bE76A5c3</span></span><br><span class="line"><span class="number">0x5ED1222A1c0BdBA479B61201231f539ac131DD69</span> <span class="number">27</span></span><br><span class="line"><span class="number">0x1BA4C73e7831b8099377c0583acfF4DBE488dFc6</span> <span class="number">26</span></span><br><span class="line"><span class="number">0xd9E4b9579a5CF5B336E258820CC95cA34411c9D6</span> <span class="number">26</span></span><br><span class="line"><span class="number">0x27C2a598Db389b5276c0156f14B4dE75E490712F</span> <span class="number">26</span></span><br><span class="line"><span class="number">0xe8C5433d6E8Fc7a2b38eF0391FabA7470c9576e4</span> <span class="number">24</span></span><br><span class="line"><span class="number">0xDd2B7694259a83753918BF5b6dC6961fabd2FDbC</span> <span class="number">24</span></span><br><span class="line"><span class="number">0xC81a00ee6839EE0dFbF465d3C08E5F0b0291b71A</span> <span class="number">20</span></span><br><span class="line"><span class="number">0x3Ee2183b706cf381e7e4586b8063a779f1E7b7dA</span> <span class="number">11</span></span><br><span class="line">Name: <span class="keyword">from</span>, dtype: int64</span><br><span class="line"></span><br><span class="line"><span class="comment">##############################</span></span><br><span class="line">to: <span class="number">0xfF231524719dB94a0Ef08A88fC4e6939134EadE8</span></span><br><span class="line"><span class="number">0xa3afA500e3d88CAfA41AA7B95a8dEF7d2CBce92b</span> <span class="number">9</span></span><br><span class="line"><span class="number">0xa92a6331d0174c0eDC463B097E8564a492D451FA</span> <span class="number">9</span></span><br><span class="line"><span class="number">0x2bE3973950D0F1951E12C21bC7bB8e2428101Fdd</span> <span class="number">9</span></span><br><span class="line"><span class="number">0x63cEe818600f91C4473CD14cDfD9C10d918B587b</span> <span class="number">9</span></span><br><span class="line"><span class="number">0x92c21dB4a7cC0302ccCb71d444aE674Ec3980c93</span> <span class="number">9</span></span><br><span class="line"><span class="number">0xCb44B9062eB0Cd22c4C0701385e6482BF4a77759</span> <span class="number">9</span></span><br><span class="line"><span class="number">0x57ae46a097751124f8c35A86f64B4c38d2C62675</span> <span class="number">9</span></span><br><span class="line"><span class="number">0x8eE3847cAE34e6e0292dc3DF8DD3C0C69a266b97</span> <span class="number">9</span></span><br><span class="line"><span class="number">0x807db242cD37b5E2B53697842197611f51693C06</span> <span class="number">9</span></span><br><span class="line"><span class="number">0xDb6f56639AaeA09FfEA6080D31A32851524128d4</span> <span class="number">9</span></span><br><span class="line"><span class="number">0x9D94BdAf42d7906b3D3c011053ed2cBF42A1cA3f</span> <span class="number">9</span></span><br><span class="line"><span class="number">0x244Fb415A8765812B9bc5B52cA14fd83C9d7E0e5</span> <span class="number">9</span></span><br><span class="line"><span class="number">0xF689ac0322786Ac2D7245Fcd665fe120ff1d0408</span> <span class="number">9</span></span><br><span class="line"><span class="number">0x895D2d10FB9b92D0e1002c1a1bCdb90Ed42c3588</span> <span class="number">9</span></span><br><span class="line"><span class="number">0xF53010525Df586e78b14114C9cd05481E79E6C8C</span> <span class="number">9</span></span><br><span class="line"><span class="number">0x3c2c170296446e241dE2eE39d7036254d55Df9E4</span> <span class="number">9</span></span><br><span class="line"><span class="number">0x9a34845CCBeA93925B15F5af6d9F4aFae4EC590a</span> <span class="number">9</span></span><br><span class="line"><span class="number">0x36da68690F238366156890010c411394FC529cd9</span> <span class="number">8</span></span><br><span class="line">Name: <span class="keyword">from</span>, dtype: int64</span><br><span class="line"></span><br><span class="line"><span class="comment">##############################</span></span><br><span class="line">to: <span class="number">0x4Ff30D7222B852c67A66Dc8E8d56A8cf92B8411c</span></span><br><span class="line"><span class="number">0x8ac85761268B9Ac3fDe06d381611b64B232CEa97</span> <span class="number">13</span></span><br><span class="line"><span class="number">0x135557B95fc164cB152e853568b25880Ba06F94A</span> <span class="number">12</span></span><br><span class="line"><span class="number">0x38Cd1a8474A948a5a3e4d4b06c4069F2116DD184</span> <span class="number">12</span></span><br><span class="line"><span class="number">0x3547DbcD816bc17D7dE0e7e67a8B8bEE74384ACF</span> <span class="number">12</span></span><br><span class="line"><span class="number">0xa9ff99346829E7c578E6d38C2269997a2FCcEEE1</span> <span class="number">12</span></span><br><span class="line"><span class="number">0xd65eD99CB8b3b65CE378e3E5CaE545B751f4DAc6</span> <span class="number">11</span></span><br><span class="line"><span class="number">0x1F238B47ab9fD915e5852601E83c6c1358297870</span> <span class="number">11</span></span><br><span class="line"><span class="number">0x75Ff68BDe78974ab54a642fD294369447bD9Feef</span> <span class="number">10</span></span><br><span class="line"><span class="number">0xf1E7E7Ad07C046abb6e488F73c126B897892755c</span> <span class="number">10</span></span><br><span class="line"><span class="number">0x76eF08c772Db73E05fa00398746FbA31eFC5804F</span> <span class="number">10</span></span><br><span class="line"><span class="number">0x7CfE232Ed8b0acc111ec780b7Cb95C68f3CF7Aa6</span> <span class="number">10</span></span><br><span class="line">Name: <span class="keyword">from</span>, dtype: int64</span><br><span class="line"></span><br><span class="line"><span class="comment">##############################</span></span><br><span class="line">to: <span class="number">0xCF205808Ed36593aa40a44F10c7f7C2F67d4A4d4</span></span><br><span class="line"><span class="number">0x188eCF8f4290C4e5d641449B88CEf94574174972</span> <span class="number">15</span></span><br><span class="line"><span class="number">0xDa68EEe4c5b10D8A574b9ec072335c583B1C67A2</span> <span class="number">1</span></span><br><span class="line"><span class="number">0xbEbA981C5697b1CFa7c04fCB523E94bD42F79afB</span> <span class="number">1</span></span><br><span class="line"><span class="number">0x40954b9B4bAfC41Ec6387325fD0069C68674a04d</span> <span class="number">1</span></span><br><span class="line"><span class="number">0x296D3324Ee4b2316E87f965F4A04F073780f5310</span> <span class="number">1</span></span><br><span class="line">Name: <span class="keyword">from</span>, dtype: int64</span><br><span class="line"></span><br><span class="line"><span class="comment">##############################</span></span><br><span class="line">to: <span class="number">0xe27ddadbC8779D01fC539Bf5BA8529D728418625</span></span><br><span class="line"><span class="number">0xeFa4b454A64049ff93cC37b54102982ACEdf4Eae</span> <span class="number">9</span></span><br><span class="line">Name: <span class="keyword">from</span>, dtype: int64</span><br><span class="line"></span><br><span class="line"><span class="comment">##############################</span></span><br><span class="line">to: <span class="number">0x27E8A5B043d3f58dde1c7ab96d2E3cF07558A1f1</span></span><br><span class="line"><span class="number">0x8b113ad5c2b2E3ddb102305e32259c6b23D12aa3</span> <span class="number">4</span></span><br><span class="line"><span class="number">0x89B5BB48f016b809EB2eE78416550487334C1331</span> <span class="number">4</span></span><br><span class="line">Name: <span class="keyword">from</span>, dtype: int64</span><br><span class="line"></span><br><span class="line"><span class="comment">##############################</span></span><br><span class="line">to: <span class="number">0xAfE6795A9097BbCE00fe61462d22CCeeF706a3e8</span></span><br><span class="line"><span class="number">0xC1322133ACbAd823614bf79Ca9eC409fA3A7E39A</span> <span class="number">2</span></span><br><span class="line">Name: <span class="keyword">from</span>, dtype: int64</span><br><span class="line"></span><br><span class="line"><span class="comment">##############################</span></span><br></pre></td></tr></table></figure><h3 id="最后总览看看"><a href="#最后总览看看" class="headerlink" title="最后总览看看"></a>最后总览看看</h3><p>26是用户的交易.可以看到所有的 gasPrice都和用户的一样…</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 筛选出 transactionIndex 在 16-40 范围内的数据</span></span><br><span class="line">filtered_df = df[(df[<span class="string">'transactionIndex'</span>] >= <span class="number">16</span>) & (df[<span class="string">'transactionIndex'</span>] <= <span class="number">36</span>)]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 按照 transactionIndex 从小到大排序</span></span><br><span class="line">sorted_df = filtered_df.sort_values(by=<span class="string">'transactionIndex'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">highlight_row</span>(<span class="params">row</span>):</span><br><span class="line"> <span class="keyword">if</span> row[<span class="string">'transactionIndex'</span>] == <span class="number">26</span>:</span><br><span class="line"> <span class="keyword">return</span> [<span class="string">'background-color: yellow'</span>] * <span class="built_in">len</span>(row)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> [<span class="string">''</span>] * <span class="built_in">len</span>(row)</span><br><span class="line"></span><br><span class="line">highlighted_df = filtered_df.style.apply(highlight_row, axis=<span class="number">1</span>)</span><br><span class="line">highlighted_df</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="keyword">from</span>noncetotransactionIndexgasPricegasFeestatus</span><br><span class="line"><span class="number">15</span><span class="number">0xa9ff99346829E7c578E6d38C2269997a2FCcEEE1</span><span class="number">73039</span><span class="number">0x4Ff30D7222B852c67A66Dc8E8d56A8cf92B8411c</span><span class="number">16</span><span class="number">125469887</span><span class="number">24061649785835</span><span class="number">0</span></span><br><span class="line"><span class="number">16</span><span class="number">0x895D2d10FB9b92D0e1002c1a1bCdb90Ed42c3588</span><span class="number">94987</span><span class="number">0xfF231524719dB94a0Ef08A88fC4e6939134EadE8</span><span class="number">17</span><span class="number">125469887</span><span class="number">24349517231279</span><span class="number">0</span></span><br><span class="line"><span class="number">17</span><span class="number">0xDd2B7694259a83753918BF5b6dC6961fabd2FDbC</span><span class="number">3180</span><span class="number">0x4C99B25DdD0887D88b6C1364E3Df63a3bE76A5c3</span><span class="number">18</span><span class="number">125469887</span><span class="number">24287970299239</span><span class="number">0</span></span><br><span class="line"><span class="number">18</span><span class="number">0xF689ac0322786Ac2D7245Fcd665fe120ff1d0408</span><span class="number">94382</span><span class="number">0xfF231524719dB94a0Ef08A88fC4e6939134EadE8</span><span class="number">19</span><span class="number">125469887</span><span class="number">24349517231279</span><span class="number">0</span></span><br><span class="line"><span class="number">19</span><span class="number">0xC81a00ee6839EE0dFbF465d3C08E5F0b0291b71A</span><span class="number">2708</span><span class="number">0x4C99B25DdD0887D88b6C1364E3Df63a3bE76A5c3</span><span class="number">20</span><span class="number">125469887</span><span class="number">24287970299239</span><span class="number">0</span></span><br><span class="line"><span class="number">20</span><span class="number">0x244Fb415A8765812B9bc5B52cA14fd83C9d7E0e5</span><span class="number">56203</span><span class="number">0xfF231524719dB94a0Ef08A88fC4e6939134EadE8</span><span class="number">21</span><span class="number">125469887</span><span class="number">24234031585311</span><span class="number">0</span></span><br><span class="line"><span class="number">21</span><span class="number">0x5ED1222A1c0BdBA479B61201231f539ac131DD69</span><span class="number">64132</span><span class="number">0x4C99B25DdD0887D88b6C1364E3Df63a3bE76A5c3</span><span class="number">22</span><span class="number">125469887</span><span class="number">24287970299239</span><span class="number">0</span></span><br><span class="line"><span class="number">22</span><span class="number">0xeFa4b454A64049ff93cC37b54102982ACEdf4Eae</span><span class="number">6682</span><span class="number">0xe27ddadbC8779D01fC539Bf5BA8529D728418625</span><span class="number">23</span><span class="number">125469887</span><span class="number">23374811326750</span><span class="number">1</span></span><br><span class="line"><span class="number">23</span><span class="number">0x1BA4C73e7831b8099377c0583acfF4DBE488dFc6</span><span class="number">16627</span><span class="number">0x4C99B25DdD0887D88b6C1364E3Df63a3bE76A5c3</span><span class="number">24</span><span class="number">125469887</span><span class="number">24201356064763</span><span class="number">0</span></span><br><span class="line"><span class="number">24</span><span class="number">0xd65eD99CB8b3b65CE378e3E5CaE545B751f4DAc6</span><span class="number">66063</span><span class="number">0x4Ff30D7222B852c67A66Dc8E8d56A8cf92B8411c</span><span class="number">25</span><span class="number">125469887</span><span class="number">24061649785835</span><span class="number">0</span></span><br><span class="line"><span class="number">25</span><span class="number">0xDa68EEe4c5b10D8A574b9ec072335c583B1C67A2</span><span class="number">0</span><span class="number">0xCF205808Ed36593aa40a44F10c7f7C2F67d4A4d4</span><span class="number">26</span><span class="number">125469887</span><span class="number">28895454735018</span><span class="number">1</span></span><br><span class="line"><span class="number">26</span><span class="number">0x9D94BdAf42d7906b3D3c011053ed2cBF42A1cA3f</span><span class="number">55712</span><span class="number">0xfF231524719dB94a0Ef08A88fC4e6939134EadE8</span><span class="number">27</span><span class="number">125469887</span><span class="number">33659956846186</span><span class="number">1</span></span><br><span class="line"><span class="number">27</span><span class="number">0xe8C5433d6E8Fc7a2b38eF0391FabA7470c9576e4</span><span class="number">5143</span><span class="number">0x4C99B25DdD0887D88b6C1364E3Df63a3bE76A5c3</span><span class="number">28</span><span class="number">125469887</span><span class="number">25586583629689</span><span class="number">0</span></span><br><span class="line"><span class="number">28</span><span class="number">0xd9E4b9579a5CF5B336E258820CC95cA34411c9D6</span><span class="number">7656</span><span class="number">0x4C99B25DdD0887D88b6C1364E3Df63a3bE76A5c3</span><span class="number">29</span><span class="number">125469887</span><span class="number">25586583629689</span><span class="number">0</span></span><br><span class="line"><span class="number">29</span><span class="number">0x1F238B47ab9fD915e5852601E83c6c1358297870</span><span class="number">188626</span><span class="number">0x4Ff30D7222B852c67A66Dc8E8d56A8cf92B8411c</span><span class="number">30</span><span class="number">125469887</span><span class="number">25293638606288</span><span class="number">0</span></span><br><span class="line"><span class="number">30</span><span class="number">0xDb6f56639AaeA09FfEA6080D31A32851524128d4</span><span class="number">55742</span><span class="number">0xfF231524719dB94a0Ef08A88fC4e6939134EadE8</span><span class="number">31</span><span class="number">125469887</span><span class="number">25474803297854</span><span class="number">0</span></span><br><span class="line"><span class="number">31</span><span class="number">0x27C2a598Db389b5276c0156f14B4dE75E490712F</span><span class="number">8112</span><span class="number">0x4C99B25DdD0887D88b6C1364E3Df63a3bE76A5c3</span><span class="number">32</span><span class="number">125469887</span><span class="number">25586583629689</span><span class="number">0</span></span><br><span class="line"><span class="number">32</span><span class="number">0x8ac85761268B9Ac3fDe06d381611b64B232CEa97</span><span class="number">66294</span><span class="number">0x4Ff30D7222B852c67A66Dc8E8d56A8cf92B8411c</span><span class="number">33</span><span class="number">125469887</span><span class="number">25293638606288</span><span class="number">0</span></span><br><span class="line"><span class="number">33</span><span class="number">0x75Ff68BDe78974ab54a642fD294369447bD9Feef</span><span class="number">74796</span><span class="number">0x4Ff30D7222B852c67A66Dc8E8d56A8cf92B8411c</span><span class="number">34</span><span class="number">125469887</span><span class="number">25207024371812</span><span class="number">0</span></span><br><span class="line"><span class="number">34</span><span class="number">0xDd2B7694259a83753918BF5b6dC6961fabd2FDbC</span><span class="number">3181</span><span class="number">0x4C99B25DdD0887D88b6C1364E3Df63a3bE76A5c3</span><span class="number">35</span><span class="number">125469887</span><span class="number">25586583629689</span><span class="number">0</span></span><br><span class="line"><span class="number">35</span><span class="number">0x807db242cD37b5E2B53697842197611f51693C06</span><span class="number">55979</span><span class="number">0xfF231524719dB94a0Ef08A88fC4e6939134EadE8</span><span class="number">36</span><span class="number">125469887</span><span class="number">25474803297854</span><span class="number">0</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="代码以及相关数据下载"><a href="#代码以及相关数据下载" class="headerlink" title="代码以及相关数据下载"></a>代码以及相关数据下载</h2><p><a href="https://github.com/jin10086/friend-tech-bot-analyze">https://github.com/jin10086/friend-tech-bot-analyze</a></p><p><br /><strong>本文作者</strong>:高金<br /><strong>本文地址</strong>: <a href="https://igaojin.me/2023/09/18/friend-tech-%E5%A5%97%E5%88%A9%E5%88%B0%E5%BA%95%E6%9C%89%E5%A4%9A%E5%8D%B7/">https://igaojin.me/2023/09/18/friend-tech-套利到底有多卷/</a> <br /><strong>版权声明</strong>:转载请注明出处!</p><div id="gitalk-container"></div><script src="https://cdn.bootcss.com/blueimp-md5/2.12.0/js/md5.min.js"></script><link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css"><script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script><script>var gitalkConfig = {"clientID":"935e92a5333436856348","clientSecret":"e655566eaf920d216ec6283978d67874bf0850a6","repo":"jin10086.github.io","owner":"jin10086","admin":["jin10086"],"distractionFreeMode":false,"id":"page.date","createIssueManually":false}; gitalkConfig.id = md5(location.pathname);var gitalk = new Gitalk(gitalkConfig); gitalk.render("gitalk-container"); </script>
2023-09-16 22:11:33
<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>家里有台服务器,想着能远程 ssh上去改改 bug 啥的,发现无公网 ip</p><p>网上搜了一堆方案,发现都挺麻烦,有的确实不需要公网 ip,但是他却要有一台有公网 ip的服务器…</p><h2 id="实现"><a href="#实现" class="headerlink" title="实现."></a>实现.</h2><p>本次实现要感谢这篇文章 <a href="https://mp.weixin.qq.com/s/W5ykzfYpLpmxpwxH6q_P4w">使用Cloudfalre Tunnels实现内网穿透,同时突破80/443限制</a></p><p>他这篇主要讲的是80,443端口,那么同理 22 应该也没有问题</p><h2 id="操作"><a href="#操作" class="headerlink" title="操作"></a>操作</h2><ul><li>你需要注册一个域名,买一个最便宜的就行,一年 10rmb 的那种.</li><li>打开Cloudfalre控制台,依次点击Access -> Tunnels(这边记得选 0 元的,需要你绑卡才能下一步,直接关掉,重新打开控制台发现不绑卡也开通了.)</li><li>然后就是创建隧道了,可以参考官方文档 <a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/install-and-setup/tunnel-guide/remote/#1-create-a-tunnel">Set up a tunnel through the dashboard</a></li></ul><img src="/2023/09/16/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/tunnel.png" class="" title="tunnel setting"><p>Subdomain选择你想要的前缀(随便写都可以)<br>domain选择你注册的域名<br>type记得选择 ssh<br>URL 选择localhost:22(如果你把自己 sshd端口改了,那这边写你改以后的.)</p><ul><li>在服务器安装connector(设置Tunnels的时候会提示你如何安装)</li><li>还要在客户端配置 <a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/use-cases/ssh/#2-connect-as-a-user">Connect to SSH server with cloudflared access</a></li></ul><p>操作流程我复制一下</p><ul><li><p><a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/">下载 cloudflared 在客户端</a></p></li><li><p>修改SSH configuration file:<br><code>vim ~/.ssh/config</code></p></li><li><p>新增下面的内容,把下面的ssh.example.com 替换成你的,比如我就应该替换成ssh.igaojin.me<br>还需要注意的是 cloudflared的位置.记得where cloudflared看一下,如果不一致就替换成你的</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Host ssh.example.com</span><br><span class="line">ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h</span><br></pre></td></tr></table></figure></li><li><p>ssh <username>@ssh.example.com (最后可以直接 ssh 登录了.)</p></li></ul><p><br /><strong>本文作者</strong>:高金<br /><strong>本文地址</strong>: <a href="https://igaojin.me/2023/09/16/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/">https://igaojin.me/2023/09/16/内网穿透/</a> <br /><strong>版权声明</strong>:转载请注明出处!</p><div id="gitalk-container"></div><script src="https://cdn.bootcss.com/blueimp-md5/2.12.0/js/md5.min.js"></script><link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css"><script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script><script>var gitalkConfig = {"clientID":"935e92a5333436856348","clientSecret":"e655566eaf920d216ec6283978d67874bf0850a6","repo":"jin10086.github.io","owner":"jin10086","admin":["jin10086"],"distractionFreeMode":false,"id":"page.date","createIssueManually":false}; gitalkConfig.id = md5(location.pathname);var gitalk = new Gitalk(gitalkConfig); gitalk.render("gitalk-container"); </script>
2021-07-01 12:08:00
<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><ol><li>最近在B站看了一个纪录片 <a href="https://www.bilibili.com/bangumi/play/ss38716?t=3078">超级仿生</a></li></ol><blockquote><p>我们如何利用自然界最伟大的运动员 - 植物群和动物群的潜力来发挥我们的优势?我们怎样才能从自然的现象力量中获得灵感,并复制它并进化发展出超级解决方案,以满足特定的人类需求,解决我们的问题,限制或修复人类活动已经造成的损害?通过仿生学,精美的3D效果和CGI,本片讲述了一个更加理想和可持续发展的世界的故事。我们将逐步揭示我们的未来。在全球范围内,越来越多的研究人员和企业家,真正的“未来创造者”,正在利用自然界40亿年积累的智慧而获得的惊人成果,开始改变今天和明天世界。</p></blockquote><ol start="2"><li>最近国内禁止挖矿,导致BTC算力猛降.市场上蛮多二手矿机的,我最近在研究能不能抄点显卡挖挖看。</li></ol><h2 id="植物挖矿"><a href="#植物挖矿" class="headerlink" title="植物挖矿"></a>植物挖矿</h2><p>看纪录片的时候 我突然想到,植物是不会也会数学呢.</p><p>能不能用来计算hash呢.</p><p>找到这篇文章<a href="https://www.bbc.com/ukchina/trad/uk_life/2013/06/130623_life_plant_maths">植物「會數學」</a></p><blockquote><p>當植物在夜間無法通過光合作用,將二氧化碳轉化為糖和澱粉時,它們必須自身規劃好所需儲備的澱粉的量,以幫助它們在黎明到來前,有足夠的能量。</p><p>這項實驗在位於諾維奇的約翰-因斯中心進行。實驗表明,植物能如此精確地調整它所需的澱粉消耗量。這種現象只能有一種解釋,該植物一定進行了完整的數學運算,而且進行的還是除法。</p><p>負責這項研究的史密斯教授(Prof Alison Smith)向BBC表示:「植物實際上是通過一種簡單的化學方式,在做數學題。 當我們這些科學家看到這個實驗結果時,我們不僅欣喜異常,而且應該說是給嚇著了。」</p><p>他說:「植物進行的運算,是初中水平的數學計算。」</p><p>科學家們還通過建立數學模塊的方式,對植物體內如何通過除法進行運算,展開了深入研究。</p><p>在整個晚上,植物葉片內的組織計算所需的澱粉儲備。時間信息通過植物體內的生物鐘完成,與人類的生物鐘相似。</p><p>「複雜」</p><p>研究人員猜測,這項計算通過植物體內的兩種分子來完成,它們分別是代表澱粉的「S」分子、和代表時間的「T」分子。</p><p>如果「S」分子能激發澱粉儲備的臨界點,而「T」分子能阻止澱粉消耗殆盡的話,植物體內的澱粉消耗量則能通過兩個分子之間的比率設定出來。換句話說,就是用「S」除以「T」。</p><p>該研究中心的霍華德教授(Prof Martin Howard)說:「這是證明生物能進行如此複雜的算數運算的力證。」</p><p>科學家們推想,這種運算能力也在動物界被廣泛使用,比如鳥類在遷徙、或孵化過程中,能有效控制自己體內的脂肪儲備。</p></blockquote><p>所以理论上植物是会数学的.未来会不会出现养一大堆植物就是为了 计算hash呢</p><p>当然更可能的是出现植物类的计算机。</p><p><br /><strong>本文作者</strong>:高金<br /><strong>本文地址</strong>: <a href="https://igaojin.me/2021/07/01/%E6%A4%8D%E7%89%A9%E6%8C%96%E7%9F%BF/">https://igaojin.me/2021/07/01/植物挖矿/</a> <br /><strong>版权声明</strong>:转载请注明出处!</p><div id="gitalk-container"></div><script src="https://cdn.bootcss.com/blueimp-md5/2.12.0/js/md5.min.js"></script><link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css"><script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script><script>var gitalkConfig = {"clientID":"935e92a5333436856348","clientSecret":"e655566eaf920d216ec6283978d67874bf0850a6","repo":"jin10086.github.io","owner":"jin10086","admin":["jin10086"],"distractionFreeMode":false,"id":"page.date","createIssueManually":false}; gitalkConfig.id = md5(location.pathname);var gitalk = new Gitalk(gitalkConfig); gitalk.render("gitalk-container"); </script>