<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>yuanmomo</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>http://yuanmomo.net/</id>
  <link href="http://yuanmomo.net/" rel="alternate"/>
  <link href="http://yuanmomo.net/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, yuanmomo</rights>
  <subtitle>Love Crystal.Ye</subtitle>
  <title>
    <![CDATA[Y&Y]]>
  </title>
  <updated>2026-06-21T21:12:41.654Z</updated>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="Sweden" scheme="http://yuanmomo.net/categories/Sweden/"/>
    <category term="Life" scheme="http://yuanmomo.net/categories/Sweden/Life/"/>
    <category term="Mac" scheme="http://yuanmomo.net/tags/Mac/"/>
    <category term="Sweden" scheme="http://yuanmomo.net/tags/Sweden/"/>
    <content>
      <![CDATA[<h1 id="垃圾苹果">1. 垃圾苹果</h1><p>最近被我的 M3 Max 的重启问题快折磨哭了。从 5 月份开始我就记录每次 panic 的日志，到现在至少重启了 5 次。让 ChatGPT 分析每次日志，都说是硬件问题，需要苹果维修。</p><p>然后我去了两次马尔默苹果店的天才吧，都是跑个诊断，结果显示没有问题，啥也解决不了。各种交涉还是不给修。最后我参考站内小伙伴的做法，给 Cook 发了邮件。结果还真有爱尔兰的苹果人员联系我，但他们仍然需要先确认到底是硬件问题还是软件问题。所以要求我下次电脑 panic 后马上联系他们，他们会在 24 小时内联系我，收集电脑日志和数据，交给别的部门分析，再根据结果决定如何跟进我的 case 。</p><span id="more"></span><p>现在这台电脑上基本啥软件都不敢装，白白浪费着 64G 内存，搞得我都不知道该拿它干啥。隐约记得前几次都是打字的时候 panic ，于是干脆来 V 站分享一下三周年的记录。</p><h1 id="压力">2. 压力</h1><p>今年 9 月 9 号是到瑞典三周年，11 月 9 号是公司三周年。工作生活都还是老样子，一切尚可，要是分享，大概也跟去年的类似。</p><p>作为润人，只要一天没拿到身份，压力就一直在，而且越接近申请，反而越紧张。总担心自己已经走了 99%，却倒在最后 1% 上。除了身份的压力，剩下就是对父母的担心，始终不知道以后该如何安顿他们。对润人第一代来说，大概这是最棘手的部分。</p><h1 id="媳妇">3. 媳妇</h1><p>从去年到今年，最大的事情就是媳妇的学习。她先完成了瑞典语高中水平，然后申请了牙科护士专业。本来要到明年 9 月才毕业，但她今年 9 月去实习的时候，诊所觉得她表现很好，想提前签她。不过因为还没毕业，只能先签兼职合同（大概 80 SEK&#x2F;h ）。</p><p>但这已经很不错了——说明诊所认可她，她也有能力。只要顺利毕业，再碰到诊所招人，她的机会就很大。我自己还调侃说，在瑞典我已经包养她三年了，后面该她包养我了 😂😂。</p><h1 id="宝宝">4. 宝宝</h1><p>宝宝在幼儿园表现也很好，瑞典语不用说，而且幼儿园有几个英语家庭的小朋友，她也慢慢学了点简单的英语。最担心的就是中文。我试着多跟她说中文，用中文问她学校的事情，但她总回答“我不知道”。她中文词汇量不够，不知道怎么表达，而我们平时对她说的中文也有限。</p><p>暂时还没想好怎么办。可能接爸妈来一段时间，也可能每年带她回国一个月，让她多跟国内小朋友玩。</p><p>最近越来越喜欢看宝宝小时候的照片和视频。每次看都觉得自己买硬盘、折腾 NAS 都值得。真的很想多记录她的瞬间、视频、照片，等闲下来再慢慢看。小孩真的是一不注意就长大了好多。</p><h1 id="工作">5. 工作</h1><p>工作上没啥特别，不加班，下午 4~5 点就下班。偶尔我得 4 点半先去接宝宝。如果媳妇接，我就晚点下班。目标就是每周保证一些进度，然后凑够 40 小时。团队嘛，就是草台班子。本来打算分享一些近一年的趣事，但现在还没拿身份，还是暂时低调点，等以后有机会再说。</p><p>前阵子和印度同事及领导有点小摩擦。本来打算悄悄找工作，找到了就直接走。但领导察觉到了不对劲，约我视频聊天，告诉我要用瑞典的方式解决问题。</p><p>最后我把实话告诉他，他对自己做得不好的地方向我道歉（第二周的晨会他还再次公开道歉，说最近忽略了我的感受）。但我和印度同事之间的问题，要我自己去沟通，这也是对方需要改进的地方。</p><p>后来我也和印度同事开了视频，他承认了自己的问题，说也正是因为这些原因，他没啥朋友。之后他会注意，毕竟在瑞典了，不能把印度的坏习惯带过来。</p><p>算是 happy ending 了吧。继续熬过明年的那次裁员，前途就光明了。</p><h1 id="假期">6. 假期</h1><p>3 月回国休息了一个月。马上 12 月 13 号还要被强制休假到元旦后再回公司（因为预算没了，90% 外包都必须休）。想到也挺好笑：三周的时间，外包公司也没啥事给我们做，就让我们强制休假。有年假的用年假，没年假的先借，以后再补（工作满几年就不用补了）。</p><h2 id="圣诞节">6.1. 圣诞节</h2><p>我媳妇是江西赣州人，我是二婚。19 年在珍爱网刚开始聊天时，我就说了：没有婚礼，也不会有彩礼，但我会带她去一趟新西兰，或者来北欧看极光。来瑞典三年了，我们还没正式出去旅行过，现在宝宝也大了，今年圣诞就定了去 Tromsø 看极光，算是兑现承诺，也体验一波极夜的生活。</p><p>我真的很感谢她当年的信任：没有婚礼，没有彩礼，她还是决定跟我在一起。现在想想，从 2 月 13 日在珍爱网上说第一句话，到 6 月 5 号领证，再到现在宝宝 4 岁 4 个月，别人可能都觉得我是珍爱网的托儿了。</p><p>生活总会有意想不到的插曲。买完机票才发现媳妇签证过期。9 月底重新申请了，但今年太离谱，到现在连 case officer 都还没分配。如果到时候没拿到签证，就只能我和宝宝去，她明年再补了。</p><h1 id="问题">7. 问题</h1><p>现在，很多人开始讨论瑞典如今的各种问题。确实，我的邻居、同事也都在聊——现在的瑞典和十年前、二十年前相比变化很大。尤其是一些老移民，会跟我们讲以前的瑞典是什么样的，再对比现在，落差确实明显。</p><ul><li>北欧最多的枪击案</li><li>黑帮火拼、毒品泛滥</li><li>爆炸案（今晚才和一位瑞典奶奶吃饭，她家楼下年初就发生过一起爆炸）</li><li>经济越来越差</li><li>物价上涨、通胀严重</li><li>工作越来越难找（前几天我投了份简历，对方回我：一个岗位收到了 220 多份申请）</li><li>看病难，各种排队</li><li>还有一直被诟病的漫长又难熬的冬天</li></ul><p>不好的地方可以列一大堆。这么多问题，还会有人愿意来吗？那我和家人的未来又该怎么办？ 说实话，我不知道，也没想过太多。 我唯一想过的是：明确自己想要什么样的生活，然后努力去追求就好。</p><p>我相信努力，喜欢挑战，也憧憬未来。人虽然不能胜天，罗翔老师也说他不怎么相信“天道酬勤”，但努力是唯一握在自己手里的事情。除此之外，我还能做什么呢？</p><p>Life is like a box of chocolates, you never know what you’re gonna get.</p><h1 id="最后">8. 最后</h1><p>现在有大把的时间，自己也学者做烘培了<br><img src="https://img.tupm.net/2025/11/CB0803AC394FA20842F1C7E79EECDC53.jpeg" alt="rhubarb-pie"><br><img src="https://img.tupm.net/2025/11/90FC1D0B636B33C37D5CF3C4CC16259C.jpeg" alt="barbecue"><br><img src="https://img.tupm.net/2025/11/30DEE0D62F45FBCBE58318EBA16BB13E.jpeg" alt="onsered Gardens"><br><img src="https://img.tupm.net/2025/11/916798B2D648712A19CCDCA6283B6BB8.jpeg" alt="beach"><br><img src="https://img.tupm.net/2025/11/D25AB33F14441A3AD8E89E23EA23ABC6.jpeg" alt="Slottsskogen"><br><img src="https://img.tupm.net/2025/11/2E08988A5872D20B306FDF0ABD2B0C48.jpeg" alt="morning"><br><img src="https://img.tupm.net/2025/11/F64FF2AD79CD49D39CE3C9EBB568E52B.jpeg" alt="Friday"></p>]]>
    </content>
    <id>http://yuanmomo.net/2025/12/02/end-of-2025/</id>
    <link href="http://yuanmomo.net/2025/12/02/end-of-2025/"/>
    <published>2025-12-02T12:34:06.000Z</published>
    <summary>
      <![CDATA[<h1 id="垃圾苹果">1. 垃圾苹果</h1><p>最近被我的 M3 Max 的重启问题快折磨哭了。从 5 月份开始我就记录每次 panic 的日志，到现在至少重启了 5 次。让 ChatGPT 分析每次日志，都说是硬件问题，需要苹果维修。</p>
<p>然后我去了两次马尔默苹果店的天才吧，都是跑个诊断，结果显示没有问题，啥也解决不了。各种交涉还是不给修。最后我参考站内小伙伴的做法，给 Cook 发了邮件。结果还真有爱尔兰的苹果人员联系我，但他们仍然需要先确认到底是硬件问题还是软件问题。所以要求我下次电脑 panic 后马上联系他们，他们会在 24 小时内联系我，收集电脑日志和数据，交给别的部门分析，再根据结果决定如何跟进我的 case 。</p>]]>
    </summary>
    <title>感谢苹果垃圾的品控，让我有时间分享一下最近一年的生活</title>
    <updated>2026-06-21T21:12:41.654Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="immigration" scheme="http://yuanmomo.net/categories/immigration/"/>
    <category term="Sweden" scheme="http://yuanmomo.net/categories/immigration/Sweden/"/>
    <category term="sweden" scheme="http://yuanmomo.net/tags/sweden/"/>
    <content>
      <![CDATA[<h1 id="前言">1. 前言</h1><p>下个月 9 号就入境瑞典满 2 周年，越来越喜欢瑞典的生活，小崽崽也很幸运地收获了一对瑞典“爷爷奶奶”。</p><p>在此分享一些在瑞典的生活给需要的人。如果不喜欢润学的人，请直接略过，本人就此谢过。</p><h1 id="生活">2. 生活</h1><p>生活上，确实没有什么压力，唯一的压力就来自于还没有身份，担心自己可能随时会失业，然后找不到工作，被迫回国。其它闲暇的时候，看看窗外的蓝天白云，出门走走，爬爬山，逛逛湖，摘摘蓝莓，约朋友一起带小孩，一起吃饭。就很普通，平淡的生活。</p><h2 id="衣">2.1. 衣</h2><p>现在还穿着 20 年双 11 在优衣库买的裤子，迪卡侬 19.9 和 29.9 一件的体恤。<br>在瑞典，只买 outlet，宝宝有一半的衣服买的二手，鞋子都是买的亚瑟士的打折款，价格不算贵。对于穿戴，我跟我媳妇都没什么追求，好不好看，怎么搭配，不怎么关心，只要暖和，价格合理就行。</p><h2 id="食">2.2. 食</h2><p>几乎天天在家做饭，偶尔出去玩的时候外面吃。主要是中餐，米饭为主。偶尔去邻居家吃点瑞典餐。一个月，一家人 3～5k 克朗（2k～3.5k RMB）的生活费了。</p><h2 id="住">2.3. 住</h2><p>买了一个小公寓，四层顶楼，附近有山，有蓝莓，幼儿园就在旁边，住着很舒服。<br>自从看了朋友买的别墅，对别墅没有太深的执念了。不是说不好，而是我发现我根本不愿意打理。就像我对门女邻居，父母去世的时候，留下的别墅，她给卖了，然后就住在我们对门的公寓。</p><h2 id="行">2.4. 行</h2><p>平时坐公交，就是比较费时间。等媳妇今年拿了驾照，明年买个二手的卡罗拉，也算是人生的第一辆车。车，除了代步，没啥别的需求。</p><blockquote><p>我之前在深圳湾一号上班的时候，天天穿个沃尔玛 29.9 的拖鞋，迪卡侬 19.9 的体恤，迪卡侬 40 块钱的短裤。当时 HR 跟我去喝咖啡，从旁边的 5 星级酒店路过的时候，HR 说真怕那个保安把我拦下来😅。</p></blockquote><h2 id="日常开销">2.5. 日常开销</h2><p>我一个人挣钱，养一家人，还有点剩。供着房贷，物业费（4.7k 克朗，折合 3.3k RMB），交一点保险和养老金存款，每个月还能剩下一点点。</p><blockquote><p>上次在 v2 说一年存了 3.5w RMB，被人还嘲讽了。哈哈，我自己觉得无所谓，给我钱我都不知道拿来做啥。出去旅游，我这种粗人，没啥文化，除了拍几张照片发个朋友圈，别的我真不知道干啥。在家躺着不好么？</p></blockquote><p>宝宝上托班免费，媳妇上 SFI 学瑞典语免费（还能算个学生，偶尔买个学生票），看病不是很清楚，我看过好几次，每次去 100 KR，至于说的排队，着急可以去急诊。<br>养老肯定不担心，有一个 ITP，自己都能看到自己的养老金，可以选择按比例放在不同的银行管理。</p><p>所以经济上，我没感觉到什么压力，不担心那几个老生常谈的问题：养老，医疗，和教育。</p><blockquote><p>国内有一套小公寓，没有房贷，每个月大概 5k 的房租，爸妈的养老钱算是够了，也给爸妈买了各种保险，应该不用我单独给父母准备一笔风险金了。</p></blockquote><h2 id="邻居">2.6. 邻居</h2><p>我运气比较好，遇到了很适合的瑞典邻居，经常一起吃饭。昨天跟瑞典男邻居烧烤，今晚女邻居在我家吃饭。他们都帮我们带宝宝，宝宝把他们当成了“爷爷奶奶”。上周六还一起去湖边野餐，散步，整一个“家庭”游。</p><h1 id="工作">3. 工作</h1><p>没有年终，没有 KPI，就两个字：不卷。</p><h2 id="时间">3.1. 时间</h2><p>周一，四，五，去办公室，早上 8:30am 到公司，先跟同事和领导一起聊会天，9 点多开始干活；11:00am 去吃午饭，一个半小时；3:00pm 左右会去 fika，再聊会儿天；4:00pm 左右准时下班，绝对不会超过 4:30pm。满打满算，工作时间差不多 5 个小时。</p><p>周二，三在家办公，早 9:00am 到 5:00pm。最近因为是夏天，就会出去走走，买买菜，晒晒太阳。昨天天气不错，跟邻居约了下午 5:30pm 在楼下烧烤（PS：烤鸡翅真的很好吃）。</p><p>其次，平时的工作时间很自由，如果白天有事情耽搁了，晚上多工作一会儿补回来就好，压根儿没有人来检查你的出勤，全靠自觉。</p><h2 id="氛围">3.2. 氛围</h2><p>一个字：爽。</p><p>遇到了很好很好的领导和同事，他们都很理解我带小孩。工作好，只要我有进度，几乎都可以自己安排自己的时间。</p><p>我以前做开发，没做过测试，所以领导和同事，经常跟我分享，教我测试的东西。在团队，不管什么时候，遇到什么问题，总会有人很积极的帮忙解决。</p><p>但是我感觉，好像有两三个人，对我不是很待见，我相信我感觉没啥问题。不过好在无所谓，我工作跟他们毫无交集，要是真的遇到点问题，让领导去沟通就好了。</p><h2 id="加班">3.3. 加班</h2><p>工作了快两年，一共加了 16 个小时，双倍调休。PM 提醒我要双倍休假（PS，PM 是瑞典华裔，祖上是客家人）。<br><img src="https://img.tupm.net/2024/08/7E57E213E30B188021FB90F9C5E09E15.jpg"><br>除此之外，我周末从来不加班，没有 24 小时 oncall 的压力。这次暑假休了 3 周的假期，带着一个国内过来的朋友，去挪威，丹麦和斯德哥尔摩逛一逛，完全不用带电脑，没有一个工作电话，就一个字：爽。</p><p>从此让我分清楚了：工作是工作，生活是生活。</p><h2 id="考核">3.4. 考核</h2><p>我是以顾问（俗称外包）的方式在雇主那里上班，没有年终奖，也就没有 KPI 考核。</p><p>活就在那里，谁有空，谁做就行。我曾经，花了一个星期的时候，查了一个 BUG；昨天一天又查了一天的 BUG；去年 4 月份提了一个需求（内部自动化工具），到上周五，快一年半了，做了 2&#x2F;3，还剩 1&#x2F;3，预计再过 3 个月能搞完第一个版本。这些东西，在阿里，想都不要想了。阿里的明言：改 BUG 不算 KPI 的。</p><p>国内做了十年 Java 开发，22 年 9 月来的时候，不好找工作了，没找到开发，反而做了一名自动化测试。做得好不好先不说，反正今年 7-1 号，我的报价涨了 60KR&#x2F;h。当然，这个钱跟我没关系，不是给我的，是给我的外包雇主的，我的工资不变，但是侧面说明我应该做的还不差。</p><h1 id="不好的地方">4. 不好的地方</h1><p>要说瑞典不好的地方，对我来说：</p><ul><li>离家太远，回去一趟，挺累的，前几天媳妇和宝宝回瑞典，全程 27 个小时的路程。</li><li>离以前的好朋友太远了，不能像之前那样经常出来喝咖啡，听我吹牛逼了。</li></ul><p>除此之外，有很多公认的不好的地方：</p><ul><li>医疗排队，我带我女儿去急诊。当然，这边很多检查不是你想做就能做，但是如果能提供国内的医疗证明，还是可以在瑞典做的，比如：肺结节做螺旋 CT。</li><li>人力成本高，我觉得我女儿以后当个服务员也行，当个水电工，当个木工，当个水管工，都行，至少她挣的钱，她一个人肯定够花了；</li><li>外面吃饭太贵，我几乎自己做；</li><li>老外歧视，我圈子不大，我遇到的那么多来自世界各地的人，都非常非常好；</li><li>消费高，每个月家庭吃喝最多就 5k 克朗；</li><li>没有夜生活，我本来就不懂生活，不爱出去玩，这不更好么？</li></ul><p>确实想不起来别的。反正，生活中，我在意的地方，瑞典都能满足我的需求；瑞典有的问题，大多是我不在意的地方。所以，我个人很喜欢这边的生活。</p><p>如果瑞典的生活，不是我想要的，我完全可以回到深圳。深圳有自己的公寓，跟以前的几个领导关系都很好，找份工作，或者远程（就这几天前领导公司还招人来着）都不会很难，确实找不到回去的理由了。</p><h1 id="生活照">5. 生活照</h1><p><img src="https://img.tupm.net/2024/08/B8102FA9569BD8C2B4D9B94C29978496.jpg" alt="b8dfacdc-fad5-4c6c-a2f1-d4abe45022e2"><br><img src="https://img.tupm.net/2024/08/3593EC757119097339B17947718336E4.jpg" alt="IMG_1228"><br><img src="https://img.tupm.net/2024/08/DC3A770227AED0A8D8FCB4AD5B16E7ED.jpg" alt="43627dd6-34fc-499e-9a47-c640329e0970"><br><img src="https://img.tupm.net/2024/08/ED465CEAC4ECAF5409159D7653CEE156.jpg" alt="IMG_9894"><br><img src="https://img.tupm.net/2024/08/8A4A99D48872AEF049FBCB18629D36FB.jpg" alt="EE647231-1891-4D60-9350-77BDA3B9690C"><br><img src="https://img.tupm.net/2024/08/6B9039629F1BFF120920BF5F273E587D.jpeg" alt="IMG_9920"><br><img src="https://img.tupm.net/2024/08/A66F58DCC07FCB0A3F0DA0AD54479DD1.jpg" alt="07C0E7D9-91FB-4448-8FA7-0541C68E91E1"><br><img src="https://img.tupm.net/2024/08/C30E42E0AB4B782F7F3696683EF1DD7F.jpg" alt="IMG_9947"></p>]]>
    </content>
    <id>http://yuanmomo.net/2024/08/12/second-trip-to-sisj%C3%B6n/</id>
    <link href="http://yuanmomo.net/2024/08/12/second-trip-to-sisj%C3%B6n/"/>
    <published>2024-08-12T13:18:49.000Z</published>
    <summary>
      <![CDATA[<h1 id="前言">1. 前言</h1><p>下个月 9 号就入境瑞典满 2 周年，越来越喜欢瑞典的生活，小崽崽也很幸运地收获了一对瑞典“爷爷奶奶”。</p>
<p>在此分享一些在瑞典的生活给需要的人。如果不喜欢润学的人，请直接略过，本人就此谢过。</p>
<h1 id="生]]>
    </summary>
    <title>写在瑞典两周年</title>
    <updated>2026-06-21T21:05:37.467Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="immigration" scheme="http://yuanmomo.net/categories/immigration/"/>
    <category term="Sweden" scheme="http://yuanmomo.net/categories/immigration/Sweden/"/>
    <category term="sweden" scheme="http://yuanmomo.net/tags/sweden/"/>
    <content>
      <![CDATA[<h1 id="背景">1. 背景</h1><p>今天一对来自香港的小夫妻来家里吃饭，吃完饭后带他们去看了后山的湖，相互了解了一下对香港的看法，还是挺让我震惊的。</p><p>散完步过后，回家喝了点水，送他们走的时候，顺便敲了一下邻居的们。结果邻居一开门，我邻居和我朋友（男）两个都很惊讶的看着对方，然后马上互相打招呼，说他们以前见过。</p><p>邻居是瑞典语 SFI 的发音课老师，朋友在学习 SFI 的时候，曾经走错了教室，然后互相聊了几句。不过，朋友听我邻居上的发音课还不错，然后那一天就在我邻居的课上上课。</p><p>最后，在送朋友去公交站的时候，一直在说，缘分的奇妙。</p><p>说到缘分，就不得不说我们买的公寓，和我们现在的邻居。刚搬进来的那段时间，我跟我媳妇都知道，这个公寓买的比较贵，我们有点吃亏。但是现在看来，我们一点都不后悔，因为我们遇到了两个世界上最好的邻居。</p><span id="more"></span><h1 id="家庭情况">2. 家庭情况</h1><p>我家：我，媳妇和 3 岁的女儿。</p><p>邻居：62 岁的独居老人（属虎，经常跟我们说她就是母老虎）。</p><p>邻居没有结婚，所以没有小孩，但是她有一个男性朋友，也是单身。他们从年轻的时候，就认识了。这位男性朋友，也是跟我们住在一个小区，走路大概 3 分钟就能到，很近，应该也是希望大家相互有个照应。</p><h1 id="相处">3. 相处</h1><ol><li><p>两个邻居都是独居，都没有子女，没有孙子孙女。所以，宝宝，我媳妇和我，刚好可以填补这个位置。我邻居跟我媳妇说过好多次，感觉我媳妇是她得另一个女儿。</p></li><li><p>邻居是 SFI 瑞典语老师，我媳妇当前最重要的事情，就是学习瑞典语。所以，我媳妇可以说是现在我们圈子中那个瑞典语学得最快的，因为经常都能开小灶。</p></li><li><p>邻居以前做过幼儿园的老师，所以很懂得带小宝宝。所以，我们宝宝非常喜欢她，她很喜欢给宝宝读绘本，然后我们宝宝刚好也是很喜欢坐着听绘本的。现在，经常能看到我们宝宝乖乖的坐在邻居怀里，认认真真的听她读绘本。</p></li><li><p>邻居很喜欢我们宝宝，给宝宝买了很多玩具。男邻居经常在对面女邻居的家里，然后他俩就经常带我宝宝，让宝宝扮演医生，扮演售货员，也跟她一起唱歌，一起跳舞。两个邻居，年轻的时候，都是玩音乐的，也已经安排好了什么时候教我们宝宝唱歌，弹琴，弹吉他。我那小崽子的瑞典语，真的让我很惊叹，有时候我媳妇都感觉到有压力。</p></li><li><p>邻居说，她很喜欢给宝宝读书，读绘本，因为自己是教语言的，所以看着宝宝越来越多的瑞典语，她也很开心。其次，她朋友的小孩，来她家里，都不会安静的坐着听她读绘本，都跑过来跑过去的，唯独我们宝宝很乖，很喜欢坐在她怀里听。这也导致，我家小崽子在家，安静的时候，自己都会去找书本，翻书本看，希望她真的能养成爱好读书的好习惯。</p></li><li><p>现在夏天到了，这次五一和上上周的周末，我们已经一起出去游玩了两次。邻居也经常戏称，我们是家庭出游，我是她的 step son 。一起去过湖边野炊，一起去看过农场，带宝宝喂过小动物，也带宝宝去爬过后山，一起去海边看过日落，带媳妇和宝宝去逛这边的博物馆。按照邻居说的，后面一起还有更多的活动。</p></li><li><p>邻居都不是素食主义者，我们就更容易地做中国菜给他们。他们俩，帮我们带宝宝，我们一碗猪油蛋炒饭就够了。当然，也让他们尝了他们从来没有尝试过的菜：四川凉菜。也请他们吃了火锅，普通的家常菜。每次吃饭过后，邻居都会说一句：“你们禁止搬家”。</p></li><li><p>我邻居特别擅长做面包，蛋糕，而我又是最喜欢吃蛋糕的那一个。这样，邻居已经邀请我媳妇好几次，一起学习做面包和蛋糕，然后来做我的早餐。</p></li><li><p>现在，几乎每次吃饭的时候，都会跟邻居聊起来。我们都从来没有想过会有现在这样的生活，遇到这么好的邻居。上次，我跟她说，我的妈妈盼了好多年，盼到了一个孙女，梦想成真了，结果让我带出国了。我邻居马上说：但是成就了我的梦想。然后，我们相互一笑，就又说起了阿甘正传：Life was a box of chocolates, you never know what you’re gonna get.</p></li></ol><h1 id="结尾">4. 结尾</h1><p>现在来看，我们远远不止是有了一对邻居，可能有了一对在瑞典的“父母”。</p><p>时不时偶尔调侃媳妇，现在还会觉得我们的房子买得贵吗？媳妇就说，现在身边得朋友都经常跟我们说，我们这房子已经不重要了，重要的是我们有这么好的邻居，再也没人关心我们得房子买成多少钱了。</p><p>人生就是这么有趣，有的时候，看似失去了什么，但是说不定你会得到更多的东西。也许是运气好，也许是巧合，看似不确定，但是又让我觉得很确定。总之，做一个真诚得人，善待身边得一切，生活就会充满了惊喜。</p><h1 id="难忘的回忆">5. 难忘的回忆</h1><p><img src="https://img.tupm.net/2024/05/E184A331B5A978770D9FAE711F33C85D.jpg" alt="后山的水塘"></p><p><img src="https://img.tupm.net/2024/05/C80DF5C2DB60DA7D305B60FC5ECA2255.jpeg" alt="日落"><br><img src="https://img.tupm.net/2024/05/F56754078181DABBDBAB9C3DBD80023A.jpeg" alt="爬山"></p>]]>
    </content>
    <id>http://yuanmomo.net/2024/05/06/sweden-neighbor/</id>
    <link href="http://yuanmomo.net/2024/05/06/sweden-neighbor/"/>
    <published>2024-05-06T11:08:26.000Z</published>
    <summary>
      <![CDATA[<h1 id="背景">1. 背景</h1><p>今天一对来自香港的小夫妻来家里吃饭，吃完饭后带他们去看了后山的湖，相互了解了一下对香港的看法，还是挺让我震惊的。</p>
<p>散完步过后，回家喝了点水，送他们走的时候，顺便敲了一下邻居的们。结果邻居一开门，我邻居和我朋友（男）两个都很惊讶的看着对方，然后马上互相打招呼，说他们以前见过。</p>
<p>邻居是瑞典语 SFI 的发音课老师，朋友在学习 SFI 的时候，曾经走错了教室，然后互相聊了几句。不过，朋友听我邻居上的发音课还不错，然后那一天就在我邻居的课上上课。</p>
<p>最后，在送朋友去公交站的时候，一直在说，缘分的奇妙。</p>
<p>说到缘分，就不得不说我们买的公寓，和我们现在的邻居。刚搬进来的那段时间，我跟我媳妇都知道，这个公寓买的比较贵，我们有点吃亏。但是现在看来，我们一点都不后悔，因为我们遇到了两个世界上最好的邻居。</p>]]>
    </summary>
    <title>有的缘分可能真的就是命中注定--瑞典邻居</title>
    <updated>2026-06-21T21:12:41.658Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="Mac" scheme="http://yuanmomo.net/categories/Mac/"/>
    <category term="Mac" scheme="http://yuanmomo.net/tags/Mac/"/>
    <content>
      <![CDATA[<h1 id="系统配置">1. 系统配置</h1><ol><li>General –&gt; </li><li>Dock <ol><li>Clock 配置</li></ol></li><li>Mission Control<ol><li>触发角</li></ol></li><li>Touch ID</li></ol><span id="more"></span><ol start="5"><li><p>Language</p><ol><li>添加影视</li></ol></li><li><p>Accessibility</p><ol><li>Display –&gt; Cursor Size</li><li>Pointer Control –&gt; 三指拖移</li></ol></li><li><p>Keyboard</p><ol><li><strong>关闭</strong> Use 中&#x2F;英 key to</li><li>Touch Bar shows –&gt; 默认显示  F1 –&gt; F12</li><li>交换 caps lock 和 control 键</li><li>输入发设置：自然码双拼</li><li>删除所有快捷键，除了留下输入法切换</li></ol></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">defaults write com.apple.inputmethod.CoreChineseEngineFramework shuangpinLayout 5</span><br></pre></td></tr></table></figure><ol start="8"><li>Trackpad<ol><li>Look up 三指查词</li><li>鼠标移动速度拉到最大</li><li>More gestures 打开 App Expose</li><li>More gestures  关闭 Launchpad 和 Show Desktop</li></ol></li></ol><h1 id="安装常用软件">2. 安装常用软件</h1><h2 id="Alfred">2.1. Alfred</h2><p>有商用 License，需要看一下能不能用 <a href="https://www.alfredapp.com/">https://www.alfredapp.com/</a></p><p>激活，设置备份即可</p><h2 id="Better-Toch-Tool">2.2. Better Toch Tool</h2><p>下载地址：<a href="https://folivora.ai/">https://folivora.ai/</a></p><p>使用 License 文件激活</p><p>倒入备份的配置文件</p><h2 id="MWeb">2.3. MWeb</h2><p>下载地址：<a href="https://www.mweb.im/download.html">https://www.mweb.im/download.html</a></p><ol><li>配置主题</li><li>配置图床</li></ol><h2 id="SpaceLauncher">2.4. SpaceLauncher</h2><p>下载地址：<a href="https://spacelauncherapp.com/">https://spacelauncherapp.com/</a></p><p>暂时没有导出&#x2F;导入功能</p><h2 id="Chrome">2.5. Chrome</h2><ol><li><p>安装 <code>Proxy SwitchyOmega</code>，从配置文件恢复<br> <a href="https://chrome.google.com/webstore/detail/proxy-switchyomega/padekgcemlokbadohgkifijomclgjgif">插件地址</a></p></li><li></li></ol>]]>
    </content>
    <id>http://yuanmomo.net/2021/09/27/new-mac-init/</id>
    <link href="http://yuanmomo.net/2021/09/27/new-mac-init/"/>
    <published>2021-09-27T06:37:51.000Z</published>
    <summary>
      <![CDATA[<h1 id="系统配置">1. 系统配置</h1><ol>
<li>General –&gt; </li>
<li>Dock <ol>
<li>Clock 配置</li>
</ol>
</li>
<li>Mission Control<ol>
<li>触发角</li>
</ol>
</li>
<li>Touch ID</li>
</ol>]]>
    </summary>
    <title>初始 Mac 配置</title>
    <updated>2026-06-21T21:05:37.467Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="ETH" scheme="http://yuanmomo.net/categories/ETH/"/>
    <category term="ETH" scheme="http://yuanmomo.net/tags/ETH/"/>
    <category term="POA" scheme="http://yuanmomo.net/tags/POA/"/>
    <category term="Private" scheme="http://yuanmomo.net/tags/Private/"/>
    <content>
      <![CDATA[<h1 id="前言">1. 前言</h1><p>公司最近的业务是基于 ETH 来开发，所以在测试的时候，最好部署一条私有的 ETH 链来单独来进行测试。</p><p>部署以太坊节点，可以使用 <code>geth</code> 工具，关于私有网络的文档，可以参考：<a href="https://geth.ethereum.org/docs/interface/private-network">https://geth.ethereum.org/docs/interface/private-network</a></p><span id="more"></span><h1 id="部署">2. 部署</h1><p>私有网络采用 POA 的共识算法。</p><h2 id="准备环境">2.1. 准备环境</h2>]]>
    </content>
    <id>http://yuanmomo.net/2021/07/13/deploy-eth-private-network/</id>
    <link href="http://yuanmomo.net/2021/07/13/deploy-eth-private-network/"/>
    <published>2021-07-13T11:19:18.000Z</published>
    <summary>
      <![CDATA[<h1 id="前言">1. 前言</h1><p>公司最近的业务是基于 ETH 来开发，所以在测试的时候，最好部署一条私有的 ETH 链来单独来进行测试。</p>
<p>部署以太坊节点，可以使用 <code>geth</code> 工具，关于私有网络的文档，可以参考：<a href="https://geth.ethereum.org/docs/interface/private-network">https://geth.ethereum.org/docs/interface/private-network</a></p>]]>
    </summary>
    <title>ETH 部署私有节点（POA）</title>
    <updated>2026-06-21T21:12:41.654Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="immigration" scheme="http://yuanmomo.net/categories/immigration/"/>
    <category term="immigration" scheme="http://yuanmomo.net/tags/immigration/"/>
    <content>
      <![CDATA[<h1 id="背景">1. 背景</h1><p>表格数据来自 <strong>东南</strong> 关于加拿大移民的攻略视频：<a href="https://www.youtube.com/watch?v=Qntp2Uqq1s4&t=1219s">加拿大 移民 | 到底哪个移民项目最简单？华人加拿大移民最实用攻略出炉</a></p><p>里面列举了每个省的特点和具体的要求，由于是视频，所以不是很方便。为了方便查阅，就整理成文本性的内容。</p><p>Up主的频道，在这里：<a href="https://www.youtube.com/channel/UCSX99Rvq5dszj6rzAPkdglA">56BelowTV 零下56</a></p><span id="more"></span><h1 id="为什么加拿大？">2. 为什么加拿大？</h1><ol><li>免费医疗<ul><li>学生签证(留学生)</li><li>工作签证</li></ul></li><li>福利 –&gt; 高</li><li>收入 –&gt; 高</li><li>教育 –&gt; 好</li><li>安全（食品） –&gt; 高</li><li>环境 –&gt; 好</li></ol><!-- more --><h1 id="加拿大介绍">3. 加拿大介绍</h1><h2 id="地图">3.1. 地图</h2><p><img src="https://img.tupm.net/2021/04/26369342DDE232EF632994C1A793BE87.jpg" alt="canada-map"></p><h2 id="简介">3.2. 简介</h2><table><thead><tr><th></th><th align="left">说明</th><th>备注</th></tr></thead><tbody><tr><td>面积</td><td align="left">998万 平方公理</td><td>世界第二</td></tr><tr><td>国歌</td><td align="left">O Canada</td><td></td></tr><tr><td>总理</td><td align="left">Justin Trudeau</td><td></td></tr><tr><td>人口</td><td align="left">3800 万</td><td>相当于 1.5 内蒙古</td></tr><tr><td>元首</td><td align="left">Queen of Canada</td><td>总理负责制</td></tr><tr><td>行政区域</td><td align="left">10 省 3 地区</td><td>地区人口很少</td></tr></tbody></table><h3 id="小知识">3.2.1. 小知识</h3><ul><li>加拿大鹅（动物，羽绒服）</li><li>移民国（每 5 个人就有 1 个移民）</li><li>枫叶</li><li>Hockey（冬季国球）</li><li>Lacrosse（夏季过球，用网兜打的一种球）</li><li>poutine（国家食品 national food，起源于魁北克）</li></ul><h2 id="移民信息">3.3. 移民信息</h2><p> 官方网址：<a href="www.canada.ca">www.canada.ca</a></p><h2 id="地区人口">3.4. 地区人口</h2><escape><style type="text/css">.tg4  {border-collapse:collapse;border-spacing:0;}.tg4 td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:13px;  overflow:hidden;padding:10px 5px;word-break:normal;}.tg4 th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:13px;  font-weight:normal;overflow:hidden;padding:1px 1px;word-break:normal;}.tg4 .tg-1wig{font-weight:bold;text-align:left;vertical-align:top}.tg4 .tg-baqh{text-align:center;vertical-align:top}.tg4 .tg-0lax{text-align:left;vertical-align:top}</style><table class="tg4"><thead>  <tr>    <th class="tg-baqh">省份/地区</th>    <th class="tg-baqh">首府</th>    <th class="tg-baqh">最大城市（按人口）</th>    <th class="tg-baqh">面积（万平方公里）</th>    <th class="tg-baqh">人口（万)</th>  </tr></thead><tbody>  <tr>    <td class="tg-0lax">ON(安省)</td>    <td class="tg-baqh" colspan="2">多伦多(Toronto, C)</td>    <td class="tg-baqh">107</td>    <td class="tg-baqh">1473</td>  </tr>  <tr>    <td class="tg-0lax">QC(魁省)</td>    <td class="tg-baqh">魁北克市(Quebec City)</td>    <td class="tg-baqh">蒙特利尔(Montreal, C)</td>    <td class="tg-baqh">154</td>    <td class="tg-baqh">857</td>  </tr>  <tr>    <td class="tg-0lax">BC(卑诗省)</td>    <td class="tg-baqh">维多利亚(Victoria, C)</td>    <td class="tg-baqh">温哥华(Vancouver, C)</td>    <td class="tg-baqh">94</td>    <td class="tg-baqh">514</td>  </tr>  <tr>    <td class="tg-0lax">AB(阿省)</td>    <td class="tg-baqh">埃德蒙顿(Edmonton, C)</td>    <td class="tg-baqh">卡尔加里(Calgary, C)</td>    <td class="tg-baqh">66</td>    <td class="tg-baqh">442</td>  </tr>  <tr>    <td class="tg-0lax">MB(曼省)</td>    <td class="tg-baqh" colspan="2">温尼伯(Winnipeg)</td>    <td class="tg-baqh">64</td>    <td class="tg-baqh">138</td>  </tr>  <tr>    <td class="tg-0lax">SK(萨省)</td>    <td class="tg-baqh">里贾纳(Regina)</td>    <td class="tg-baqh">萨斯卡通(Saskatoon)</td>    <td class="tg-baqh">65</td>    <td class="tg-baqh">118</td>  </tr>  <tr>    <td class="tg-0lax">NS(新斯科舍省)</td>    <td class="tg-baqh">哈利法克斯(Halifax)</td>    <td class="tg-baqh">哈利法克斯</td>    <td class="tg-baqh">5.5</td>    <td class="tg-baqh">98</td>  </tr>  <tr>    <td class="tg-0lax">NB(新伯伦瑞克)</td>    <td class="tg-baqh">弗雷德里克顿(Fredericton)</td>    <td class="tg-baqh">蒙克顿(Moncton)</td>    <td class="tg-baqh">7.2</td>    <td class="tg-baqh">78</td>  </tr>  <tr>    <td class="tg-0lax">NL(纽芬兰与拉布拉多)</td>    <td class="tg-baqh" colspan="2">圣约翰斯(St. John's)</td>    <td class="tg-baqh">40</td>    <td class="tg-baqh">52</td>  </tr>  <tr>    <td class="tg-0lax">PE(爱德华王子岛)</td>    <td class="tg-baqh" colspan="2">夏洛特顿(Charlottetown)</td>    <td class="tg-baqh">0.5</td>    <td class="tg-baqh">16</td>  </tr>  <tr>    <td class="tg-1wig">NT (西北地区)</td>    <td class="tg-baqh" colspan="2">耶洛奈夫(Yellowknife)</td>    <td class="tg-baqh">134</td>    <td class="tg-baqh">4.5</td>  </tr>  <tr>    <td class="tg-1wig">YT (育空）</td>    <td class="tg-baqh" colspan="2">怀特霍斯(Whitehorse)</td>    <td class="tg-baqh">48</td>    <td class="tg-baqh">4.2</td>  </tr>  <tr>    <td class="tg-1wig">NU(努纳武特)</td>    <td class="tg-baqh" colspan="2">伊卡卢伊特(Iqaluit)</td>    <td class="tg-baqh">209</td>    <td class="tg-baqh">3.9</td>  </tr></tbody></table></escape><blockquote><p><strong>备注：</strong></p><ul><li><strong>C</strong> : 华人倾向的大城市。</li><li><strong>Whitehorse</strong> : 白马市。</li><li>不是说大城市就是好城市，就是你应该移民的城市，需要取决于自己的需求。</li></ul></blockquote><h1 id="各省评分">4. 各省评分</h1><escape><style type="text/css">.tg  {border-collapse:collapse;border-spacing:0;}.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;  overflow:hidden;padding:10px 5px;word-break:normal;}.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;  font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}.tg .tg-viqs{color:#fe0000;text-align:left;vertical-align:top}.tg .tg-0lax{text-align:left;vertical-align:top}.tg .tg-nrix{text-align:center;vertical-align:middle}</style><table class="tg"><thead>  <tr>    <th class="tg-0lax">省份/地区</th>    <th class="tg-0lax">气候</th>    <th class="tg-0lax">工资</th>    <th class="tg-0lax">教育</th>    <th class="tg-0lax">安全</th>    <th class="tg-0lax">医疗</th>    <th class="tg-0lax">便利</th>    <th class="tg-0lax">娱乐</th>    <th class="tg-0lax">综合<br>评分</th>  </tr></thead><tbody>  <tr>    <td class="tg-0lax">ON(安省)</td>    <td class="tg-viqs">4</td>    <td class="tg-0lax">3</td>    <td class="tg-viqs">5</td>    <td class="tg-viqs">5</td>    <td class="tg-viqs">5</td>    <td class="tg-viqs">5</td>    <td class="tg-nrix" rowspan="13">不<br>同<br>人<br>，<br>不<br>同<br>观<br>点</td>    <td class="tg-0lax" rowspan="13"></td>  </tr>  <tr>    <td class="tg-0lax">QC(魁省)</td>    <td class="tg-0lax">3</td>    <td class="tg-0lax">3</td>    <td class="tg-viqs">4</td>    <td class="tg-viqs">5</td>    <td class="tg-viqs">5</td>    <td class="tg-viqs">5</td>  </tr>  <tr>    <td class="tg-0lax">BC(卑诗省)</td>    <td class="tg-viqs">4.5</td>    <td class="tg-0lax">2</td>    <td class="tg-viqs">4</td>    <td class="tg-viqs">5</td>    <td class="tg-viqs">5</td>    <td class="tg-viqs">5</td>  </tr>  <tr>    <td class="tg-0lax">AB(阿省)</td>    <td class="tg-viqs">3.5</td>    <td class="tg-0lax">4</td>    <td class="tg-0lax">3</td>    <td class="tg-viqs">5</td>    <td class="tg-viqs">5</td>    <td class="tg-0lax">4</td>  </tr>  <tr>    <td class="tg-0lax">MB(曼省)</td>    <td class="tg-0lax">2</td>    <td class="tg-0lax">3</td>    <td class="tg-0lax">2</td>    <td class="tg-viqs">5</td>    <td class="tg-viqs">5</td>    <td class="tg-0lax">3</td>  </tr>  <tr>    <td class="tg-0lax">SK(萨省)</td>    <td class="tg-0lax">2</td>    <td class="tg-0lax">3</td>    <td class="tg-0lax">2</td>    <td class="tg-viqs">5</td>    <td class="tg-viqs">5</td>    <td class="tg-0lax">3</td>  </tr>  <tr>    <td class="tg-0lax">NS(新斯科舍省)</td>    <td class="tg-0lax">3</td>    <td class="tg-0lax">3</td>    <td class="tg-0lax">2</td>    <td class="tg-viqs">5</td>    <td class="tg-viqs">5</td>    <td class="tg-0lax">3</td>  </tr>  <tr>    <td class="tg-0lax">NB(新伯伦瑞克)</td>    <td class="tg-0lax">3</td>    <td class="tg-0lax">3</td>    <td class="tg-0lax">2</td>    <td class="tg-viqs">5</td>    <td class="tg-viqs">5</td>    <td class="tg-0lax">3</td>  </tr>  <tr>    <td class="tg-0lax">NL(纽芬兰与拉布拉多)</td>    <td class="tg-0lax">3</td>    <td class="tg-0lax">3</td>    <td class="tg-0lax">2</td>    <td class="tg-viqs">5</td>    <td class="tg-viqs">5</td>    <td class="tg-0lax">2.5</td>  </tr>  <tr>    <td class="tg-0lax">PE(爱德华王子岛)</td>    <td class="tg-0lax">3</td>    <td class="tg-0lax">3</td>    <td class="tg-0lax">1.5</td>    <td class="tg-viqs">5</td>    <td class="tg-viqs">5</td>    <td class="tg-0lax">2.5</td>  </tr>  <tr>    <td class="tg-0lax">NT (西北地区)</td>    <td class="tg-0lax">1</td>    <td class="tg-viqs">5</td>    <td class="tg-0lax">1.5</td>    <td class="tg-viqs">5</td>    <td class="tg-0lax">3</td>    <td class="tg-0lax">2</td>  </tr>  <tr>    <td class="tg-0lax">YT (育空）</td>    <td class="tg-0lax">2</td>    <td class="tg-viqs">4.5</td>    <td class="tg-0lax">1</td>    <td class="tg-viqs">5</td>    <td class="tg-0lax">3</td>    <td class="tg-0lax">2</td>  </tr>  <tr>    <td class="tg-0lax">NU(努纳武特)</td>    <td class="tg-0lax">0.5</td>    <td class="tg-viqs">4.5</td>    <td class="tg-0lax">0.5</td>    <td class="tg-viqs">5</td>    <td class="tg-0lax">2</td>    <td class="tg-0lax">1</td>  </tr></tbody></table></escape><blockquote><p><strong>备注：</strong></p><ul><li>满分：5 分。</li><li>红色表示排名靠前。</li></ul></blockquote><h1 id="自雇移民">5. 自雇移民</h1><table><thead><tr><th>省份</th><th align="center">净资产（万，加元）</th><th align="center">投资（万，加元）</th><th align="center">经验</th><th align="center">年龄</th><th align="center">学历</th><th align="center">语言</th><th align="center">入池</th><th align="center">难度</th></tr></thead><tbody><tr><td>QC(魁省)</td><td align="center"><strong>10</strong></td><td align="center"><strong>2.5</strong><br> 抵押给政府(d)</td><td align="center">&gt;2年</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center"><em><strong>Y</strong></em></td><td align="center">4</td></tr><tr><td>AB(阿省)</td><td align="center">50</td><td align="center">50</td><td align="center">Y</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">N</td><td align="center">2.5</td></tr><tr><td>MB(曼省)</td><td align="center">50</td><td align="center">30</td><td align="center">&gt;3年</td><td align="center">-</td><td align="center">-</td><td align="center">Y</td><td align="center">N</td><td align="center">2</td></tr><tr><td>SK(萨省)</td><td align="center">30</td><td align="center">15</td><td align="center">&gt;3年</td><td align="center">&gt;40</td><td align="center">-</td><td align="center">-</td><td align="center"><em><strong>Y</strong></em></td><td align="center">3</td></tr><tr><td>SK(萨省)</td><td align="center">30</td><td align="center">-</td><td align="center">-</td><td align="center">&lt;40</td><td align="center">-</td><td align="center">-</td><td align="center">N</td><td align="center">1.5</td></tr></tbody></table><blockquote><p><strong>备注：</strong></p><ul><li>满分：5 分。</li><li>Y: Yes</li><li>N: No</li></ul></blockquote><h1 id="投资移民">6. 投资移民</h1><table><thead><tr><th align="left">省份&#x2F;地区</th><th align="center">净资产（万，加元）</th><th align="center">投资（万，加元）</th><th align="center">语言</th><th align="center">年龄</th><th align="center">学历</th><th align="center">入池</th><th align="center">雇佣</th><th align="center">难度</th><th align="center">管理</th></tr></thead><tbody><tr><td align="left">ON(安省)</td><td align="center">40-80</td><td align="center">20-60</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">Y</td><td align="center">2</td><td align="center">4.5</td><td align="center">2年(5)</td></tr><tr><td align="left">QC(魁省)</td><td align="center">200</td><td align="center">120</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">Y</td><td align="center">-</td><td align="center">5</td><td align="center">2年(5)</td></tr><tr><td align="left">BC(卑诗省)</td><td align="center">60</td><td align="center">20</td><td align="center">E4</td><td align="center">-</td><td align="center">-</td><td align="center">Y</td><td align="center">1</td><td align="center">4</td><td align="center">3年(10)</td></tr><tr><td align="left">AB(阿省)</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td align="left">MB(曼省)</td><td align="center">50</td><td align="center"><strong>15-25</strong></td><td align="center">E4.5</td><td align="center">-</td><td align="center">高中</td><td align="center">Y</td><td align="center">1</td><td align="center">3</td><td align="center">3年(5)</td></tr><tr><td align="left">SK(萨省)</td><td align="center">50</td><td align="center">20-30</td><td align="center">-</td><td align="center">&gt;21</td><td align="center">大专</td><td align="center">Y</td><td align="center">2(R)</td><td align="center">3.5</td><td align="center">3年(10)</td></tr><tr><td align="left">NS(新斯科舍省)</td><td align="center">60</td><td align="center"><strong>15</strong></td><td align="center">E4.5</td><td align="center">&gt;21</td><td align="center">-</td><td align="center">Y</td><td align="center"><em><strong>N</strong></em></td><td align="center">3</td><td align="center">3年(5)</td></tr><tr><td align="left">NB(新伯伦瑞克)</td><td align="center">60</td><td align="center">25</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">Y</td><td align="center"><em><strong>N</strong></em></td><td align="center">3</td><td align="center">3年(5)</td></tr><tr><td align="left">NL(纽芬兰与拉布拉多)</td><td align="center">60</td><td align="center">20</td><td align="center">E4.5</td><td align="center">21-59</td><td align="center">高中</td><td align="center">Y</td><td align="center">1</td><td align="center">3</td><td align="center">2年(5)</td></tr><tr><td align="left">PE(爱德华王子岛)</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td align="left"><strong>NT (西北地区)</strong></td><td align="center">25-50</td><td align="center"><strong>15-30</strong></td><td align="center">E4</td><td align="center">-</td><td align="center">-</td><td align="center"><em><strong>N</strong></em></td><td align="center"><em><strong>N</strong></em></td><td align="center">0.5</td><td align="center">Y</td></tr><tr><td align="left"><strong>YT (育空）</strong></td><td align="center">50</td><td align="center">20</td><td align="center">-</td><td align="center">-</td><td align="center">高中</td><td align="center">Y</td><td align="center"><em><strong>N</strong></em></td><td align="center">2</td><td align="center">2年(5)</td></tr><tr><td align="left"><strong>NU(努纳武特)</strong></td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr></tbody></table><blockquote><p><strong>备注：</strong></p><ul><li>满分：5 分。</li><li>Y: Yes</li><li>N: No</li><li><strong>雇佣</strong> 列中的 R: 雇佣人不能是自己的亲属。</li><li><strong>管理</strong> 列中括号的数字为 最近多少年之内。西北地区是要求有管理经验，但是没有要求有多少时间的管理经验。</li></ul></blockquote><h1 id="技术移民">7. 技术移民</h1><escape><style type="text/css">.tg3  {border-collapse:collapse;border-spacing:0;}.tg3 td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;  overflow:hidden;padding:10px 5px;word-break:normal;}.tg3 th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;  font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}.tg3 .tg-0lax{text-align:left;vertical-align:top}.tg3 .tg-nrix{text-align:center;vertical-align:middle}.tg3 .tg-dbp2{color:#fe0000;text-align:center;vertical-align:middle}</style><table class="tg3"><thead>  <tr>    <th class="tg-0lax">省份/地区</th>    <th class="tg-0lax">工作</th>    <th class="tg-0lax">语言</th>    <th class="tg-0lax">经验</th>    <th class="tg-0lax">入职信</th>    <th class="tg-0lax">文凭</th>    <th class="tg-0lax">LMIA</th>    <th class="tg-0lax">其他</th>    <th class="tg-0lax">难度</th>  </tr></thead><tbody>  <tr>    <td class="tg-0lax">ON(安省)</td>    <td class="tg-nrix">0AB</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">2年(5)</td>    <td class="tg-nrix">FP</td>    <td class="tg-nrix">大专</td>    <td class="tg-nrix">Y</td>    <td class="tg-nrix">雇主</td>    <td class="tg-nrix">5</td>  </tr>  <tr>    <td class="tg-0lax">QC(魁省)</td>    <td class="tg-nrix">0AB</td>    <td class="tg-nrix">F(7级,S)</td>    <td class="tg-nrix">2年(3)</td>    <td class="tg-dbp2">Y</td>    <td class="tg-nrix">-</td>    <td class="tg-dbp2">N</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix"><span style="color:#FE0000">2</span>/5</td>  </tr>  <tr>    <td class="tg-0lax">BC(卑诗省)</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">E4</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">FP</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">Y</td>    <td class="tg-nrix">工资</td>    <td class="tg-nrix">4</td>  </tr>  <tr>    <td class="tg-0lax">AB(阿省)</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">E4</td>    <td class="tg-nrix">1年(1.5)</td>    <td class="tg-nrix">F</td>    <td class="tg-nrix">高中</td>    <td class="tg-nrix">Y</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">3</td>  </tr>  <tr>    <td class="tg-0lax">MB(曼省)</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">打分</td>    <td class="tg-nrix">0.5年(M?)</td>    <td class="tg-nrix">F</td>    <td class="tg-nrix">打分</td>    <td class="tg-nrix">Y</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">3</td>  </tr>  <tr>    <td class="tg-0lax">SK(萨省)</td>    <td class="tg-nrix">0AB</td>    <td class="tg-nrix">打分</td>    <td class="tg-nrix">1年(10)</td>    <td class="tg-nrix">FP</td>    <td class="tg-nrix">打分</td>    <td class="tg-nrix">Y</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">3.5</td>  </tr>  <tr>    <td class="tg-0lax">NS(新斯科舍省)</td>    <td class="tg-nrix" rowspan="4">0ABC</td>    <td class="tg-nrix" rowspan="4">E4</td>    <td class="tg-nrix" rowspan="4">1年(3)</td>    <td class="tg-nrix" rowspan="4">FP</td>    <td class="tg-nrix" rowspan="4">高中</td>    <td class="tg-dbp2" rowspan="4">N</td>    <td class="tg-nrix" rowspan="4">-</td>    <td class="tg-dbp2" rowspan="4">2.5</td>  </tr>  <tr>    <td class="tg-0lax">NB(新伯伦瑞克)</td>  </tr>  <tr>    <td class="tg-0lax">NL(纽芬兰与拉布拉多)</td>  </tr>  <tr>    <td class="tg-0lax">PE(爱德华王子岛)</td>  </tr>  <tr>    <td class="tg-0lax">NT (西北地区)</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">E4</td>    <td class="tg-nrix">0.5年(N)</td>    <td class="tg-nrix">FP</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">Y</td>    <td class="tg-nrix">-</td>    <td class="tg-dbp2">2</td>  </tr>  <tr>    <td class="tg-0lax">YT (育空）</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">E4</td>    <td class="tg-nrix">0.5年(10)</td>    <td class="tg-dbp2">Y</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">Y</td>    <td class="tg-nrix">-</td>    <td class="tg-dbp2">2</td>  </tr>  <tr>    <td class="tg-0lax">NU(努纳武特)</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>  </tr></tbody></table></escape><blockquote><p><strong>备注：</strong></p><ul><li>满分：5 分。</li><li>E4: 雅思 4 分；F(7级): 法语 7 级。</li><li><strong>入职信</strong> 列 F: Full time 全职；P: Permanent。魁北克省，育空地区只要有工作就行。</li><li><strong>经验</strong> 列 N 表示在西北地区的经验。 </li><li><strong>其他</strong> 列 安省条件非常苛刻，如果你不是特别优越的条件，真的不建议去**安省（多伦多）**做技术移民。</li><li><strong>其他</strong> 列 卑诗省有最低工资要求。</li><li><strong>难度</strong> 列 魁省，如果会法语，会比较简单，如果不会法语，会比较难。</li><li><strong>难度</strong> 列 西北地区需要 LMIA，地区偏僻，雇主愿意做 LMIA。</li></ul></blockquote><h1 id="留学移民">8. 留学移民</h1><escape><style type="text/css">.tg2  {border-collapse:collapse;border-spacing:0;}.tg2 td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;  overflow:hidden;padding:10px 5px;word-break:normal;}.tg2 th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;  font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}.tg2 .tg-0lax{text-align:left;vertical-align:top}.tg2 .tg-nrix{text-align:center;vertical-align:middle}.tg2 .tg-dbp2{color:#fe0000;text-align:center;vertical-align:middle}</style><table class="tg2"><thead>  <tr>    <th class="tg-0lax">省份/地区</th>    <th class="tg-0lax">工作</th>    <th class="tg-0lax">语言</th>    <th class="tg-0lax">经验</th>    <th class="tg-0lax">入职信</th>    <th class="tg-0lax">文凭</th>    <th class="tg-0lax">LMIA</th>    <th class="tg-0lax">其他</th>    <th class="tg-0lax">难度</th>  </tr></thead><tbody>  <tr>    <td class="tg-0lax">ON(安省)</td>    <td class="tg-nrix">0AB</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">FP</td>    <td class="tg-nrix">&gt; 2年</td>    <td class="tg-dbp2">N</td>    <td class="tg-nrix">雇主</td>    <td class="tg-nrix">5</td>  </tr>  <tr>    <td class="tg-0lax">QC(魁省)</td>    <td class="tg-nrix">0ABC</td>    <td class="tg-nrix">F(7级,S)</td>    <td class="tg-nrix">1年</td>    <td class="tg-nrix">F</td>    <td class="tg-nrix"> &gt; 1年</td>    <td class="tg-dbp2">N</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">2.5</td>  </tr>  <tr>    <td class="tg-0lax">BC(卑诗省)</td>    <td class="tg-nrix">0AB</td>    <td class="tg-nrix">E5</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">FP</td>    <td class="tg-nrix">&gt; 1年</td>    <td class="tg-dbp2">N</td>    <td class="tg-nrix">工资</td>    <td class="tg-nrix">4</td>  </tr>  <tr>    <td class="tg-0lax">AB(阿省)</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">E4</td>    <td class="tg-nrix">0.5年(1.5)</td>    <td class="tg-nrix">FP</td>    <td class="tg-nrix">&gt; 1年</td>    <td class="tg-dbp2">N</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">3</td>  </tr>  <tr>    <td class="tg-0lax">MB(曼省)</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">E4</td>    <td class="tg-nrix">0.5年</td>    <td class="tg-nrix">FP</td>    <td class="tg-nrix">&gt; 1年</td>    <td class="tg-dbp2">N</td>    <td class="tg-nrix">-</td>    <td class="tg-dbp2">2</td>  </tr>  <tr>    <td class="tg-0lax">SK(萨省)</td>    <td class="tg-nrix">0AB</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">0.5年</td>    <td class="tg-nrix">FP</td>    <td class="tg-nrix">&gt; 1年</td>    <td class="tg-dbp2">N</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">2.5</td>  </tr>  <tr>    <td class="tg-0lax">NS(新斯科舍省)</td>    <td class="tg-nrix" rowspan="4">0ABC</td>    <td class="tg-nrix" rowspan="4">E4</td>    <td class="tg-nrix" rowspan="4">1年</td>    <td class="tg-nrix" rowspan="4">F <br>&gt; 1年</td>    <td class="tg-nrix" rowspan="4">&gt; 2年</td>    <td class="tg-dbp2" rowspan="4">N</td>    <td class="tg-nrix" rowspan="4">过去<br><span style="color:#FE0000"> 2 年</span><br><span style="color:#FE0000">呆满</span><br><span style="color:#FE0000">16</span>个<br>月</td>    <td class="tg-nrix" rowspan="4">3</td>  </tr>  <tr>    <td class="tg-0lax">NB(新伯伦瑞克)</td>  </tr>  <tr>    <td class="tg-0lax">NL(纽芬兰与拉布拉多)</td>  </tr>  <tr>    <td class="tg-0lax">PE(爱德华王子岛)</td>  </tr>  <tr>    <td class="tg-0lax">NT (西北地区)</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">E4</td>    <td class="tg-nrix">0.5年(N)</td>    <td class="tg-nrix">FP</td>    <td class="tg-nrix">-</td>    <td class="tg-dbp2">N</td>    <td class="tg-nrix">-</td>    <td class="tg-dbp2">1</td>  </tr>  <tr>    <td class="tg-0lax">YT (育空）</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">E4</td>    <td class="tg-nrix">0.5年(10)</td>    <td class="tg-nrix">Y</td>    <td class="tg-nrix">-</td>    <td class="tg-dbp2">N</td>    <td class="tg-nrix">-</td>    <td class="tg-dbp2">0.5</td>  </tr>  <tr>    <td class="tg-0lax">NU(努纳武特)</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>    <td class="tg-nrix">-</td>  </tr></tbody></table></escape><blockquote><p><strong>备注：</strong></p><ul><li>满分：5 分。</li><li>E4: 雅思 4 分；F(7级): 法语 7 级。</li><li><strong>入职信</strong> 列 F: Full time 全职；P: Permanent。魁北克省，育空地区只要有工作就行。</li><li><strong>经验</strong> 列 N 表示在西北地区的经验。 </li><li><strong>其他</strong> 列 安省条件非常苛刻，如果你不是特别优越的条件，真的不建议去**安省（多伦多）**做技术移民。</li><li><strong>其他</strong> 列 卑诗省有最低工资要求。</li><li><strong>难度</strong> 列 魁省，如果会法语，会比较简单，如果不会法语，会比较难。</li><li><strong>难度</strong> 列 西北地区需要 LMIA，地区偏僻，雇主愿意做 LMIA。</li></ul></blockquote>]]>
    </content>
    <id>http://yuanmomo.net/2021/04/19/why-canada/</id>
    <link href="http://yuanmomo.net/2021/04/19/why-canada/"/>
    <published>2021-04-19T08:08:26.000Z</published>
    <summary>
      <![CDATA[<h1 id="背景">1. 背景</h1><p>表格数据来自 <strong>东南</strong> 关于加拿大移民的攻略视频：<a href="https://www.youtube.com/watch?v=Qntp2Uqq1s4&t=1219s">加拿大 移民 | 到底哪个移民项目最简单？华人加拿大移民最实用攻略出炉</a></p>
<p>里面列举了每个省的特点和具体的要求，由于是视频，所以不是很方便。为了方便查阅，就整理成文本性的内容。</p>
<p>Up主的频道，在这里：<a href="https://www.youtube.com/channel/UCSX99Rvq5dszj6rzAPkdglA">56BelowTV 零下56</a></p>]]>
    </summary>
    <title>加拿大移民攻略表格整理（东南）</title>
    <updated>2026-06-21T21:12:41.658Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="DeFi" scheme="http://yuanmomo.net/categories/DeFi/"/>
    <category term="DeFi" scheme="http://yuanmomo.net/tags/DeFi/"/>
    <content>
      <![CDATA[<h1 id="什么是-DeFi">1. 什么是 DeFi</h1><p>DeFi: Decentralised Finance</p><p>「信用衍生」:</p><p>「乘数效应」:</p><p><strong>DeFi 目前是通过跨链来解决抵押，通过保证金制度来解决杠杆，最终实现了类似于信用衍生一样的操作。</strong></p><span id="more"></span><p>等额抵押：</p><p>超额抵押：</p><p>智能合约强制平仓：</p><p>基本要素：杠杆，抵押，资金池。</p><p>流动性挖矿：</p><h2 id="DeFi-构成">1.1. DeFi 构成</h2><p><img src="https://img.tupm.net/2021/02/E84B4D607DDDDE62506F547082761653.jpg" alt="defi"></p><p><strong>例如：</strong> Compound 是提供抵押借贷的金融服务协议。</p><p><img src="https://img.tupm.net/2021/02/6CA02EDF60F45DAB25B8549BD5DED184.jpg" alt="compound"></p><p><a href="https://defipulse.com/">DeFi Pulse</a></p><h1 id="DeFi-的指标">2. DeFi 的指标</h1><ul><li>TVL <ul><li>越高越好</li></ul></li><li>Dex 交易量<ul><li>越高越好</li></ul></li><li>以太坊的活跃地址与平均手续费<ul><li>活跃地址数量，长期来说，是越高越好</li><li>手续费越低越好</li></ul></li><li>DeFi市值与以太坊市值的比例<ul><li>越低越好</li></ul></li></ul><h1 id="DeFi-的行业板块">3. DeFi 的行业板块</h1><p><img src="https://img.tupm.net/2021/02/EAB6575164AADF6F542EE595F055FEE2.jpg" alt="defi"></p><h2 id="钱包">3.1. 钱包</h2><p>一个私钥对应的账号，管理资产，比如：以太坊。</p><h2 id="资产管理工具">3.2. 资产管理工具</h2><p>提供钱包的扫描服务，给定一个地址，搜索跟地址相关的所有信息：Debank、Zerion 以及 Zapper。</p><h2 id="抵押借贷">3.3. 抵押借贷</h2><p>Compound。</p><h2 id="去中心化交易所">3.4. 去中心化交易所</h2><p>核心市场。</p><h3 id="UNISWAP">3.4.1. UNISWAP</h3><p>恒定乘积做市商</p><h2 id="聚合收益">3.5. 聚合收益</h2><p>YFI。</p><h2 id="衍生品">3.6. 衍生品</h2><p>期货、期权、杠杆，保险，比如：synthetic</p><h2 id="去中心化保险">3.7. 去中心化保险</h2><p>提供保险服务。</p><h2 id="资产迁移与创造">3.8. 资产迁移与创造</h2><h2 id="DAO">3.9. DAO</h2><p>治理</p><h2 id="预言机">3.10. 预言机</h2><p>提供汇率数据</p><h2 id="行业数据分析工具">3.11. 行业数据分析工具</h2><p>Etherscan</p><p><img src="https://img.tupm.net/2021/02/4EF8A43ECA210E8B8FE540A84DAEFCB8.jpg" alt="defi"></p><h1 id="以太坊">4. 以太坊</h1><h2 id="稳定币">4.1. 稳定币</h2><p>以太坊虽然是以太坊区块链上流通量最大的货币，但是这种货币类似于比特币，价格波动很大。为了解决这个问题，有一些人开始把美金变成可以在以太坊上流通的货币，通过一些方法保证它的价值永远都是一美金，这种货币被叫做稳定币。目前在以太坊区块链上有三种最有名的稳定币，分别是 coinbase 发行的 USDC，bitfinex 发行的 USDT，以及 MakerDao 发行的 Dai。</p><p>USDT: 锚定美元<br>Dai：Maker 用以太抵押<br>USDC: 通过去中心化的智能合约控制价格</p><p><a href="https://zh.wikipedia.org/wiki/%E7%A8%B3%E5%AE%9A%E5%B8%81">稳定币 - 维基百科，自由的百科全书</a></p><h3 id="Dai">4.1.1. Dai</h3><p>Dai 是与美元挂钩的相对稳定的资产。</p><h4 id="说明">4.1.1.1. 说明</h4><ul><li>1 Dai &#x3D; 1USD</li><li>Maker 使用抵押品和价格聚合系统确保 1 Dai 为 1 USD。该抵押品由 MKR 代币持有人管理。</li><li>MKR 持有人充当万不得已的最后买家。以确保 1 Dai &#x3D; 1 USD。</li><li>区块链的魔法，智能合约。</li><li>全球清算为稳定币 Dai 提供了最后一层安全保障。</li><li>您需要稳定币（stablecoins）来充分发挥区块链技术的潜力。</li><li>Maker还是非常棒的去中心化杠杆的工具。</li></ul><h4 id="Maker-如何运作">4.1.1.2. Maker 如何运作</h4><p>抵押品：ETH<br>银行：CDP 智能合约，存放抵押品（ETH）<br>贷款：Dai 币</p><p>如果您的 ETH 币值低于某个值时，您必须像偿还银行贷款一样偿还智能合约 Dai，否则它会将您的 ETH 将被拍卖。</p><p>举例：<br>假设 ETH 现在价值 100 美元，担保比率为 150％。如果我将 1 枚 ETH（100美元）质押给 CDP 智能合约，那么现在我可以贷到 66 个 Dai (100&#x2F;1.5&#x3D;66, 1 Dai &#x3D; 1 USD,66 Dai &#x3D; 66 USD)。<br>这意味着，在 ETH 的当前价值下，我每贷 100 个 Dai 就要有 1.5 个 ETH 做为抵押品(100 Dai &#x2F; 66 Dai &#x3D; 1.5 ETH)。抵押品在 Maker 系统中，但您也不再能控制它。直到你还清 66 个 Dai（Dai 销毁）</p><p><img src="https://img.tupm.net/2021/02/A9F6170CCBE889C9A305A27C4552CA6C.jpg" alt="maker-dai"></p><h5 id="TRFM">4.1.1.2.1. TRFM</h5><p>MakerDAO 是通过目标价格变化率反馈机制 (TRFM) 来实现的。</p><ul><li><p>当 Dai 价格低于 1 美元时，CDP 的债务比例将会降低，抵押相同数量的 ETH 换取的 Dai 将会变少，减少市场上 Dai 的供应，同时增加稳定费，提高获得 Dai 的成本，从而让 Dai 价格升上来。</p></li><li><p>若 Dai 价格高于 1 美元时，CDP 的债务比例将会提高，抵押相同数量的 ETH 换取的 Dai 将会增加，增加市场上 Dai 的供应，同时减少稳定费，降低获得 Dai 的成本，从而让 Dai 价格降下来。</p></li></ul><h5 id="足够的偿付能力">4.1.1.2.2. 足够的偿付能力</h5><p>Dai 是通过质押其他资产生成的，为了保证 Dai 价格稳定，只需要保证质押资产拥有足够的偿还能力即可。</p><ul><li><p>质押资产（ETH）升值时：</p><ul><li>每份 CDP 智能合约都是一份债务，当质押资产升值时，合约中抵押物的偿付能力增强，此时 Dai 的价格可以保持稳定，因为 Dai 背后有资产保证其有足够的偿付能力。另外，当 Dai 的交易价格超过 1 美元，Maker就会通过目标利率反馈机制去激励用户创造更多的 Dai。</li></ul></li><li><p>质押资产贬值时：</p><ul><li>简单来说是通过清算 + MKR 来保证 Dai 价格稳定性的。</li><li>在创建 CDP 的示例中我们可以看到，系统信息栏中质押率为 422.24%、清算线是 150%、清算罚金是 13%，因为质押率和清算线有较大的差异，当价格波动不是非常巨大的时候，质押率发挥作用，确保有足够的偿付能力。</li><li>当质押资产价格大幅度降低的时候，可以通过补充抵押品来确保不会触发清算，清算罚金其本质也是鼓励 CDP 拥有者将质押率位置在一个合理的水品，否则抵押品不但会被自动清算，而且也会被自动罚没一部分金额。</li><li>抵押物价格的进一步降低，如果用户没有补充抵押物时，Maker 协议会触发自动清算，CDP 中的抵押资产会被拍卖直到从 CDP 借出的 Dai 被还清。</li><li>如果抵押资产出现非常大的贬值以至于清算中买拍的资产不足以偿还债务时，Maker 协议会通过流动性供给合约或竞卖机制来解决偿付问题。</li></ul></li></ul><p><a href="https://blog.csdn.net/wuzhengfei1112/article/details/113039424">MakerDao原理</a></p><p><img src="https://img.tupm.net/2021/02/D5309ACFFAF8E2763929DCAC91839904.jpg"></p><h3 id="USDT">4.1.2. USDT</h3><h3 id="USDC">4.1.3. USDC</h3>]]>
    </content>
    <id>http://yuanmomo.net/2021/02/13/defi-01/</id>
    <link href="http://yuanmomo.net/2021/02/13/defi-01/"/>
    <published>2021-02-13T05:30:40.000Z</published>
    <summary>
      <![CDATA[<h1 id="什么是-DeFi">1. 什么是 DeFi</h1><p>DeFi: Decentralised Finance</p>
<p>「信用衍生」:</p>
<p>「乘数效应」:</p>
<p><strong>DeFi 目前是通过跨链来解决抵押，通过保证金制度来解决杠杆，最终实现了类似于信用衍生一样的操作。</strong></p>]]>
    </summary>
    <title>DeFi 学习（一）</title>
    <updated>2026-06-21T21:12:41.654Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="bc" scheme="http://yuanmomo.net/categories/bc/"/>
    <category term="chainlink" scheme="http://yuanmomo.net/tags/chainlink/"/>
    <category term="MetaMask" scheme="http://yuanmomo.net/tags/MetaMask/"/>
    <content>
      <![CDATA[<h1 id="什么是-Chainlink？">1. 什么是 Chainlink？</h1><blockquote><p>长久以来，区块链上运行的智能合约无法直接的与外部系统进行交流，这一瓶颈限制了智能合约应用场景。</p></blockquote><blockquote><p>如今，我们可以通过引入预言机（Oracle）的功能来解决这一问题，预言机可以为智能合约提供与外部世界的连接性。但是目前的预言机都是中心化的服务，这会给使用中心化预言机服务的智能合约带来单点故障的风险，使得智能合约的去中心化特性变得毫无意义。</p></blockquote><blockquote><p>为了解决这个问题，Chainlink开发了首个去中心化预言机项目，来向智能合约提供外部数据。有了这个武器，智能合约的安全性和确定性，与真实世界中发生的各类事件联系了起来。Chainlink将为您的智能合约提供获取任意外部API数据的能力。本文档列出了所有与之相关的信息。</p></blockquote><ul><li><strong>关键字：</strong><ul><li>预言机</li><li>去中心化</li></ul></li></ul><p>Chainlink 文档：<a href="https://docs.chain.link/docs/getting-started">https://docs.chain.link/docs/getting-started</a></p><span id="more"></span><h2 id="开发工具">1.1. 开发工具</h2><h3 id="Remix-Solidity-IDE">1.1.1. Remix Solidity IDE</h3><blockquote><p> <code>Remix</code> 是一个网页端的集成开发环境，可以用它在浏览器里创建、运行、调试智能合约。它由以太坊基金会开发维护。通过 <code>Solidity</code> 开发智能合约所需的一切都在 <code>Remix</code> 的 WEB 界面上提供了，所以开发者无需自行搭建开发环境了。<code>Remix</code> 可以大大简化合约的部署方法，无需使用命令行界面即可方便的部署合约。</p></blockquote><p><strong>Remix 主要是编写 solidity 合约，编译，部署和调用。</strong></p><p><strong>IDE 地址：</strong><a href="https://remix.ethereum.org/">https://remix.ethereum.org/</a></p><h3 id="MetaMask">1.1.2. MetaMask</h3><blockquote><p>MetaMask是一款浏览器插件钱包，不需下载安装客户端，只需添加至浏览器扩展程序即可使用。</p></blockquote><p>使用 Remix Solidity IDE 的 <code>Injected Web3</code> 环境，配合 MetaMask 插件可方便部署智能合约到以太坊<strong>测试网</strong>或者<strong>主网</strong>。</p><p><strong>MetaMask 主要部署合约到测试网，进行合约的调试。</strong></p><h4 id="安装-MetaMask">1.1.2.1. 安装 MetaMask</h4><p><strong>MetaMask 下载地址：</strong><a href="https://metamask.io/download.html">https://metamask.io/download.html</a></p><ol><li>安装好 <code>MetaMask</code> 的 <code>Chrome</code> 插件后，点击 <code>MetaMask</code> 的小狐狸图标打开扩展程序。</li><li>创建一个新的账户。</li><li>您将会看到由12个单词组成的助记词，拷贝这12个助记词到一个只有你自己知道的安全的地方。</li><li>点击头像，进入设置，将网络从以太坊主网络（<code>Main Ethereum Network</code>）切换到 <code>Kovan</code> 测试网络（<code>Ropsten Test Network</code>）。</li></ol><p><img src="https://img.tupm.net/2020/10/1B6DD795A278E4BFB394E2352476E3DA.jpg" alt="meta-mask-kovan-test-network"></p><h3 id="测试网络">1.1.3. 测试网络</h3><p>当前可用的以太坊测试网有如下：</p><ul><li><p>Rinkeby</p><ul><li>一个 <code>POW</code> 的区块链，非常类似于以太坊主网。</li><li>获取 <code>Rinkeby</code> 的以太币：<a href="https://faucet.rinkeby.io/">https://faucet.rinkeby.io/</a></li><li>交易查看地址：<a href="https://rinkeby.etherscan.io/">https://rinkeby.etherscan.io/</a></li></ul></li><li><p>Kovan（<strong>推荐使用</strong>）</p><ul><li>一个 <code>POA</code> 的区块链，不能挖矿，只能申请。</li><li>获取 <code>Kovan</code> 的以太币：<a href="https://faucet.kovan.network/">https://faucet.kovan.network/</a></li><li>加入 <code>gitter</code> 中的 <code>faucet</code> 组织：<a href="https://gitter.im/kovan-testnet/">https://gitter.im/kovan-testnet/</a>。在 <code>gitter</code> 的社区中，发送自己的钱包地址（@管理员 epheph ），就可以获得 <code>4</code> 个测试代币</li><li>交易查看地址：<a href="https://kovan.etherscan.io/">https://kovan.etherscan.io/</a></li></ul></li></ul><h2 id="调试-Chainlink-合约">1.2. 调试 Chainlink 合约</h2><h3 id="获取-LINK-代币">1.2.1. 获取 LINK 代币</h3><ul><li>打开 <code>LINK</code> 代币的获取地址：<a href="https://kovan.chain.link/">https://kovan.chain.link/</a></li><li>从 <code>MetaMask</code> 中获取帐号地址，复制输入框中，点击 <code>Send me 100 Test LINK</code> 按钮</li><li>点击 <code>MetaMask</code> 插件，点击添加代币，选择自定义代币，填写 <code>LINK</code> 代币的地址后自动填充代币信息，点击下一步，完成添加。<ul><li>Rinkeby: <code>0x01BE23585060835E02B77ef475b0Cc51aA1e0709</code></li><li>Kovan : <code>0xa36085F69e2889c224210F603D836748e7dC0088</code></li></ul></li></ul><p><img src="https://img.tupm.net/2020/10/B749BF0BBAF033C07D220B4866EFE6C9.jpg" alt="meta-mask-add-link-coins"></p><h3 id="PriceConsumerV3-获取-ETH-USD-汇率价格">1.2.2. PriceConsumerV3 获取 ETH/USD 汇率价格</h3><ul><li>打开 <code>Remix Solidity IDE</code> 编辑器，在 <code>Featured Plugins</code> 选择 <code>SOLIDITY</code></li><li>复制合约代码</li></ul><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><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></pre></td><td class="code"><pre><span class="line">pragma solidity ^0.6.7;</span><br><span class="line"></span><br><span class="line">import &quot;https://github.com/smartcontractkit/chainlink/evm-contracts/src/v0.6/interfaces/AggregatorV3Interface.sol&quot;;</span><br><span class="line"></span><br><span class="line">contract PriceConsumerV3 &#123;</span><br><span class="line"></span><br><span class="line">    AggregatorV3Interface internal priceFeed;</span><br><span class="line"></span><br><span class="line">    /**</span><br><span class="line">     * Network: Kovan</span><br><span class="line">     * Aggregator: ETH/USD</span><br><span class="line">     * Address: 0x9326BFA02ADD2366b30bacB125260Af641031331</span><br><span class="line">     */</span><br><span class="line">    constructor() public &#123;</span><br><span class="line">        priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    /**</span><br><span class="line">     * Returns the latest price</span><br><span class="line">     */</span><br><span class="line">    function getLatestPrice() public view returns (int,uint80) &#123;</span><br><span class="line">        (</span><br><span class="line">            uint80 roundID, </span><br><span class="line">            int price,</span><br><span class="line">            uint startedAt,</span><br><span class="line">            uint timeStamp,</span><br><span class="line">            uint80 answeredInRound</span><br><span class="line">        ) = priceFeed.latestRoundData();</span><br><span class="line">        // If the round is not complete yet, timestamp is 0</span><br><span class="line">        require(timeStamp &gt; 0, &quot;Round not complete&quot;);</span><br><span class="line">        return (price,answeredInRound);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li><p>部署，调用合约</p><ul><li>点击 <code>Deploy</code> 按钮时，会弹出 MetaMask 页面，点击<strong>确认</strong>继续</li><li>点击 <code>getLatestPrice</code> 按钮，调用合约，即显示当前 <code>ETH/USD</code> 的价格<br><img src="https://img.tupm.net/2020/10/0A65CD75295A022116CA6C5BD09EC1CD.jpg" alt="deploy-contract-PriceConsumerV3"><br><img src="https://img.tupm.net/2020/10/F152CB5F18CCA86A076576745E2EF8D1.jpg" alt="deploy-meta-mask-confirm"></li></ul></li><li><p>查看 <code>Price Feed Contracts</code> 合约内容：<a href="https://kovan.etherscan.io/address/0x9326BFA02ADD2366b30bacB125260Af641031331#code">https://kovan.etherscan.io/address/0x9326BFA02ADD2366b30bacB125260Af641031331#code</a></p></li></ul><h3 id="调用-VFR-合约获取随机数">1.2.3. 调用 VFR 合约获取随机数</h3><ul><li>打开 <code>Remix Solidity IDE</code> 编辑器，在 <code>Featured Plugins</code> 选择 <code>SOLIDITY</code></li><li>复制合约代码</li></ul><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><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></pre></td><td class="code"><pre><span class="line">pragma solidity 0.6.6;</span><br><span class="line"></span><br><span class="line">import &quot;https://github.com/smartcontractkit/chainlink/evm-contracts/src/v0.6/VRFConsumerBase.sol&quot;;</span><br><span class="line"></span><br><span class="line">contract RandomNumberConsumer is VRFConsumerBase &#123;</span><br><span class="line">    </span><br><span class="line">    bytes32 internal keyHash;</span><br><span class="line">    uint256 internal fee;</span><br><span class="line">    </span><br><span class="line">    uint256 public randomResult;</span><br><span class="line">    </span><br><span class="line">    /**</span><br><span class="line">     * Constructor inherits VRFConsumerBase</span><br><span class="line">     * </span><br><span class="line">     * Network: Kovan</span><br><span class="line">     * Chainlink VRF Coordinator address: 0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9</span><br><span class="line">     * LINK token address:                0xa36085F69e2889c224210F603D836748e7dC0088</span><br><span class="line">     * Key Hash: 0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4</span><br><span class="line">     */</span><br><span class="line">    constructor() </span><br><span class="line">        VRFConsumerBase(</span><br><span class="line">            0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9, // VRF Coordinator</span><br><span class="line">            0xa36085F69e2889c224210F603D836748e7dC0088  // LINK Token</span><br><span class="line">        ) public</span><br><span class="line">    &#123;</span><br><span class="line">        keyHash = 0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4;</span><br><span class="line">        fee = 0.1 * 10 ** 18; // 0.1 LINK</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    /** </span><br><span class="line">     * Requests randomness from a user-provided seed</span><br><span class="line">     */</span><br><span class="line">    function getRandomNumber(uint256 userProvidedSeed) public returns (bytes32 requestId) &#123;</span><br><span class="line">        require(LINK.balanceOf(address(this)) &gt; fee, &quot;Not enough LINK - fill contract with faucet&quot;);</span><br><span class="line">        return requestRandomness(keyHash, fee, userProvidedSeed);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    /**</span><br><span class="line">     * Callback function used by VRF Coordinator</span><br><span class="line">     */</span><br><span class="line">    function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override &#123;</span><br><span class="line">        randomResult = randomness;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li><p>部署合约，获取部署的合约地址</p><ul><li>点击 <code>Deploy</code> 按钮时，会弹出 MetaMask 页面，点击<strong>确认</strong>继续</li></ul></li><li><p><strong>重要：转入 LINK 代币到合约</strong></p><ul><li>获取部署后合约的地址</li><li>在 <code>MetaMask</code> 向合约地址转入 <code>LINK</code> 代币</li></ul></li></ul><p><img src="https://img.tupm.net/2020/10/13FCB5DD7AFE775EDFA5E92DED1660F8.jpg" alt="copy-deployed-contract-address"></p><p><img src="https://img.tupm.net/2020/10/083D8F78D9DA04623AB7FE6142F12ECE.jpg" alt="send-link-to-contract-address"></p><ul><li>调用合约，获取随机数<ul><li>先发送获取随机数请求</li><li>发送请求获取生成的随机数<br><img src="https://img.tupm.net/2020/10/560B906B3A49437C49671E57725B230C.jpg" alt="send-get-random-number"></li></ul></li></ul><blockquote><p><strong>提示：</strong></p><ul><li>如果没有向部署的合约转入 <code>LINK</code> 代币，会提示错误：<code>Gas estimation errored with the following message (see below). The transaction execution will likely fail. Do you want to force sending? </code></li><li><code>The execution failed due to an exception. Reverted</code>。</li></ul></blockquote><p><img src="https://img.tupm.net/2020/10/32787996C388D037419A3BF069E7C624.jpg" alt="chain-link-contract-with-on-link-coin-error-tip"></p>]]>
    </content>
    <id>http://yuanmomo.net/2020/10/09/chain-link-tutorial-01/</id>
    <link href="http://yuanmomo.net/2020/10/09/chain-link-tutorial-01/"/>
    <published>2020-10-09T07:46:39.000Z</published>
    <summary>
      <![CDATA[<h1 id="什么是-Chainlink？">1. 什么是 Chainlink？</h1><blockquote>
<p>长久以来，区块链上运行的智能合约无法直接的与外部系统进行交流，这一瓶颈限制了智能合约应用场景。</p>
</blockquote>
<blockquote>
<p>如今，我们可以通过引入预言机（Oracle）的功能来解决这一问题，预言机可以为智能合约提供与外部世界的连接性。但是目前的预言机都是中心化的服务，这会给使用中心化预言机服务的智能合约带来单点故障的风险，使得智能合约的去中心化特性变得毫无意义。</p>
</blockquote>
<blockquote>
<p>为了解决这个问题，Chainlink开发了首个去中心化预言机项目，来向智能合约提供外部数据。有了这个武器，智能合约的安全性和确定性，与真实世界中发生的各类事件联系了起来。Chainlink将为您的智能合约提供获取任意外部API数据的能力。本文档列出了所有与之相关的信息。</p>
</blockquote>
<ul>
<li><strong>关键字：</strong><ul>
<li>预言机</li>
<li>去中心化</li>
</ul>
</li>
</ul>
<p>Chainlink 文档：<a href="https://docs.chain.link/docs/getting-started">https://docs.chain.link/docs/getting-started</a></p>]]>
    </summary>
    <title>Chainlink 入门 -- 基础工具篇</title>
    <updated>2026-06-21T21:12:41.654Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="k8s" scheme="http://yuanmomo.net/categories/k8s/"/>
    <category term="Docker" scheme="http://yuanmomo.net/tags/Docker/"/>
    <category term="Kubernetes" scheme="http://yuanmomo.net/tags/Kubernetes/"/>
    <category term="k8s" scheme="http://yuanmomo.net/tags/k8s/"/>
    <content>
      <![CDATA[<h1 id="安装">1. 安装</h1><h2 id="环境类型">1.1. 环境类型</h2><p>k8s 的安装可以分为三种：</p><ul><li>学习环境</li><li>生产环境</li><li>最佳实践</li></ul><span id="more"></span><h3 id="学习环境">1.1.1. 学习环境</h3><p>在学习环境中，主要使用 Minikube。</p><p>Minikube 是一种可以让你在本地轻松运行 Kubernetes 的工具。 Minikube 在笔记本电脑上的虚拟机（VM）中运行<strong>单节点 Kubernetes 集群</strong>， 供那些希望尝试 Kubernetes 或进行日常开发的用户使用。</p><h4 id="安装-Minikube">1.1.1.1. 安装 Minikube</h4><p>Minikube 的安装参考：<a href="https://kubernetes.io/zh/docs/tasks/tools/install-minikube/">安装 Minikube</a>，主要流程大致如下：</p><ol><li>检查环境</li><li>安装 <code>kubectl</code>，参考：<a href="https://kubernetes.io/zh/docs/tasks/tools/install-kubectl/#install-kubectl-on-linux">安装 kubectl</a><ol><li>启用 kubectl 的 shell 自动补全功能，参考：<a href="https://kubernetes.io/zh/docs/tasks/tools/install-kubectl/#%E5%90%AF%E7%94%A8-shell-%E8%87%AA%E5%8A%A8%E8%A1%A5%E5%85%A8%E5%8A%9F%E8%83%BD">kubectl shell 自动补全</a></li></ol></li><li>安装 <code>Hypervisor</code>，安装 VirtualBox</li><li>安装 <code>Minikube</code></li></ol><p>Mac 的安装过程大致如下：</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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">## 检查 macOS 是否支持虚拟化技术</span></span><br><span class="line"><span class="comment"># 如果你在输出结果中看到了 VMX （应该会高亮显示）的字眼，说明你的电脑已启用 VT-x 特性。</span></span><br><span class="line">sysctl -a | grep -E --color <span class="string">&#x27;machdep.cpu.features|VMX&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">## 安装 kubectl</span></span><br><span class="line"><span class="comment"># 安装 kubectl</span></span><br><span class="line">brew install kubernetes-cli</span><br><span class="line"><span class="comment"># 查看安装的 kubectl 版本</span></span><br><span class="line">kubectl version --client</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启用 kubectl 的 shell 自动补全功能</span></span><br><span class="line"><span class="comment"># fish shell</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/evanlucas/fish-kubectl-completions</span><br><span class="line"><span class="built_in">ln</span> -s -f fish-kubectl-completions/kubectl.fish ~/.config/fish/completions/kubectl.fish</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用 Homebrew 安装 Minikube</span></span><br><span class="line">brew install minikube</span><br></pre></td></tr></table></figure><h4 id="启动-Minikube">1.1.1.2. 启动 Minikube</h4><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 由于国内无法直接连接 k8s.gcr.io，推荐使用阿里云镜像仓库，</span></span><br><span class="line"><span class="comment"># 在 minikube start 中添加 --image-repository 参数。</span></span><br><span class="line"><span class="comment"># 由于要拉取镜像，所以等待时间可能会比较长</span></span><br><span class="line">minikube start --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers</span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取集群状态</span></span><br><span class="line">minikube status</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看集群信息</span></span><br><span class="line">kubectl cluster-info</span><br><span class="line"></span><br><span class="line"><span class="comment"># 列出集群中运行的节点</span></span><br><span class="line">kubectl get nodes</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看节点的详细信息</span></span><br><span class="line">kubectl  describe node &lt;node-name&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 登录集群 VM</span></span><br><span class="line">minikube ssh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 清理本地状态</span></span><br><span class="line">minikube delete</span><br><span class="line"></span><br><span class="line"><span class="comment"># 停止集群</span></span><br><span class="line">minikube stop</span><br></pre></td></tr></table></figure><h4 id="部署简单服务">1.1.1.3. 部署简单服务</h4><h5 id="编写一个简单-Web-服务">1.1.1.3.1. 编写一个简单 Web 服务</h5><p>一个简单的 Web 服务，输出相应的主机名称。代码如下：</p><figure class="highlight typescript"><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></pre></td><td class="code"><pre><span class="line"># app.<span class="property">js</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> http = <span class="built_in">require</span>(<span class="string">&#x27;http&#x27;</span>)</span><br><span class="line"><span class="keyword">const</span> os = <span class="built_in">require</span>(<span class="string">&#x27;os&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;Kubia server starting....&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> handler = <span class="keyword">function</span> (<span class="params">request, response</span>) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;Received request fromt &quot;</span> + request.<span class="property">connection</span>.<span class="property">remoteAddress</span>);</span><br><span class="line">    response.<span class="title function_">writeHead</span>(<span class="number">200</span>);</span><br><span class="line">    response.<span class="title function_">end</span>(<span class="string">&quot;You&#x27;ve hit &quot;</span> + os.<span class="title function_">hostname</span>() + <span class="string">&quot;\n&quot;</span>);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> www = http.<span class="title function_">createServer</span>(handler);</span><br><span class="line"></span><br><span class="line">www.<span class="title function_">listen</span>(<span class="number">8080</span>);</span><br></pre></td></tr></table></figure><h5 id="制作-Docker-镜像">1.1.1.3.2. 制作 Docker 镜像</h5><p>编写一个 Dokcerfile，然后编译服务为一个 Docker 镜像。</p><figure class="highlight dockerfile"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> node:<span class="number">7</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">ADD</span><span class="language-bash"> app.js /app.js</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="string">&quot;node&quot;</span>, <span class="string">&quot;app.js&quot;</span>]</span></span><br></pre></td></tr></table></figure><p>编译并发布镜像：</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><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"><span class="comment"># 编译镜像</span></span><br><span class="line">docker build -t yuanmomo/kubia:latest .</span><br><span class="line"></span><br><span class="line"><span class="comment"># 运行镜像，打开浏览器后，返回 http://localhost:8080</span></span><br><span class="line">docker run --name kubia-test -p 8080:8080  yuanmomo/kubia:latest</span><br><span class="line"></span><br><span class="line"><span class="comment"># 登录 Docker 账号</span></span><br><span class="line">docker login -u xxx -p xxx</span><br><span class="line"></span><br><span class="line"><span class="comment"># push 镜像</span></span><br><span class="line">docker push yuanmomo/kubia:latest</span><br></pre></td></tr></table></figure><blockquote><p><strong>提示：</strong></p><ul><li>因为 k8s 集群运行在 Mac 的虚拟机中，所以在集群中部署服务时，会自动从仓库中拉取镜像，而不能使用 Mac 本地的镜像，所以一定要将镜像推送到远程仓库。否在在部署服务时，会出现 <code>ImagePullBackOff</code> 错误。</li><li>可以对 <code>kubelet</code> 做一个别名：<code>alias k=&quot;kubelet&quot;</code></li></ul></blockquote><h5 id="部署应用">1.1.1.3.3. 部署应用</h5><p>使用 使用 <code>kubectl run</code> 部署应用（创建容器）：</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><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 一定要将 yuanmomo/kubia:latest 镜像推送到远程仓库</span></span><br><span class="line">kubectl run kubia --image=yuanmomo/kubia:latest --port=8080 --generator=run-pod/v1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 列出 pod</span></span><br><span class="line"><span class="comment"># 主要看 STSTUS 列，如果显示 Running，表示启动成功。</span></span><br><span class="line">kubectl get pods</span><br></pre></td></tr></table></figure><h4 id="访问-Web-服务">1.1.1.4. 访问 Web 服务</h4><h5 id="创建服务对象">1.1.1.4.1. 创建服务对象</h5><p>创建 <code>LoadBalancer</code> 服务：</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><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># rc 是 replicationcontroller 的缩写</span></span><br><span class="line"><span class="comment"># po =&gt; pods</span></span><br><span class="line"><span class="comment"># svc =&gt; service</span></span><br><span class="line">» kubectl expose rc kubia --<span class="built_in">type</span>=LoadBalancer --name kubia-http</span><br><span class="line">service/kubia-http exposed</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><code>kubectl expose</code> 暴露的 <code>kubia-http</code> 也是一个服务，可以通过 <code>kubectl get svc</code> 查看。</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">» kubectl get svc</span><br><span class="line">NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE</span><br><span class="line">kubernetes   ClusterIP      10.96.0.1        &lt;none&gt;        443/TCP          4m20s</span><br><span class="line">kubia-http   LoadBalancer   10.108.242.216   &lt;pending&gt;     8080:31928/TCP   3m10s</span><br></pre></td></tr></table></figure><blockquote><p><strong>提示：</strong></p><ul><li>由于 Minikube 不支持 LoadBalancer 类型的服务。所以，这里不会有 <code>&lt;EXTERNAL-IP&gt;</code> 地址。</li></ul></blockquote><h5 id="获取访问地址">1.1.1.4.2. 获取访问地址</h5><p>使用 <code>minikube service kubia-http</code> 获取可以访问服务的 IP 和端口。</p><h4 id="容器伸缩">1.1.1.5. 容器伸缩</h4><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 列出当前 ReplicationController 的副本数</span></span><br><span class="line">» kubectl  get rc</span><br><span class="line">NAME    DESIRED   CURRENT   READY   AGE</span><br><span class="line">kubia   1         1         1       13m</span><br><span class="line"></span><br><span class="line"><span class="comment"># 增加期望的副本数到 3 </span></span><br><span class="line">kubectl  scale rc kubia --replicas=3</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看扩容的结果</span></span><br><span class="line">» kubectl  get rc</span><br><span class="line">NAME    DESIRED   CURRENT   READY   AGE</span><br><span class="line">kubia   3         3         3       18m</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看应用运行的具体节点</span></span><br><span class="line">» kubectl  get pods -o wide</span><br><span class="line">NAME          READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES</span><br><span class="line">kubia-bhj8q   1/1     Running   0          8s    172.18.0.6   minikube   &lt;none&gt;           &lt;none&gt;</span><br><span class="line">kubia-dhvhh   1/1     Running   0          20m   172.18.0.3   minikube   &lt;none&gt;           &lt;none&gt;</span><br><span class="line">kubia-ngrrc   1/1     Running   0          8s    172.18.0.7   minikube   &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><p>访问 Web 服务地址，会发现请求会随机的落到三个容器中。</p><p><img src="https://img.tupm.net/2020/09/8E2B3B26DB5803E73C649666E5653710.jpg" alt="random-pods-request"></p><h4 id="访问-Minikube-的-dashboard">1.1.1.6. 访问 Minikube 的 dashboard</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">minikube dashboard</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>http://yuanmomo.net/2020/09/07/k8s-install/</id>
    <link href="http://yuanmomo.net/2020/09/07/k8s-install/"/>
    <published>2020-09-07T16:56:01.000Z</published>
    <summary>
      <![CDATA[<h1 id="安装">1. 安装</h1><h2 id="环境类型">1.1. 环境类型</h2><p>k8s 的安装可以分为三种：</p>
<ul>
<li>学习环境</li>
<li>生产环境</li>
<li>最佳实践</li>
</ul>]]>
    </summary>
    <title>Kubernetes（k8s）入门（安装，启动，部署服务）</title>
    <updated>2026-06-21T21:12:41.658Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="bc" scheme="http://yuanmomo.net/categories/bc/"/>
    <category term="bc" scheme="http://yuanmomo.net/tags/bc/"/>
    <category term="oracle" scheme="http://yuanmomo.net/tags/oracle/"/>
    <content>
      <![CDATA[<h1 id="什么是预言机">1. 什么是预言机</h1><p>2018 年 11 月 6 日，中国人民银行发布的《区块链能做什么？不能做什么？》报告中，是这样对预言机定义的：</p><blockquote><p>区块链外信息写入区块链内的机制，一般被称为预言机 (oracle mechanism) 。</p></blockquote><p>从定义来看，预言机的功能就是将外界信息写入到区块链内，完成区块链与现实世界的数据互通。它允许确定的智能合约对不确定的外部世界作出反应，是智能合约与外部进行数据交互的唯一途径，也是区块链与现实世界进行数据交互的接口。预言机作为区块链和现实世界之间的纽带，扮演这数据互通的角色。</p><span id="more"></span><h1 id="为什么需要预言机？">2. 为什么需要预言机？</h1><p>在说明为什么需要预言机之前，我们需要知道区块链最重要的特点：</p><ol><li><p>具有确定状态的状态机</p><ul><li>区块链的本质就是一个状态机。</li><li>系统中所有的节点从同一个创世状态开始，依次运行达成共识的区块内的交易，驱动各个节点的状态按照相同操作序列（增加，删除，修改）不断变化，实现所有节点在执行完相同编号区块内的交易后，状态完全一致，我们把这个状态称之为世界状态。</li></ul></li><li><p>没有边界</p><ul><li>没有固定数量的节点，一旦达成共识，每个节点的状态必须保持一致。</li></ul></li></ol><p>如果说区块链就是一个状态机，那么改变这个状态的就是 EVM（以太坊虚拟机）。它能够在分散的网络中的任何节点上执行程序，并更新受共识规则约束的区块链状态。为了保持共识，EVM 的执行过程必须完全确定。这就产生了两个比较重要的结果：</p><ul><li><p><strong>EVM 和智能合约没有内在的随机性来源；</strong></p><ul><li>节点 A 将执行命令并代表智能合约存储 3 在其存储中，而节点 B 执行相同的智能合约，将存储 7。这样会导致节点 A 和 B 的结果有两种情况，虽然执行的是相同的代码，这样就会导致节点之间无法达成共识。</li></ul></li><li><p><strong>外部数据只能通过交易数据传入；</strong></p><ul><li>区块链是确定性的环境，不允许不确定的事情或因素，智能合约不管何时何地运行都必须是一致的结果。所以虚拟机（VM）不能让智能合约有 network call（网络调用），从外部是获取数据，不然就会导致结果不的不确定性，从而也无法达成共识。</li></ul></li></ul><blockquote><p>区块链是一个封闭的环境，链上是无法主动发起 Network call（网络调用）主动获取链外真实世界的数据，只能被交易触发，被动的通过交易接收数据。其次，智能合约最终的执行需要合约参与方的私钥签署，智能合约本身没有办法自动执行。</p></blockquote><p>所以，预言机就是为了解决智能合约无法主动去获取链外的数据，只能被动接受数据的问题，能够让智能合约主动从外部获取数据。</p><h2 id="预言机的实现">2.1. 预言机的实现</h2><p><img src="https://img.tupm.net/2020/06/8E1D5F4994036FBF9A8C3C4EA0A8D3A8.jpg" alt="oracle-implemetion"></p><p>上图就是理想中预言机的工作流程，即用户的智能合约把请求给链上 Oracle 合约，通过链下的 API 接口获得外部数据，更确切的说是外部把数据给链上的 Oracle 合约，然后 Oracle 合约再把数据给用户的智能合约。</p><h1 id="预言机的应用场景和示例">3. 预言机的应用场景和示例</h1><p>在理想的情况下，预言机提供了一种无信任（或者至少近乎无信任）的方式来获取外在的（即“真实世界”或“链外”）信息，例如足球比赛的结果，黄金的价格或真正的随机数字，用于以太坊平台上的智能合约。</p><blockquote><ol><li>可以将预言机视为弥合链外世界与智能合约之间差距的机制；</li><li>允许智能合约基于真实世界的事件和数据来强制执行合约关系（基于智能合约实行的航空延误险）；</li></ol></blockquote><p>但是，这样的模式也会给以太坊的安全模型带来<strong>外部风险</strong>。</p><blockquote><p>假如有一个“智能遗嘱”的合约–当一个人去世时分配资产。如果这样的合约控制的继承金额足够高，那么在所有者<em>死亡之前</em>攻击预言机（发出假的死讯）并触发资产分配的动机是非常强烈的。</p></blockquote><h2 id="数据来源的真实性">3.1. 数据来源的真实性</h2><p>某些预言机可以提供某些私有数据源的数据，例如学术证书和政府 ID。这些数据的来源，如大学或者政府部门，是完全可信的。</p><blockquote><p>数据的真实性是<strong>主观的</strong>（真相只能通过来源的权威来确定）</p></blockquote><h2 id="适用场景">3.2. 适用场景</h2><p>预言机作为区块链与现实世界进行数据交互的桥梁，应用场景非常多，可以说一切需要与链下进行数据交互的 DApp 都需要预言机。</p><ul><li>来自物理来源的随机数&#x2F;熵（例如量子&#x2F;热现象）：公平地选择彩票智能合约中的赢家，博彩游戏</li><li>与自然灾害相关的参数触发器：触发巨灾债券智能合约（对于飓风债券来说的风速）</li><li>汇率数据：将稳定币与法定货币准确挂钩</li><li>资本市场数据：代币化资产&#x2F;证券的定价篮子</li><li>基准参考数据：将利率纳入智能金融衍生品</li><li>损害赔偿：保险合约</li><li>航班延误：保险合约</li></ul><h3 id="DeFi">3.2.1. DeFi</h3><p><strong>目前最主要的场景就是 DeFi（Decentralized Finance，去中心化金融）</strong></p><p>DeFi 领域的项目为什么需要预言机。类似 DAI 这样的稳定币系统，需要获取 ETH 的实时价格，来判断所抵押的加密货币是否达到了平仓价格进而触发平仓。假设有 1000 个节点，那就需要向交易所（比如币安）或 CoinMarketCap 的 ETH &#x2F; USDT 交易对进行 1000 次的 API 数据请求 ，但是，由于 ETH 的价格是实时变动的，加上网络延迟、计算速度等原因，每个节点获取到的价格可能都不相同，这部分数据被输入到智能合约后，节点间无法达成共识，那么整个系统就会崩溃。</p><h3 id="博彩游戏">3.2.2. 博彩游戏</h3><p>博彩游戏的核心是不可预测、可验证的随机数，从而决定赌注的最终结果，但是在链上是无法生成随机数的或者说在链上的随机数是可以被预测和破解的，这时候就需要预言机从外部给智能合约安全的、不可预测的随机数。</p><p>现在的大多数博彩游戏都是在链上生成随机数，所以很容易被预测和破解，导致资产被盗，大家有兴趣的可以去看一下DApp被盗的相关研究报告，很多因为随机数问题被盗的。比如 BetDice、Dice2Win。</p><p>关于智能合约中的随机数，可以参考 DOS Network 创始人@nrek jonny 关于<a href="https://zhuanlan.zhihu.com/p/50219222">《智能合约中的随机数》</a>的分享。其实，早在 Fomo3D 这个游戏出来之后，以太坊的 Team Leader 就在推特上说过链上是无法生成随机数的。</p><blockquote><p>Dear devs… you can&#96;t generate random numbers on chain！</p></blockquote><p><img src="https://img.tupm.net/2020/06/F5F01C593CF5BE4C4FBBDB15364416E1.jpg" alt="eth-random-number"></p><h1 id="预言机的设计模式">4. 预言机的设计模式</h1><h2 id="预言机的基本功能">4.1. 预言机的基本功能</h2><ol><li>从链外的数据源收集数据。</li><li>使用签名消息在链上传输数据。</li><li>将数据放入智能合约的存储空间，使数据可用。</li></ol><p>一旦数据在智能合约的存储中可用，其他智能合约就可以通过调用预言机智能合约的“检索”功能来访问。</p><h2 id="预言机的设计模式-1">4.2. 预言机的设计模式</h2><p>预言机有三种设计模式：</p><ol><li>立即读取</li><li>发布与订阅</li><li>请求与相应</li></ol><h3 id="立即读取">4.2.1. 立即读取</h3><ul><li>在需要时<strong>即时</strong>获取</li><li>比如，这个人是否满 18 岁；</li><li>数据存储在合约中，其他智能合约使用对语言及合约的请求调用来查找（跟请求和响应的区别是，不涉及外部交互）</li></ul><h3 id="发布与订阅">4.2.2. 发布与订阅</h3><ul><li>链上智能合约轮询</li><li>链外守护进程监视和更新</li><li>比如，价格查询，天气信息，交通数据</li><li>轮询可能消耗大量的 gas</li></ul><h3 id="请求与相应">4.2.3. 请求与相应</h3><ul><li>最复杂的情况</li><li>数据空间太大，无法存储在智能合约中，并且每次用户值需要整个数据集的一小部分</li><li>数据提供商的业务模型</li></ul><p><strong>主要步骤：</strong></p><ul><li>接受来自 DApp 的查询</li><li>解析查询</li><li>检查是否符合付款和数据权限&#x2F;权利义务</li><li>从链外数据源检索相关数据（并在必要时加密）</li><li>使用包含的数据对事物进行签名</li><li>将事务广播到网络</li><li>安排任何进一步必要的交易，例如通知等</li></ul><p>类似的，可以从外部所有帐户（EOA）请求数据并直接返回数据，从而无需使用oracle 智能合约。也可以向支持物联网的硬件传感器发出请求和响应。因此，oracle 可以是人，软件或硬件。</p><h1 id="数据认证">5. 数据认证</h1><p>在“请求&#x2F;响应”模式下，可能会存在多个实体的操作，如何防止数据在传输中被篡改？所以，必须要让链外方可以证明返回数据的完整性。</p><p>两种方式：</p><ul><li>真实性证明（authenticity proof）</li><li>可信执行环境（Trusted Execution Environment, TEE）</li></ul><h2 id="真实性证明">5.1. 真实性证明</h2><p>真实性证明是用密码学证据证明数据没有被篡改过，比如使用数字签名。</p><p>将信任从数据提供者转移到证明者（证明方法的提供者），通过在链上验证真实性，智能合约能够在对其进行操作之前验证数据的完整性。</p><h3 id="Oraclize">5.1.1. Oraclize</h3><p><a href="http://www.oraclize.it/">Oraclize：为以太坊提供中心化预言机服务</a></p><p>Oraclize 依托亚马逊 AWS 服务和 TLSNotary 技术，是一个可证明的诚实的预言机服务，不过它是中心化的，目前只能在以太坊网络使用，而且 gas 费较高。但是不妨碍它是目前很受欢迎的预言机服务，也可能是因为还没有更好的选择吧。这里有 Oraclize 详细的使用说明：<a href="http://docs.oraclize.it/">Oraclize Documentation</a></p><p><strong>特点：</strong></p><ul><li>中心化</li><li>基于亚马逊 AWS 服务和 TLSNotary 技术</li><li>智能在以太坊网络适用</li><li>gas 费用较高</li></ul><p><strong>基础：亚马逊不会篡改虚拟机实例。</strong></p><h2 id="可信执行环境">5.2. 可信执行环境</h2><p>基于硬件的安全区（security enclave）来验证数据的完整性。</p><h3 id="TownCrier">5.2.1. TownCrier</h3><p>TownCrier 基于英特尔的 SGX（Software Guard eXtensions）提供：</p><ul><li><p>HTTPS 查询的响应可靠性验证</p></li><li><p>完整性保证</p><ul><li>确保在安全区内运行的应用程序受到CPU的保护，防止任何其他进程被篡改</li></ul></li><li><p>机密性保证</p><ul><li>应用程序在安全区中运行时，其状态对其它进程来说是不可知的</li></ul></li></ul><p><strong>基础：假设信任（Intel&#x2F;SGX）。</strong></p><h1 id="计算型的预言机">6. 计算型的预言机</h1><p>以太坊上的计算成本太高，出现了提供密集计算功能的预言机。</p><p>Oraclize 提供的服务允许去中心化应用请求输出在沙盒 AWS 虚拟机中执行的计算。</p><p>作为可验证预言机事实上的标准，“Cryptlet” 的概念已经被规范化为微软更广泛的 ESC 框架的一部分。</p><p>TrueBit 是一个可扩展和可验证的链外计算的解决方案。它引入了一个解决这和验证者系统，分别执行计算和验证。</p><h1 id="去中心化的预言机">7. 去中心化的预言机</h1><p>大多的预言机都是中心化的预言机系统，需要依赖可信的权威：</p><ul><li>Oraclize 需要假设亚马逊不会篡改虚拟机实例</li><li>Town Crier 需要假设 Intel&#x2F;SGX 不会篡改返回的数据</li></ul><p>所有中心化的预言机都存在单点故障。</p><h2 id="ChainLink">7.1. ChainLink</h2><p><a href="https://chain.link/">Chainlink：以太坊上第一个去中心化预言机解决方案</a><br><img src="https://img.tupm.net/2020/06/E5D71F576CBDD635EE7C3365A11643F4.jpg" alt="chainlink-architect"></p><p>ChainLink 提出了一种去中心化预言机网络，包括三个关键的智能合约：</p><ul><li><p>声誉合约</p><ul><li>跟踪数据提供商的绩效</li></ul></li><li><p>订单匹配合约</p><ul><li>从声誉合约的语言集中选择竞标者，并最终确定服务层级要约（Service Level Agreement, SLA），其中包含了查询参数和要求的预言机数量</li></ul></li><li><p>数据汇总合约</p><ul><li>使用“commit-reveal” 提交模式从多个预言机处收集相应，计算查询的最终总结果，然后将结果反馈回声誉合约。</li></ul></li></ul><h2 id="欧链-OracleChain">7.2. 欧链 OracleChain</h2><p><a href="https://oraclechain.io/">欧链 OracleChain：EOS 上的第一个去中心化预言机解决方案</a></p><p><img src="https://img.tupm.net/2020/06/112226CE99E1121BA998F69C88EDE566.jpg" alt="oracle-chain-architect"></p><p>欧链采用自主的 PoRD 机制（Proof-of-Reputation&amp;Deposit），本质上是一种抵押代币奖惩机制的声誉系统，奖励数据节点惩罚作恶节点，可以实现 Augur、Gnosis 等预测市场应用的功能，还能支撑对链外数据有更高频率访问需求的智能合约业务。预测市场的结果本身有时也可以作为 Oracle 的输入数据源，欧链更像是预测市场，而且不足是单纯的声誉系统容易集中化。目前欧链只在 EOS 上开发，而且专注于提供随机数服务。</p><h2 id="DOS-Network">7.3. DOS Network</h2><p><a href="https://dos.network/">DOS Network：支持多条主流公链的去中心化预言机服务网络</a></p><p><img src="https://img.tupm.net/2020/06/04E3FCFF5D679B96297840356FE2D72D.jpg" alt="dos-architect"></p><p>DOS Network 是一个 Layer-2 的预言机解决方案，它通过在链上部署一个轻量级智能合约，链下是一个 p2p 网络，服务节点的选取和数据验证采用 VRF+阈值签名等技术，保证了去中心化和数据安全，并达到快速反应。可以适配所有主流公链，比如以太坊、EOS、Tron、ThunderCore、Ultrain 等。</p><h2 id="去中心化预言机的挑战">7.4. 去中心化预言机的挑战</h2><p>去中心化方案的一个重大挑战：<strong>构建数据汇总函数。</strong></p><ul><li><p>ChainLink </p><ul><li>通过在链上的智能合约和链下的数据节点，通过奖惩机制和聚合模型的方式，进行数据的请求和馈送。不过也有一些不足，比如链式聚合成本较高，拓展性差，基于声誉系统容易集中化。他们更关注支付场景的应用，比如帮助银行与企业之间建立智能合约。</li></ul></li><li><p>SchellingCoin 协议</p><ul><li>将中位数作为“正确”答案。记录者必须先质押保证金，这些保证金会根据他与中位数的接近程度重新分配，由此激励人们记录与其他人提供的值相近的值。这些共同的数值，就是所谓的“谢林点”。</li></ul></li><li><p>Jason Teutsch 方案</p><ul><li>利用一条专用的工作量证明区块链，该区块链能够正确地报告在给定时期内的注册数据是否可用。矿工尝试下载，存储和传播所有当前注册的数据，因此保证数据在本地可用。虽然这样的系统在每个挖掘节点存储和传播所有注册数据的意义上是昂贵的，但是系统允许通过在注册周期结束之后释放数据来重用存储。</li></ul></li></ul><h1 id="中心化和去中心化的选择">8. 中心化和去中心化的选择</h1><p>在 DeFi 领域稳定币、去中心化杠杆交易、金融衍生品交易等都需要预言机，只是短期内大多数项目选择使用自己搭建的预言机服务，但实际上这会有很多问题，比如单点故障、易受攻击等，比如知名的衍生品交易平台 Synthetix 在 19 年 6 月份遭遇了 oracle 攻击，损失超过 3700 万枚 sETH，「<a href="https://www.8btc.com/article/433457">Synthetix平台遭Oracle攻击，攻击者篡改汇率，低价大量换购sETH - 巴比特</a>」。</p><p>这个事件的具体原因可以在这篇文章中查看「<a href="https://mp.weixin.qq.com/s/FUR6eIzQDCMDXFU4nYeXUA">中心化预言机有多“脆弱”？从 Synthetix 被攻击事件得到反思</a>」，</p><p>所以，在长久的来看，去中心化预言机应该是更好的方式。</p><h1 id="总结">9. 总结</h1><p>正如上面所了解的，预言机为智能合约提供了至关重要的服务：将外部的事实带入合约执行。当然，预言机也会带来很大的风险：如果他们是受信任的来源并且可能受到损害，可能导致他们提供的智能合约执行受损。</p><p>一般来说，在考虑使用预言机时要非常的<strong>小心信任模型</strong>。一旦<strong>认为</strong>预言机可以信任，那么合约的安全性就可能因为来自预言机的错误输入受到破坏。所以，需要特别注意预言机的信任机制。</p><p>去中心化的语言既可以解决一些问题，并为以太坊智能合约提供无信任的外部数据。谨慎选择，你就可以开始探索以太坊与语言及提供的“真实世界”之前的桥梁。</p>]]>
    </content>
    <id>http://yuanmomo.net/2020/06/21/bc-oracle/</id>
    <link href="http://yuanmomo.net/2020/06/21/bc-oracle/"/>
    <published>2020-06-21T07:28:02.000Z</published>
    <summary>
      <![CDATA[<h1 id="什么是预言机">1. 什么是预言机</h1><p>2018 年 11 月 6 日，中国人民银行发布的《区块链能做什么？不能做什么？》报告中，是这样对预言机定义的：</p>
<blockquote>
<p>区块链外信息写入区块链内的机制，一般被称为预言机 (oracle mechanism) 。</p>
</blockquote>
<p>从定义来看，预言机的功能就是将外界信息写入到区块链内，完成区块链与现实世界的数据互通。它允许确定的智能合约对不确定的外部世界作出反应，是智能合约与外部进行数据交互的唯一途径，也是区块链与现实世界进行数据交互的接口。预言机作为区块链和现实世界之间的纽带，扮演这数据互通的角色。</p>]]>
    </summary>
    <title>区块链预言机（oracle）</title>
    <updated>2026-06-21T21:05:37.467Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="bc" scheme="http://yuanmomo.net/categories/bc/"/>
    <category term="bc" scheme="http://yuanmomo.net/tags/bc/"/>
    <category term="transaction" scheme="http://yuanmomo.net/tags/transaction/"/>
    <content>
      <![CDATA[<h1 id="什么是交易">1. 什么是交易</h1><p>交易是由<strong>外部系统账户</strong>对<strong>区块链系统</strong>发起的经过<strong>签名的消息</strong>。</p><blockquote><p>**外部账户：**拥有私钥的账户，控制合约的访问（比如发起交易）；私钥用于对交易进行签名<br>**合约账户：**智能合约部署后的地址；没有私钥</p></blockquote><span id="more"></span><h1 id>2. </h1><h1 id="交易的作用">3. 交易的作用</h1><ul><li>触发区块链状态改变（管理资产，价值转移）</li><li>触发 EVM 上的合约执行；</li></ul><p><strong>交易的生命周期：</strong></p><pre><code>构建交易私钥签名网络传输到多个节点通过共识机制打包到区块执行交易（节点执行交易相关智能合约代码，修改区块链状态，存储新区块状态）交易确认生成交易回执（receipt），和交易一起保存在区块中（结果码，日志，消耗的 gas 量）</code></pre><p><img src="https://img.tupm.net/2020/06/74D82FA7EB4AC21BA9364B8659A4A833.jpg" alt="transaction-lifetime"></p><blockquote><p>”只读”交易用于读取链上数据，节点收到请求后会根据请求的参数访问状态信息并返回，并不会将请求加入共识流程，也不会导致修改链上的数据。</p></blockquote><h1 id="交易的结构">4. 交易的结构</h1><p>交易的本质是一串打包在一起的二进制数据。</p><p><strong>下表是某公链的交易结构：</strong></p><table><thead><tr><th>字段</th><th>描述</th></tr></thead><tbody><tr><td>nonce</td><td>由始发EOA（外部所有账户）发出的序列号，<br>用于防止消息重播（交易的重放攻击）。</td></tr><tr><td>gas price</td><td>发起人愿意支付的gas价格（以wei为单位）。</td></tr><tr><td>gas limit</td><td>发起人愿意支付的最大gas量。</td></tr><tr><td>to</td><td>目标区块链中账户地址。</td></tr><tr><td>value</td><td>发送到目标地址的资产数量。</td></tr><tr><td>data</td><td>附在交易中的变长二进制数据。</td></tr><tr><td>v,r,s</td><td>始发EOA的ECDSA签名的三个组成部分。</td></tr></tbody></table><p><strong>备注：</strong></p><blockquote><p>EOA 表示外部账户；<br>交易消息的结构使用递归长度前缀（RLP）编码方案；<br>交易结构并不包含 EOA 的地址的 “from” 字段，EOA 的公钥通过 ECDSA 签名的 v,r,s 计算得出；<br>不同的联盟链对数据结构有相应的扩充；比如：<a href="https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/protocol_description.html">FISCO-BCOS 交易的数据结构和编码协议</a>；</p></blockquote><h2 id="RLP-编码方案">4.1. RLP 编码方案</h2><p>RLP（Recursive Length Prefix），递归长度前缀编码：</p><ul><li>主要用于数据的网络传输和持久化存储；</li><li>不包含任何字段的标识符或者标签；</li><li>使用长度偏移量来表示每个字段的长度；</li></ul><blockquote><p><strong>参考文档：</strong></p><ul><li><a href="https://segmentfault.com/a/1190000011763339">RLP编码</a></li></ul></blockquote><h1 id="交易的随机数（nonce）">5. 交易的随机数（nonce）</h1><p>nonce 是一个数值，等于这个地址发出的交易数量，当这个地址与合约关联时，是这个地址所创建的合约数量。</p><p><strong>特点：</strong></p><ul><li>发起方地址的一个属性，只在发送地址的上下文中才有意义；</li><li>没有作为账户状态的一部分，显示的保存在区块链上，而是通过计算发送方地址已经确认的交易数量而动态计算；</li></ul><p><strong>作用：</strong></p><ul><li>创建顺序交易，去中心化系统中，保证节点按照一定的顺序（nonce 的值大小）先后处理交易；</li><li>交易重复保护，防止原始交易被”复制“后重复发起；</li></ul><h2 id="nonce-间隔">5.1. nonce 间隔</h2><p>区块链网络是根据 nonce 数值的顺序处理交易，如果发出了一个 <code>nonce = 0</code> 的交易，接下来发起一个 <code>nonce = 2</code> 的交易（缺少了 <code>nonce = 1</code> 的交易），那么第二个交易不会被确认，会一直存在<em><strong>待确认交易内存池</strong></em>中，区块链网络会一直等待 <code>nonce = 1</code> 的交易出现。所有节点都认为 <code>nonce = 1</code> 的交易因为网络延迟问题还没有传输过来，而 <code>nonce = 2</code> 的交易先到。</p><h2 id="nonce-确认">5.2. nonce 确认</h2><p>由于区块链网络处理交易是根据 nonce 的数值顺序来处理，所以，一旦中间某个交易没有被“确认”（成功处理），那么之后所有的交易都会被“卡”住，会一直等待没有被确认的交易。</p><p>交易可以在 nonce 序列中产生无意的“间隙”，比如因为它无效或 gas 不足。为了让交易能够被继续处理，你必须使用缺失的 nonce 值创建一笔有效的交易。一旦这笔确实的交易被确认后，后续的交易都会被广播，逐渐变得有效；而且无法“撤回”任何交易。</p><h2 id="nonce-重复">5.3. nonce 重复</h2><p>如果发出两个相同的 nonce 的交易，但是接受地址，或者交易金额不同，那么只有其中的一笔交易会被确认，另一个会被拒绝。最先到达区块链网络中确认节点的那个交易会被确认（随机）</p><h1 id="交易-gas（了解-BSN-最终的计费方案？）">6. 交易 gas（了解 BSN 最终的计费方案？）</h1><p>gas 是区块链网络中的计量单位，表示在区块链上执行具体的操作所消耗的计算量和存储资源。</p><p><strong>特点：</strong></p><ul><li><strong>独立的虚拟货币</strong>；</li></ul><p><strong>目的：</strong></p><ul><li>控制交易对资源的使用，防止虚拟机内恶意代码死循环；</li><li>避免拒绝服务攻击；</li><li>防止交易的过度消耗；</li><li>使用 gas 来表示对资源的消耗，不牵扯到具体的虚拟币，可以让物理资源不受虚拟币价格的波动而受到影响。</li></ul><p><strong>gasPrice：</strong></p><ul><li>gasPrice 从字面上来看，表示 gas 的价格，表示在发起交易时，发起方愿意为每单位 gas 支付多少的 代币数量。因此，gas 的单位为：wei&#x2F;gas；</li><li>gasPrice 最低可接受的值是 0；</li><li>gasPrice 越高，交易被确认的速度越快；</li></ul><p><strong>gasLimit：</strong></p><ul><li>gasLimit 表示发起方为了完成交易所愿意支付的最大 gas 数量；</li></ul><p><strong>gasUsed：</strong></p><ul><li>gasUsed 是交易中消耗的总共的 gas；</li><li>交易的总费用 &#x3D; gasUsed * gasPrice &lt;&#x3D; gasLimit；</li></ul><h1 id="交易的接收方（to）">7. 交易的接收方（to）</h1><p>to 是一个 20 字节的区块链账户地址，有两种：</p><ul><li>外部账户地址：资产转移；</li><li>合约地址：调用合约方法；</li></ul><blockquote><p><strong>提示：</strong></p><ul><li>区块链不会验证接收方的地址正确性。</li></ul></blockquote><h1 id="交易中的-value-和-data">8. 交易中的 value 和 data</h1><p>交易数据包的核心是两个字段：value 和 data。</p><p>交易中 value 和 data 的情况：</p><ul><li>同时包括 value 和 data：</li><li>只有 value：支付操作；</li><li>只有 data：合约调用；</li><li>既没有 value 也没有 data：没有意义，浪费 gas；</li></ul><h1 id="特殊交易-合约创建">9. 特殊交易-合约创建</h1><p>合约创建交易的目的地址是一个特殊地址–零地址（0x0），data 字段中包含经过编译的合约字节码，目的是把合约注册到区块链网络上。同事，如果 value 字段中包括了代币，表示为合约设置起始余额。</p><h1 id="交易签名">10. 交易签名</h1><p>交易签名的流程：</p><ul><li>创建一个包含九个字段的交易数据结构：nonce，gasPrice，startGas，to，value，data，v，r，s；</li><li>生成交易的RLP编码的序列化消息；</li><li>计算此序列化消息的Keccak256哈希；</li><li>计算ECDSA签名，用发起EOA的私钥签名散列；</li><li>在交易中插入ECDSA签名计算出的 r 和 s 值；</li></ul><blockquote><p><strong>提示：</strong></p><ul><li>v 表示链标识符 chainId。</li><li>“简单重放攻击保护”的 EIP-155 标准。通过在交易结构中加入一个 v 变量（chainId，不同的网络 chainId 有不同的值，比如 区块链网络 A 是 1， 区块链网络 B 是 61 等等）来实现。确保在一个区块链网络（如区块链网络 A）上创建的交易在其它的区块链（如区块链网络 B 或者 区块链 测试网）上是不合法的。所以，在一个网络广播的交易，不能被重放到另一个网络，这就是所谓的重放攻击保护。</li></ul></blockquote><h1 id="离线签名">11. 离线签名</h1><p>离线签名是指将交易的签名和交易的广播分开处理，将交易的签名放在一个不连外网的环境中。等交易签名后，再将签名后的交易放入到联网的网络中进行广播。</p><p><strong>目的：</strong></p><ul><li>保护私钥的安全；</li></ul><h1 id="总结">12. 总结</h1><p>区块链的本质就是一个不可篡改的分布式账本，而账本是由一个个区块组成，每个区块通过引入前一个区块的 hash 值，形成一个链状结构的数据。每一个区块，包含了区块头和区块体，区块体由一笔笔交易和相关的回执信息组成。所以，交易作为区块链数据存储的最基本的单位，在区块链中扮演重重要的角色。</p><p>同时，交易也是区块链网络系统进行每项活动的起点，是区块链网络中的“输入”窗口，可以触发虚拟机执行合约，价值转换等操作，用于修改区块链的状态。</p>]]>
    </content>
    <id>http://yuanmomo.net/2020/06/20/bc-transaction/</id>
    <link href="http://yuanmomo.net/2020/06/20/bc-transaction/"/>
    <published>2020-06-20T07:37:38.000Z</published>
    <summary>
      <![CDATA[<h1 id="什么是交易">1. 什么是交易</h1><p>交易是由<strong>外部系统账户</strong>对<strong>区块链系统</strong>发起的经过<strong>签名的消息</strong>。</p>
<blockquote>
<p>**外部账户：**拥有私钥的账户，控制合约的访问（比如发起交易）；私钥用于对交易进行签名<br>**合约账户：**智能合约部署后的地址；没有私钥</p>
</blockquote>]]>
    </summary>
    <title>区块链的触发器--交易</title>
    <updated>2026-06-21T21:12:41.654Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="hexo" scheme="http://yuanmomo.net/categories/hexo/"/>
    <category term="markdow" scheme="http://yuanmomo.net/tags/markdow/"/>
    <category term="table" scheme="http://yuanmomo.net/tags/table/"/>
    <content>
      <![CDATA[<h1 id="Markdown-总结">1. Markdown 总结</h1><h2 id="快速创建表格（仅支持-Mac）">1.1. 快速创建表格（仅支持 Mac）</h2><p>Markdown 的表格在创建的时候，总是需要敲很多的 <code>|</code>，<code>-</code>，耗时耗力，所以搜寻了一个 Mac Alfred 插件，可以快捷创建多行多列的表格。快捷呼出 Alfred，输入 <code>tb 3 5</code>，就直接在文档中插入 3 列，5 行的表格代码</p><blockquote><p><strong>参考文档：</strong></p><ul><li><a href="https://github.com/crispgm/alfred-markdown-table">https://github.com/crispgm/alfred-markdown-table</a></li></ul></blockquote><span id="more"></span><h2 id="快速粘贴表格（仅支持-Mac）">1.2. 快速粘贴表格（仅支持 Mac）</h2><p>如果需要把 HTML 页面，Excel 中的表格，甚至一行行 csv 格式的数据导入到 Markdown 的表格中，如果一行行手动敲表格，然后再粘贴数据就太慢了。</p><p>可以直接拷贝 HTML 和 Excel 中的表格到剪贴板，此时是 csv 的数据格式，可以快捷呼出 Alfred，输入 <code>tbl</code>，然后选择一个格式，即可在文档中插入表格代码。</p><blockquote><p><strong>参考文档：</strong></p><ul><li><a href="https://github.com/danielecook/markdown-table-alfred">https://github.com/danielecook/markdown-table-alfred</a></li><li><a href="https://github.com/deanishe/alfred-fixum">https://github.com/deanishe/alfred-fixum</a></li></ul></blockquote><h2 id="table-合并单元格">1.3. table 合并单元格</h2><p>Markdown 默认的表格语法是不支持单元格合并的，如果要实现单元格合并的功能，比如下面的表格：</p><escape><table><thead>  <tr><th>第一列</th><th colspan="2">merge</th><th colspan="3">合并三列</th></tr></thead><tbody>  <tr><td></td><td>min</td><td>max</td><td>最小值</td><td>最大值</td><td>推荐值</td></tr>  <tr><td>数值</td><td>1</td><td>100</td><td>1</td><td>10</td><td>5</td></tr></tbody></table></escape><p>要实现这个功能，需要使用 HTML 中的 <code>&lt;table&gt;</code> 语法，将表格的 HTML 插入到一对 <code>&amp;lt;escape&amp;gt;&amp;lt;/escape&amp;gt;</code>中即可。</p><p>推荐一个表格工具：<a href="https://www.tablesgenerator.com/html_tables#">在线编辑表格，支持导出，支持 <code>HTML</code>，<code>Markdow</code></a></p>]]>
    </content>
    <id>http://yuanmomo.net/2020/06/06/markdown-tips/</id>
    <link href="http://yuanmomo.net/2020/06/06/markdown-tips/"/>
    <published>2020-06-06T14:19:33.000Z</published>
    <summary>
      <![CDATA[<h1 id="Markdown-总结">1. Markdown 总结</h1><h2 id="快速创建表格（仅支持-Mac）">1.1. 快速创建表格（仅支持 Mac）</h2><p>Markdown 的表格在创建的时候，总是需要敲很多的 <code>|</code>，<code>-</code>，耗时耗力，所以搜寻了一个 Mac Alfred 插件，可以快捷创建多行多列的表格。快捷呼出 Alfred，输入 <code>tb 3 5</code>，就直接在文档中插入 3 列，5 行的表格代码</p>
<blockquote>
<p><strong>参考文档：</strong></p>
<ul>
<li><a href="https://github.com/crispgm/alfred-markdown-table">https://github.com/crispgm/alfred-markdown-table</a></li>
</ul>
</blockquote>]]>
    </summary>
    <title>Makdown 技巧</title>
    <updated>2026-06-21T21:12:41.658Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="bc" scheme="http://yuanmomo.net/categories/bc/"/>
    <category term="bc" scheme="http://yuanmomo.net/tags/bc/"/>
    <category term="consensus" scheme="http://yuanmomo.net/tags/consensus/"/>
    <content>
      <![CDATA[<h1 id="什么是共识">1. 什么是共识</h1><p>首先，查一下新华字典：</p><blockquote><p>共识：指一个社会不同阶层、不同利益的人所寻求的共同认识、价值、理想。</p></blockquote><p>简单理解就是指所有的参与者（关联方）都达成一致的意思。</p><pre><code>公司的年会活动聚餐，不同的人有不同的喜好和口味，有的人喜欢吃火锅，有的人喜欢烧烤，有的人不吃辣，有的人不吃海鲜。。。</code></pre><p>此时，共识就是指大家最终达成了一致的协定，最终选择了一个年会聚餐的地方。</p><span id="more"></span><h1 id="为什么需要共识">2. 为什么需要共识</h1><p>对于一个有多个参与者的系统或者组织，如果大家都按照各自的意愿做事，那么，这个系统和组织也就没有意义。</p><p>设想，如果在一个分布式数据库系统中，查询一个用户的余额，不同的节点，对相同的用户返回了不同的余额，那么这个系统也就毫无可靠信而言。</p><h1 id="如何达成共识">3. 如何达成共识</h1><ul><li><p><strong>中心化系统</strong></p><ul><li>在一个中心化的系统中，只需要所有的参与者都服从“中心”的安排即可。比如，数据库的主从备份，公司的组织架构管理等等。</li></ul></li><li><p><strong>去中心化系统</strong></p><ul><li>在去中心化系统中，每个参与者都是对等的关系，没有任何的参与者是处于权力领导地位。此时，就需要使用某些特定的共识机制，来达成去中心化系统的共识，而这个共识机制，就是所谓的共识算法。</li></ul></li></ul><h1 id="区块链中的共识">4. 区块链中的共识</h1><p>区块链系统，是一个典型的去中心化的系统，包含未知数量的节点，每个节点之间都是对等关系。</p><p>在区块链系统中，每个节点（即参与者）不仅自己维护一份数据（也就是常说的区块链账本），同时，还保持跟其他节点（其它参与者）维护的数据相一致，这就是区块链中的共识。</p><h1 id="共识机制（共识算法）">5. 共识机制（共识算法）</h1><p>在区块链共识中，协同松散耦合、互不信任的节点之间达成信任关系，并保障一致性，持续性协作的过程，通常抽象为“共识”过程，而这个过程中，所牵涉的算法和策略统称为共识机制。所以，共识机制，往往也称作为共识算法。</p><p>区块链系统是有多个节点组成，任意安装了相应区块链系统所需软硬件，加入到区块链网络里的计算机，就可以称为一个“节点”。如果节点间通信十分顺畅，各个节点都能瞬间响应，那么只需要简单广播投票和应答就可以解决一致性问题。然后现实并不是这样。节点往往会遇到<strong>网络中断</strong>、<strong>节点故障</strong>、<strong>恶意节点（被入侵后篡改，或者原本就是恶意节点）</strong>。节点遇到的问题可以进行如下的分类：</p><ul><li>节点出现故障但不会伪造信息的情况称为“非拜占庭错误”；</li><li>节点会伪造信息恶意响应的情况称为“拜占庭错误”，伪造信息的节点称为拜占庭节点（恶意节点）。</li></ul><p>相对应的，共识算法也可以分为 CFT 和 BFT 两类：</p><ul><li><p>CFT（Crash Fault Tolerance）：</p><ul><li>只容忍节点故障，不容忍“恶意”作恶；</li><li>常见的比如：Paxos，Raft 等等；</li></ul></li><li><p>BFT（Byzantine Fault Tolerance）：</p><ul><li>可以容忍节点故障与“恶意”节点；</li><li>常见的比如：POW，POS（DPoS），POA，PBFT（dBFT，RPBFT）等等；</li></ul></li></ul><blockquote><p>恶意节点是指在一个节点发送错误或者被篡改过的数据。可能是由于被外部入侵后修改，也可能原本就是某些攻击者估计接入的篡改了区块链系统软件的节点。</p></blockquote><h2 id="CFT-算法">5.1. CFT 算法</h2><p>Paxos 算法和 Raft 算法是常见于分布式服务器集群中的共识算法，主要目的是解决分布式系统中存在故障（fault），但不存在恶意（corrupt）节点场景（即可能消息丢失或重复，但无错误消息）下的共识达成（Consensus）问题。</p><p>Paxos 算法出现的比较早，在后来一系列的 Paxos 算法变种形成了丰富的 Paxos 算法族。Raft 算法与 Paxos 算法有很大的关联，可以认为 Raft 就是在 Paxos 算法基础上改进而来。</p><h2 id="Paxos-Raft">5.2. Paxos &amp;&amp; Raft</h2><ul><li><p><strong>Paxos</strong></p><ul><li>1990 年由 Leslie Lamport 提出的 Paxos 共识算法，在工程角度实现了一种最大化保障分布式系统一致性（存在极小的概率无法实现一致）的机制。Paxos 被广泛应用在 Chubby、ZooKeeper 系统中。</li><li>早期的 Basic Paxos 的协议复杂，且相对效率较低，所以在后来提示了很多对几点 Paxos 改进的版本，比如：Fast Paxos，Multi-Paxos 以及 Byzanetine Paxos 等等。</li></ul></li><li><p><strong>Raft</strong></p><ul><li><p>Raft（Replication and Fault Tolerant）算法是 Paxos 算法的一种简化实现。它保证了在一个由 N 个节点构成的系统中有 (N+1)&#x2F;2（向上取整）个节点正常工作的情况下的系统的一致性。比如在一个 5 个节点的系统中允许 2 个节点出现非拜占庭错误，如节点宕机、网络分区、消息延时。</p></li><li><p>Raft相比于Paxos更容易理解，且被证明可以提供与 Paxos 相同的容错性以及性能，其详细介绍可见<a href="https://raft.github.io/">官网</a>及<a href="http://thesecretlivesofdata.com/raft/">动态演示</a>。</p></li></ul></li><li><p><strong>Paxos 和 Raft 比较</strong></p><ul><li>Paxos 相对 Raft，理解和实现都更难；</li><li>Raft 的流程和描述更清晰，更容易理解和实现；</li><li>Raft 能容忍 不大于 (N-1)&#x2F;2 个故障节点；</li><li>Paxos 根据不同的实现，最大容忍错误不一致，Fast-Paxos 为 （N-1)&#x2F;3, Basic-Paxos 和 Multi-Paxos 为 (N-1)&#x2F;2；</li><li>Paxos 和 Raft 算法不能解决拜占庭问题；</li><li>Raft 的建议性更适合作为区块链共识算法（<strong>仅仅作用域联盟链等可信网络的区块链系统</strong>）</li></ul></li></ul><blockquote><p><strong>参考文档：</strong></p><ul><li><a href="https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/consensus/raft.html">Raft 算法</a></li><li><a href="https://zh.wikipedia.org/wiki/Paxos%E7%AE%97%E6%B3%95">Paxos 算法</a></li><li><a href="https://zhuanlan.zhihu.com/p/88290363">分布式一致性算法对比 - Raft VS Paxos</a></li></ul></blockquote><h2 id="BFT-算法">5.3. BFT 算法</h2><p>BFT 类算法，最主要的特点是，可以解决拜占庭问题，可以容忍在去中心化的分布式系统中存在部分恶意节点。</p><h2 id="POW">5.4. POW</h2><p>POW（Proof Of Work）：即工作量证明，简单说就是干的越多，收的越多。</p><p>依赖机器进行数学运算（通过 HASH 运算来寻找一个特征值）来获取记账权，资源消耗相比其他共识机制高、可监管性弱。同时每次达成共识需要全网共同参与运算，性能效率比较低，容错性方面<strong>允许全网 50% 节点出错</strong>。</p><ul><li><p><strong>优点：</strong></p><ul><li>算法简单，容易实现；</li><li>节点间无需交换额外的信息即可达成共识；</li><li>破坏系统需要投入极大的成本；</li></ul></li><li><p><strong>缺点：</strong></p><ul><li>浪费能源；</li><li>区块的确认时间难以缩短；</li><li>新的区块链必须找到一种不同的散列算法，否则就会面临比特币的算力攻击；</li><li>容易产生分叉，需要等待多个确认；</li><li>永远没有最终性，需要检查点机制来弥补最终性；</li></ul></li><li><p>**使用者：**Bitcoin、Ethereum、Litecoin、Dogecoin 等。</p></li></ul><h2 id="POS">5.5. POS</h2><p>POS（Proof of Stake）：即权益证明，也作股权证明，简单点说就是持有越多，获得越多。</p><p>POS 是 POW 的一种升级共识机制，根据每个节点所占代币的比例和时间，获得股份比例，拥有代币股份越多的人越容易获取记账权，等比例的降低挖矿难度，从而加快找随机数的速度。</p><ul><li><p><strong>优点：</strong></p><ul><li>节能，不需要无用计算；</li><li>在一定程度上缩短了共识达成的时间；</li></ul></li><li><p><strong>缺点：</strong></p><ul><li>安全性还需要更进一步的检验；</li><li>币如何产生和分配机制设计难度较高；</li></ul></li><li><p><strong>使用者：</strong></p><ul><li>Ethereum（即将推出）、Peercoin、Nxt。</li></ul></li></ul><p><img src="https://img.tupm.net/2020/06/A697E65190833F64F1D76B996CE2413E.jpg" alt="pos-vs-pow"></p><h2 id="DPoS">5.6. DPoS</h2><p>DPoS（Delegated Proof of Stake）：即<strong>股份授权证明机制</strong>或者<strong>受托人机制</strong>。DPOS与POS原理相同，只是选了一些“人大代表”。</p><p>从某种角度来看，DPoS 有点像民主大会，持币人选出几个代表节点来运营网络，用专业运行的网络服务器来保证区块链网络的安全和性能。DPOS机制中，不需要算力解决数学难题，而是由持币者选出谁说生产者，如果生产者不称职，就有随时有可能被投票出局，这也就解决了POS的性能问题。</p><p>为了方便理解，可以再举个例子。想象有这样一家公司：公司员工总数有 1000 人，每个人都持有数额不等的公司股份。每隔一段时间，员工可以把手里的票投向自己最认可的 10 个人来领导公司，其中每个员工的票权和他手里持有的股份数成正比。等所有人投完票以后，得票率最高的10 个人成为公司的领导。</p><p>如果有领导能力不胜任或做了不利于公司的事，那员工可以撤销对改领导的投票，让他的得票率无法进入前10名，从而退出管理层。这就是对 DPoS(Delegated Proof of Stake)共识机制的一个形象描述。</p><ul><li><p><strong>优点：</strong></p><ul><li>能耗低；</li><li>大幅缩小参与验证和记账节点的数量，可以达到秒级的共识验证（EOS 的块时间是 0.5 秒）；</li></ul></li><li><p><strong>缺点：</strong></p><ul><li>拥有高权益的参与者可投票使自己成为一名验证者（这是近期已在 EOS 中出现的问题）；</li><li>投票需要消耗时间，精力，导致投票的积极性并不高。绝大多数持股人（90％+）从未参与投票；</li><li>节点代理是人为选出的，公平性相比 PoS 较低；</li><li>同时整个共识机制还是依赖于代币的增发来维持代理节点的稳定性，很多商业应用是不需要代币存在的；</li></ul></li><li><p><strong>使用者：</strong></p><ul><li>BitShares、Steemit、EOS、Lisk、Ark。</li></ul></li></ul><h2 id="PoA（Proof-of-Authority，权威证明）">5.7. PoA（Proof of Authority，权威证明）</h2><p>POA（Proof of Authority）：即权威证明。</p><p>PoA 机制不挖矿也不需要 Token。在基于此 PoA 的区块链网络中，所有的交易和区块均由验证人（Validator）处理。PoA 平台的维护成本低，但在 PoA 中，交易和验证区块的验证人，必须是能通过可靠性审查的人。所以，PoA 的验证人必然非常关注自身声誉。声誉在 PoA 里就是非常重要的资产。一般情况下，验证人会公开自己的实际身份。目前，这种共识机制形成的区块链技术主要是应用在行业特征明显的联盟链、私有链上。</p><ul><li><p><strong>优点：</strong></p><ul><li>节能，维护成本相对较低；</li><li>出块效率高；</li><li>不需要代币；</li></ul></li><li><p><strong>缺点：</strong></p><ul><li>略为中心化；</li><li>虽然可用于公有区块链，但是更多用于私有区块链，许可区块链，联盟链等；</li></ul></li><li><p><strong>使用者：</strong></p><ul><li>POA.Network、Ethereum Kovan testnet、VeChain，GE航空（GE Aviation）和沃尔玛（Walmart）的物流链、Giveth、Tomochain、Go-Chain。</li></ul></li></ul><h2 id="PBFT">5.8. PBFT</h2><p>PBFT（Practical Byzantine Fault Tolerance）：即实用拜占庭容错。</p><p>PBFT 算法中，有一个节点会被当做主节点，而其他节点都是备份节点。系统内的所有节点都会相互通信，最终目标是大家能以少数服从多数的原则达成数据的共识。</p><p>每一个共识过程分下面这四步：</p><ol><li>客户端发一个请求给主节点去执行某个操作。</li><li>主节点广播这个请求到各个备份节点。</li><li>所有节点执行操作并把结果返回给客户端。</li><li>当客户端收到 f + 1 个来自不同节点的相同的结果后，过程结束。f 代表可能撒谎的节点的最大值。</li></ol><p>从第 4 步也可以看出，只要客户端能保证多数人认可了一个相同的结果，这个结果就是最终的共识了。同时，为了保证主节点失效后，系统的活性，会触发视图切换。或者，如果主节点出现明显的撒谎迹象，其他的节点也可以联合起来更换主节点，触发视图切换。</p><ul><li><p><strong>优点：</strong></p><ul><li>不需要代币；</li><li>共识的时延大约在 2~5 秒钟，基本达到商用实时处理的要求；</li><li>共识效率高，可满足高频交易量的需求；</li></ul></li><li><p><strong>缺点：</strong></p><ul><li>仅仅适用于联盟链，私有链；</li><li>网络复杂度过高，可拓展性比较低，一般的系统在达到 100 左右的节点个数时，性能下降非常快；</li><li>PBFT在网络不稳定的情况下延迟很高；</li><li>当有超过 (N-1)&#x2F;3 个无效或者恶意节点时，系统无法提供服务；</li></ul></li><li><p><strong>使用者：</strong></p><ul><li>Hyperledger Fabric、Stellar、Ripple、Dispatch、FISCO-BCOS</li></ul></li></ul><h2 id="PBFT-衍生（dBFT，RPBFT）">5.9. PBFT 衍生（dBFT，RPBFT）</h2><p>dPBFT（Delegated Byzantine Fault Tolerance）：授权拜占庭容错算法。<br>RPBFT（Rotation Practical Byzantine Fault Tolerance）：轮流拜占庭容错算法。</p><p>dPBFT 和 RPBFT 原理跟 PBFT 类似，只是不是所有的节点都参与共识，而是将节点分为两种，共识节点和和验证节点：</p><ul><li>共识节点<ul><li>执行 PBFT 共识流程的节点，有轮流出块权限；</li></ul></li><li>验证节点<ul><li>不执行共识流程，验证共识节点是否合法、区块验证，经过若干轮共识后，会切换为共识节点；</li></ul></li></ul><p>共识节点之间通过 PBFT 算法达成共识，转发给验证节点进行验证。dPBFT 和 RPBFT 之间的区别仅仅是选择共识节点的算法不一样：</p><ul><li><p>dPBFT：根据权益投票选举；</p></li><li><p>RPBFT：轮流将共识节点替换为验证节点）</p></li><li><p><strong>优点：</strong></p><ul><li>不需要代币；</li><li>且由于算法复杂度与节点数无关，所以，性能衰减远小于 PBFT；</li><li>网络复杂度与节点规模无关，可扩展性强于 PBFT 共识算法；</li><li>共识效率更高，可秒级确认；</li></ul></li><li><p><strong>缺点：</strong></p><ul><li>仅仅适用于联盟链，私有链；</li><li>当有超过 (N-1)&#x2F;3 个无效或者恶意节点时，系统无法提供服务；</li></ul></li><li><p><strong>使用者：</strong></p><ul><li>FISCO-BCOS（RPBFT），Neo（dBFT）</li></ul></li></ul><h1 id="区块链类型x">6. 区块链类型x</h1><p>现在的区块链，主要分为：公有链，私有链，联盟链、许可链。</p><ul><li><p><strong>公有链</strong></p><ul><li>公有链是开源的，全世界的人都可以参与，完全去中心化；</li><li>公有链是匿名的，通过节点之间的共识机制达到信任完成交易，公有链一般会通过代币机制来鼓励参与者竞争记账，来确保数据的安全性；</li><li>读写权限是对所有人开放的，任何人都可以接入；</li><li>常见的 BTC，ETH，EOS；</li></ul></li><li><p><strong>私有链</strong></p><ul><li>仅限在<strong>一个企业</strong>、组织以及机构内的用户访问和交易，参与节点的资格会被严格限制；</li><li>参与节点是有限和可控的，极快的交易速度、更好的隐私保护、更低的交易成本、不容易被恶意攻击；</li><li>常见可用于一些金融、审计机构，用以存放账本及数据（不能被篡改）的存放；</li></ul></li><li><p><strong>联盟链</strong></p><ul><li>若干个（<strong>大于一个</strong>）企业、组织以及机构共同参与管理的区块链；</li><li>常用语组织机构间的交易和结算，比如银行的对账等等；</li></ul></li><li><p><strong>许可链</strong></p><ul><li>参与到区块链系统中的每个节点都是经过许可的，未经许可的节点是不可接入系统中；</li><li>私有链和联盟链都属于许可链；</li><li>有些许可链没有代币机制，因为不需要代币来鼓励节点竞争记账；</li></ul></li></ul><h1 id="总结">7. 总结</h1><p>这个世界上，没有任何事物是完美无缺的，对于共识机制而言也是。不同的共识机制都有自己的优缺点，甚至，有些共识机制就是是为解决一些特定的问题而生。</p><p>往往在评价一个共识机制时，不能单纯的用好或者坏来定义，要根据业务属性来判断，主要从场景、去中心化程度、记账节点、响应时间、存储效率、吞吐量和容错性等维度进行比较。</p><ul><li><strong>共识机制的多维度对比：</strong></li></ul><table><thead><tr><th align="left">维度</th><th align="center">Pow</th><th align="center">PoS</th><th align="center">DPoS</th><th align="center">PoA</th><th align="center">Raft</th><th align="center">PBFT<br>(dBFT，RPBFT)</th></tr></thead><tbody><tr><td align="left">试用场景</td><td align="center">公链</td><td align="center">公链<br>许可链</td><td align="center">公链<br>许可链</td><td align="center">许可链</td><td align="center">许可链</td><td align="center">许可链</td></tr><tr><td align="left">去中心化<br>程度</td><td align="center">完全</td><td align="center">完全</td><td align="center">完全</td><td align="center">半中心化</td><td align="center">半中心化</td><td align="center">半中心化</td></tr><tr><td align="left">记账节点</td><td align="center">全网</td><td align="center">全网</td><td align="center">选出若干<br>代表</td><td align="center">部分授权<br>代表</td><td align="center">一个 Leader</td><td align="center">动态决定</td></tr><tr><td align="left">相应时间</td><td align="center">10 分钟</td><td align="center">1 分钟</td><td align="center">3 秒左右</td><td align="center">秒级</td><td align="center">秒级</td><td align="center">秒级</td></tr><tr><td align="left">存储效率</td><td align="center">全账本</td><td align="center">全账本</td><td align="center">全账本</td><td align="center">全账本</td><td align="center">全账本</td><td align="center">全账本 + 部分账本</td></tr><tr><td align="left">吞吐量</td><td align="center">约 7 TPS</td><td align="center">约 15 TPS</td><td align="center">约 300 TPS 或更高</td><td align="center">几千到万</td><td align="center">几千到万</td><td align="center">约 1000 TPS到几万</td></tr><tr><td align="left">容错</td><td align="center">50%</td><td align="center">50%</td><td align="center">50%</td><td align="center">50%</td><td align="center">50%</td><td align="center">33%</td></tr><tr><td align="left">实例</td><td align="center">BTC</td><td align="center">Ethereum 2.0</td><td align="center">EOS</td><td align="center">POA.Network</td><td align="center">FISCO-BCOS</td><td align="center">FISCO-BCOS，<br>NEO</td></tr></tbody></table><p>鱼和熊掌不可兼得，区块链中的安全，性能以及去中心化三个方面，同样不可兼得。</p>]]>
    </content>
    <id>http://yuanmomo.net/2020/06/06/bc-consensus/</id>
    <link href="http://yuanmomo.net/2020/06/06/bc-consensus/"/>
    <published>2020-06-06T14:16:28.000Z</published>
    <summary>
      <![CDATA[<h1 id="什么是共识">1. 什么是共识</h1><p>首先，查一下新华字典：</p>
<blockquote>
<p>共识：指一个社会不同阶层、不同利益的人所寻求的共同认识、价值、理想。</p>
</blockquote>
<p>简单理解就是指所有的参与者（关联方）都达成一致的意思。</p>
<pre><code>公司的年会活动聚餐，不同的人有不同的喜好和口味，有的人喜欢吃火锅，有的人喜欢烧烤，有的人不吃辣，有的人不吃海鲜。。。
</code></pre>
<p>此时，共识就是指大家最终达成了一致的协定，最终选择了一个年会聚餐的地方。</p>]]>
    </summary>
    <title>常见区块链的共识机制对比</title>
    <updated>2026-06-21T21:12:41.654Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="other" scheme="http://yuanmomo.net/categories/other/"/>
    <category term="other" scheme="http://yuanmomo.net/tags/other/"/>
    <category term="webank" scheme="http://yuanmomo.net/tags/webank/"/>
    <content>
      <![CDATA[<p>今年的疫情，打乱了很多事情，自己也选择了裸辞，在家休息了一个月。很庆幸，在很多我不知道名字的英雄们的努力下，国内现在是最安全的地方。我也可以安心出门去公司上班，虽然还戴着口，但是至少心里面好了很多。以前还会去吐槽什么什么，现在，为自己能伸出在最安全的地方而自豪。</p><p>2 月 12 号提出离职，3 月 6 号办的手续。从 2 月中旬就开始面试，找工作。这次找工作，对比 16 年找工作的时候，真的是太失败了，这几年的时间过得。不过有好有坏吧，在欣哥和大佬的帮助下，办了一件大事，这个也算是这几年唯一能让我欣慰的事情了。</p><span id="more"></span><p>自己的不足太明显了，对于大型网站的架构设计，RPC，MQ，数据库 这些技术在针对大流量，高并发上面，实践的太少了。三年，从开始的 Java 麻将服务器到 C++ 的游戏，再到 Go 的代理，PHP 的视频网站。做得事情，是不少，但是真的都是一些小的项目。号称自己是 DEV_OPS，结果对于运维也就是一点皮毛而已。</p><p>想想自己，深入的东西几乎太少了，也讲不清楚东西。年初的时候，面试阿里的时候，一个 P8 的面试官提醒我，如果你想达到 P7 的水平。首先要做到的就是总结，用精简的话，能描述出自己做的项目，特点，解决了什么问题，而且这个能力很重要；对于前沿的技术也需要去了解，对技术的了解也要深入；大数据分析，AI，物联网，边缘计算这些都需要自己平时去多了解和跟进。</p><p>去年把 V2Ray 编译 IOS framework 的事情搞定了过后，也还没来得及优化，又来了 PHP。忙到年初找工作，博客就这样又拉下了。其实这次还是有想写一些文章: </p><ol><li>客户端透明代理的实现原理</li><li>比特币入门</li><li>区块链开发入门</li><li>Dockerfile 优化</li><li>运维总结</li><li>面试总结</li></ol><p>一篇篇想写的文章，有的写了一部分，有得还只是杂乱的草稿。这下又要面临试用期，现在先顺顺利利的过试用期。毕竟自己这次是换了一个行业，区块链的行业，菜知道，区块链并不是比特币而已。</p><p>写这篇文章也就是刚刚看到一个同事，受了我的刺激，也开始搭起博客来了，想起自己的博客已经很久没有更新了。不过现在看来，微众的节奏还是能接受的，做着开源的项目，限制也没那么多，又摆脱了大小周，至少周末的时间能得到保证。后面还是得好好的把自己的博客撸起来，多写点能深入的东西。</p><p>最后，希望疫情早点过去吧。。也用心感恩那些无名的英雄，因为你们，我们才有安全感，感恩！！！<br><img src="https://img.tupm.net/2020/04/0658F22ED4C80491B185B52F14A5F2DC.jpg" alt="svytjyhk"></p>]]>
    </content>
    <id>http://yuanmomo.net/2020/04/09/webank-a-new-start/</id>
    <link href="http://yuanmomo.net/2020/04/09/webank-a-new-start/"/>
    <published>2020-04-09T14:21:07.000Z</published>
    <summary>
      <![CDATA[<p>今年的疫情，打乱了很多事情，自己也选择了裸辞，在家休息了一个月。很庆幸，在很多我不知道名字的英雄们的努力下，国内现在是最安全的地方。我也可以安心出门去公司上班，虽然还戴着口，但是至少心里面好了很多。以前还会去吐槽什么什么，现在，为自己能伸出在最安全的地方而自豪。</p>
<p>2 月 12 号提出离职，3 月 6 号办的手续。从 2 月中旬就开始面试，找工作。这次找工作，对比 16 年找工作的时候，真的是太失败了，这几年的时间过得。不过有好有坏吧，在欣哥和大佬的帮助下，办了一件大事，这个也算是这几年唯一能让我欣慰的事情了。</p>]]>
    </summary>
    <title>换个行业，开开心心撸代码</title>
    <updated>2026-06-21T21:12:41.658Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="V2Ray" scheme="http://yuanmomo.net/categories/V2Ray/"/>
    <category term="V2Ray" scheme="http://yuanmomo.net/tags/V2Ray/"/>
    <category term="Android" scheme="http://yuanmomo.net/tags/Android/"/>
    <category term="AAR" scheme="http://yuanmomo.net/tags/AAR/"/>
    <content>
      <![CDATA[<p>V2Ray 在实现上使用 go 语言，同时客户端和服务端共用同一套代码，根据配置文件的不同来判断是客户端还是服务端。如果想在 Android 的客户端上运行 V2Ray，那么就需要知道如何编译 v2ray-core 到 aar 库，提供给 Android 客户端。</p><span id="more"></span><h1 id="未解决问题">1. 未解决问题</h1><h2 id="gomobile-不支持-Go-module-编译">1.1. gomobile 不支持 Go module 编译</h2><p>如果在使用 gomobile 编译时，使用 Go module(也就是 GO111MODULE&#x3D;on ) 会报错，找不到 package, 参考 <a href="https://github.com/golang/go/wiki/Mobile">https://github.com/golang/go/wiki/Mobile</a><br><img src="https://img.tupm.net/2019/12/8D485B72FD7072462D8DFC724AF757A6.jpg" alt="gomobile-not-support-go-module"></p><h1 id="提前准备">2. 提前准备</h1><p>因为编译需要使用到 tun2socks 组件，所以建议先阅读一下相关的知识点。<br><a href="http://arloor.com/posts/other/android-vpnservice-and-vpn-dev/">http://arloor.com/posts/other/android-vpnservice-and-vpn-dev/</a><br><a href="https://briteming.blogspot.com/2017/09/socksvpn-fqrouter.html">https://briteming.blogspot.com/2017/09/socksvpn-fqrouter.html</a></p><h1 id="配置环境">3. 配置环境</h1><h2 id="Mac-OS">3.1. Mac OS</h2><h3 id="install-android-sdk-android-ndk-环境">3.1.1. install android-sdk &amp;&amp; android-ndk 环境</h3><p>最简单的办法，直接安装 Android Studio，然后在 Android Studio 中配置:<br><img src="https://img.tupm.net/2019/12/A71AC7F76286AE0EA3BD3AF6696FD93B.jpg" alt="android-studio-sdk"><br><img src="https://img.tupm.net/2019/12/8ABC8075630F992BAB2F26BEDA1BD562.jpg" alt="android-studio-ndk"></p><p>其中，SDK Platforms 下载几个 Android 的版本。</p><h3 id="安装-GO">3.1.2. 安装 GO</h3><p>go 我使用的版本: go version go1.13.1 darwin&#x2F;amd64</p><h3 id="clone-仓库">3.1.3. clone 仓库</h3><figure class="highlight shell"><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"><span class="meta prompt_"># </span><span class="language-bash"><span class="built_in">clone</span> 仓库到本地</span></span><br><span class="line">git clone https://github.com/yuanmomo/AndroidLibV2rayLite.git</span><br></pre></td></tr></table></figure><h3 id="执行命令">3.1.4. 执行命令</h3><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment">##### 使用梯子</span></span></span><br><span class="line">export ALL_PROXY=socks5://127.0.0.1:1086</span><br><span class="line">export all_proxy=socks5://127.0.0.1:1086</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment">##### 配置 android 的 sdk 和 ndk</span></span></span><br><span class="line">export ANDROID_HOME=&quot;/Users/MoMo/Library/Android/sdk&quot;</span><br><span class="line">export ANDROID_NDK_HOME=&quot;/Users/MoMo/Library/Android/sdk/ndk/20.0.5594570&quot;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment">##### 根据环境选择执行脚本:</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Mac OS</span></span><br><span class="line">sh build/build-on-mac.sh</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">编译 android</span></span><br><span class="line">sh build-on-mac.sh android [data] [dep]</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment">## data 参数表示会更新 geoip.dat  geosite.dat 文件</span></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment">## dep 表示会执行 go get -u 更新本地的依赖</span></span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="Linux-Ubuntu-Debian-CentOS">3.2. Linux(Ubuntu&#x2F;Debian&#x2F;CentOS)</h2><h3 id="clone-仓库-1">3.2.1. clone 仓库</h3><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="built_in">clone</span> 仓库到本地</span></span><br><span class="line">git clone https://github.com/yuanmomo/AndroidLibV2rayLite.git</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">执行脚本</span></span><br><span class="line">/bin/bash build/build-on-linux.sh sdk data dep</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment">## sdk 表示会安装 Android SDK Tool 和 NDK</span></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment">## data 参数表示会更新 geoip.dat  geosite.dat 文件</span></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment">## dep 表示会执行 go get -u 更新本地的依赖</span></span></span><br></pre></td></tr></table></figure><h3 id="编译过程">3.2.2. 编译过程</h3><ol><li>安装 Docker</li><li>安装 Go</li><li>安装 Android SDK + NDK + Tools + OpenJDK8</li><li>Docker 拉取 yuanmomo&#x2F;android-v2ray-build:1.0.0 镜像后开始编译</li></ol><h2 id="注意事项">3.3. 注意事项</h2><ol><li>注意需要梯子</li><li>脚本默认 GOATH &#x3D; ~&#x2F;go 目录</li><li>会自动下载 geoip.data 和 geosite.dat 文件</li><li>编译生成的 aar 和 source 在 ${GOPATH}&#x2F;src&#x2F;AndroidLibV2rayLite 目录下</li></ol><p><strong>Mac OS :</strong><br><img src="https://img.tupm.net/2019/12/531BA1C5C541913A1449CC03BDA7E9A2.jpg" alt="mac-os-build-output"></p><p><strong>Linux</strong></p>]]>
    </content>
    <id>http://yuanmomo.net/2019/12/02/v2ray-android-build-aar/</id>
    <link href="http://yuanmomo.net/2019/12/02/v2ray-android-build-aar/"/>
    <published>2019-12-02T06:32:48.000Z</published>
    <summary>
      <![CDATA[<p>V2Ray 在实现上使用 go 语言，同时客户端和服务端共用同一套代码，根据配置文件的不同来判断是客户端还是服务端。如果想在 Android 的客户端上运行 V2Ray，那么就需要知道如何编译 v2ray-core 到 aar 库，提供给 Android 客户端。</p>]]>
    </summary>
    <title>V2Ray 编译 Android aar</title>
    <updated>2026-06-21T21:12:41.658Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="Hexo" scheme="http://yuanmomo.net/categories/Hexo/"/>
    <category term="Hexo" scheme="http://yuanmomo.net/tags/Hexo/"/>
    <category term="MWeb" scheme="http://yuanmomo.net/tags/MWeb/"/>
    <content>
      <![CDATA[<p>显示 MD 文档的时候，总希望标题能带上一个序号:</p><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line">1 xxxxx</span><br><span class="line">1.1 xxxx</span><br><span class="line">1.1.1 xxxx</span><br><span class="line"></span><br><span class="line">2. xxxxx</span><br></pre></td></tr></table></figure><span id="more"></span><p>但是写 MD 的时候，经常改来改去，所以，一旦想在前面插入一个标题什么的，后面都要手动改，太麻烦了。所以就在想，有没有什么简单的办法，能自动的跟据 MD 的标题去生成序号呢？</p><h1 id="MWeb">1. MWeb</h1><p>CSS 就可以干这个事情:</p><figure class="highlight css"><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></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">body</span> &#123;<span class="attribute">counter-reset</span>:section&#125;</span><br><span class="line"><span class="selector-tag">body</span> <span class="selector-tag">h1</span>&#123;<span class="attribute">counter-reset</span>:sub-section&#125;</span><br><span class="line"><span class="selector-tag">body</span> <span class="selector-tag">h2</span>&#123;<span class="attribute">counter-reset</span>:composite&#125;</span><br><span class="line"><span class="selector-tag">body</span> <span class="selector-tag">h3</span>&#123;<span class="attribute">counter-reset</span>:detail&#125;</span><br><span class="line"><span class="selector-tag">body</span> <span class="selector-tag">h1</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">content</span>:<span class="built_in">counter</span>(section) <span class="string">&quot; &quot;</span>;<span class="attribute">counter-increment</span>:section&#125;</span><br><span class="line"><span class="selector-tag">body</span> <span class="selector-tag">h2</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">content</span>:<span class="built_in">counter</span>(section) <span class="string">&quot;.&quot;</span> <span class="built_in">counter</span>(sub-section) <span class="string">&quot; &quot;</span>;<span class="attribute">counter-increment</span>:sub-section&#125;</span><br><span class="line"><span class="selector-tag">body</span> <span class="selector-tag">h3</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">content</span>:<span class="built_in">counter</span>(section) <span class="string">&quot;.&quot;</span> <span class="built_in">counter</span>(sub-section) <span class="string">&quot;.&quot;</span> <span class="built_in">counter</span>(composite) <span class="string">&quot; &quot;</span>;<span class="attribute">counter-increment</span>:composite&#125;</span><br><span class="line"><span class="selector-tag">body</span> <span class="selector-tag">h4</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">content</span>:<span class="built_in">counter</span>(section) <span class="string">&quot;.&quot;</span> <span class="built_in">counter</span>(sub-section) <span class="string">&quot;.&quot;</span> <span class="built_in">counter</span>(composite) <span class="string">&quot;.&quot;</span> <span class="built_in">counter</span>(detail) <span class="string">&quot; &quot;</span>;<span class="attribute">counter-increment</span>:detail&#125;</span><br></pre></td></tr></table></figure><p>在 MWeb 中的属性，主题中，找到下面的 把这段 css 贴到 Hexo 的 themes&#x2F;next&#x2F;source&#x2F;css&#x2F;_custom 目录中的 找到 Preview CSS ，找到编辑，copy 一份当前的 css 样式到自定义目录，然后把这段 css 贴到 copy 后台的 css 文件中，然后选择 reload 即可。</p><h1 id="Hexo">2. Hexo</h1><p>在 Hexo 中，使用了一个 hexo 的插件， Hexo 根目录执行下面的命令</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-heading-index --save</span><br></pre></td></tr></table></figure><p>然后在 Hexo 根目录的 _config.yml 最后加上下面的配置:</p><figure class="highlight yml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">5 heading_index:</span></span><br><span class="line"><span class="attr">4   enable:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">3   index_styles:</span> <span class="string">&quot;&#123;1&#125; &#123;1&#125; &#123;1&#125; &#123;1&#125; &#123;1&#125; &#123;1&#125;&quot;</span></span><br><span class="line"><span class="attr">2   connector:</span> <span class="string">&quot;.&quot;</span></span><br><span class="line"><span class="attr">1   global_prefix:</span> <span class="string">&quot;&quot;</span></span><br><span class="line"><span class="attr">95    global_suffix:</span> <span class="string">&quot;. &quot;</span></span><br></pre></td></tr></table></figure><p>重新生成即可。</p><p>参考:<a href="https://www.npmjs.com/package/hexo-heading-index">https://www.npmjs.com/package/hexo-heading-index</a></p>]]>
    </content>
    <id>http://yuanmomo.net/2019/11/09/hexo-mweb-title-number/</id>
    <link href="http://yuanmomo.net/2019/11/09/hexo-mweb-title-number/"/>
    <published>2019-11-09T02:53:03.000Z</published>
    <summary>
      <![CDATA[<p>显示 MD 文档的时候，总希望标题能带上一个序号:</p>
<figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line">1 xxxxx</span><br><span class="line">1.1 xxxx</span><br><span class="line">1.1.1 xxxx</span><br><span class="line"></span><br><span class="line">2. xxxxx</span><br></pre></td></tr></table></figure>]]>
    </summary>
    <title>Hexo, MWeb 为标题自动添加序号</title>
    <updated>2026-06-21T21:12:41.654Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="V2Ray" scheme="http://yuanmomo.net/categories/V2Ray/"/>
    <category term="DNS" scheme="http://yuanmomo.net/tags/DNS/"/>
    <category term="V2Ray" scheme="http://yuanmomo.net/tags/V2Ray/"/>
    <content>
      <![CDATA[<p>V2Ray 有自带的 DNS 模块，提供 DNS 解析的功能，包括 hosts，DNS 分流，防劫持，防污染等等功能。</p><p>本文主要对 V2Ray 中 DNS 的解析流程做一个说明。</p><span id="more"></span><p>V2Ray 的 DNS 解析分两种:</p><ol><li>DNS Outbound 解析</li><li>Socks5 Proxy 代理解析</li></ol><h1 id="DNS-Outbound-解析">1. DNS Outbound 解析</h1><p>DNS Outbound 解析是指通过 TUN 设备做透明代理，把 DNS 的 UDP 流量全部导入到 V2Ray 中，同时配置一个 rule 去拦截到这个 UDP 的流量。</p><figure class="highlight json"><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">  <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;field&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;outboundTag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dns-out&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;inboundTag&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;tun2socks&quot;</span></span><br><span class="line">      <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;network&quot;</span><span class="punctuation">:</span> <span class="string">&quot;udp&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;port&quot;</span><span class="punctuation">:</span> <span class="number">53</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    .........</span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></table></figure><p>这个时候，V2Ray 第一会调用内置的 DNS 模块去解析 UDP 流量中的域名地址。</p><p>通过 dns servers 中的 DNS server IP 同样要经过 rules 的规则路由。比如，如果 DNS server 的 IP 地址是 8.8.8.8，就需要配置相应的 rule，走代理去解析。（V2Ray&#x2F;VMess 目前是 UDP over TCP）</p><h1 id="Socks5-Proxy-代理解析">2. Socks5 Proxy 代理解析</h1><p>需要开启域名嗅探功能, sniffing 的配置:</p><figure class="highlight json"><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></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;port&quot;</span><span class="punctuation">:</span> <span class="number">1086</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;listen&quot;</span><span class="punctuation">:</span> <span class="string">&quot;0.0.0.0&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;protocol&quot;</span><span class="punctuation">:</span> <span class="string">&quot;socks&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;settings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;auth&quot;</span><span class="punctuation">:</span> <span class="string">&quot;noauth&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;timeout&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;udp&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;sniffing&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;destOverride&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;http&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;tls&quot;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>包含 两种 ：<br>    1. inbound 接收到 socks5 代理请求<br>    2. TUN 设备通过 tun2Socks 转发到 v2ray-core 的请求</p><p>当 inbound 获取到代理请求时，会使用 rules 进行匹配，匹配时有三种情况，对应rules 中的 domainStrategy 的三个配置：</p><ol><li><strong>AsIs（默认）:</strong> 使用core 接收到的地址（可能是域名，也可能是 IP）匹配</li><li><strong>IPOnDemand :</strong> 只要rules里面有匹配 IP 的规则，都先解析一次</li><li><strong>IPIfNonMatch :</strong> 如果根据域名没有匹配到规则，则调用内置 DNS 执行一次解析后，再根据 IP 匹配</li></ol><p>如果以上都没有匹配到规则，那么默认使用 outbound 的第一个规则(通常第一个是 Vmess Proxy，有时候也会配置成 freedom )。</p><h2 id="根据匹配到的-outbound-来判断是否进一步解析">2.1. 根据匹配到的 outbound 来判断是否进一步解析</h2><ol><li><p>如果根据 <em><strong>域名</strong></em> 匹配到的是 freedom 的 direct outbound，那么会看是否有配置  UseIP(v4,v6),有配置，调用内置的 dns server 去解析（dns server IP 同样要通过 rules 匹配走哪个规则），然后直接连接获取到的 IP 地址。</p></li><li><p>如果匹配到的是 proxy 的代理规则，则不解析域名，直接将域名发到远程代理服务器，远端执行的 DNS 解析。</p></li></ol>]]>
    </content>
    <id>http://yuanmomo.net/2019/11/06/v2ray-dns/</id>
    <link href="http://yuanmomo.net/2019/11/06/v2ray-dns/"/>
    <published>2019-11-06T06:23:23.000Z</published>
    <summary>
      <![CDATA[<p>V2Ray 有自带的 DNS 模块，提供 DNS 解析的功能，包括 hosts，DNS 分流，防劫持，防污染等等功能。</p>
<p>本文主要对 V2Ray 中 DNS 的解析流程做一个说明。</p>]]>
    </summary>
    <title>V2Ray 中 DNS 的解析流程</title>
    <updated>2026-06-21T21:12:41.658Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="V2Ray" scheme="http://yuanmomo.net/categories/V2Ray/"/>
    <category term="V2Ray" scheme="http://yuanmomo.net/tags/V2Ray/"/>
    <category term="Router" scheme="http://yuanmomo.net/tags/Router/"/>
    <category term="Transparent proxy" scheme="http://yuanmomo.net/tags/Transparent-proxy/"/>
    <content>
      <![CDATA[<h1 id="清单">1. 清单</h1><ol><li>路由器 : ASUS RT-AC68U </li><li>系统版本: RT-AC68U_384.13_1-koolshare-20190823.trx</li><li>V2Ray 版本: v4.20.0 ( v4.20.0 过后开始使用 go 1.13+，官方编译的暂时不能在 ARMv7 执行)</li></ol><span id="more"></span><h1 id="未解决问题">2. 未解决问题</h1><ol><li><p>go 1.13+ 运行 Illegal instruction 问题: 需要开启FPU (Emulator)<a href="https://github.com/v2ray/v2ray-core/issues/843">https://github.com/v2ray/v2ray-core/issues/843</a></p></li><li><p>merlin 固件从 380.68 (18-Aug-2017) 就内置了 TPROXY 模块，但是需要手动加载。但是在使用 TPROXY 转发 UDP 流量，或者使用 V2Ray TPROXY 转发是，会出现 udp 转发死循环问题，暂时还没解决。参考:</p><ol><li><a href="https://github.com/v2ray/v2ray-core/issues/1432">https://github.com/v2ray/v2ray-core/issues/1432</a></li><li><a href="https://github.com/v2ray/v2ray-core/issues/1671">https://github.com/v2ray/v2ray-core/issues/1671</a></li><li><a href="https://guide.v2fly.org/app/transparent_proxy.html">https://guide.v2fly.org/app/transparent_proxy.html</a></li><li><a href="https://guide.v2fly.org/app/tproxy.html#%E8%AE%BE%E7%BD%AE%E7%BD%91%E5%85%B3">https://guide.v2fly.org/app/tproxy.html#%E8%AE%BE%E7%BD%AE%E7%BD%91%E5%85%B3</a></li></ol><p> <img src="https://img.tupm.net/2019/12/3DD746E440325246CFB0F2767F1B79C0.jpg" alt="merlin-add-tproxy"></p></li></ol><h2 id="相关下载地址">2.1. 相关下载地址</h2><h3 id="V2Ray">2.1.1. V2Ray</h3><p>v2ray-core 下载地址:<br><a href="https://github.com/v2ray/v2ray-core/releases">https://github.com/v2ray/v2ray-core/releases</a></p><p>注意选择对应版本，RT-AC68U 的版本是 v2ray-linux-arm.zip，下载后，上传到路由器。</p><h3 id="RT-AC68U-固件">2.1.2. RT-AC68U 固件</h3><p><strong>固件的内核有两个版本，384.xx(新的版本) 和 380.xx(老得版本) 两个版本，注意选择。</strong></p><p>固件有三个版本: 华硕官方，原版 merlin 固件，还有安装软件市场的国内修改 koolshare 版本。</p><ul><li>原版 merlin 下载地址: <a href="https://www.asuswrt-merlin.net/download">https://www.asuswrt-merlin.net/download</a></li><li>koolshare 的下载地址: <a href="http://firmware.koolshare.cn/">http://firmware.koolshare.cn/</a></li></ul><p><strong>注意:</strong> 梅林原版古剑，不带有 Software Center, 如果需要下载带有 Software Center 的固件版本，参考: <a href="https://github.com/koolshare/rogsoft">https://github.com/koolshare/rogsoft</a></p><table><thead><tr><th>软件中心</th><th>arm380软件中心</th><th>arm384软件中心</th><th>hnd&#x2F;axhnd软件中心</th><th>软路由-酷软</th></tr></thead><tbody><tr><td>项目名称</td><td><a href="https://github.com/koolshare/koolshare.github.io">koolshare.github.io</a></td><td><a href="https://github.com/koolshare/armsoft">armsoft</a></td><td><a href="https://github.com/koolshare/rogsoft">rogsoft</a></td><td><a href="https://github.com/koolshare/ledesoft">ledesoft</a></td></tr><tr><td>适用架构</td><td>armv7l</td><td>armv7l</td><td>armv8（aarch64）</td><td>x64</td></tr><tr><td>平台</td><td>arm</td><td>arm</td><td>hnd&#x2F;axhnd</td><td>by fw867</td></tr><tr><td>linux内核</td><td>2.6.36.4</td><td>2.6.36.4</td><td>4.1.27&#x2F;4.1.51</td><td>很新</td></tr><tr><td>CPU</td><td>bcm4708&#x2F;9</td><td>bcm4708&#x2F;9</td><td>bcm4906&#x2F;8</td><td>intel&#x2F;AMD</td></tr><tr><td>固件版本</td><td>koolshare 梅林380</td><td>koolshare 梅林384</td><td>koolshare 梅林&#x2F;官改</td><td>OpenWRT&#x2F;LEDE</td></tr><tr><td>软件中心api</td><td>1.0 代</td><td>1.5 代</td><td>1.5 代</td><td>1.5 代</td></tr><tr><td>代表机型-1</td><td>RT-AC68U 改版梅林380</td><td>RT-AC88U 改版梅林384</td><td>RT-AC86U 改版梅林</td><td>\</td></tr><tr><td>代表机型-2</td><td>RT-AC88U 改版梅林380</td><td>RT-AC5300 改版梅林384</td><td>GT-AC5300 华硕官改</td><td>\</td></tr><tr><td>代表机型-3</td><td>R7000 改版梅林380</td><td></td><td>RT-AX88U 改版梅林</td><td>\</td></tr></tbody></table><p>我的 AC68U 有两个版本，旧版的是 Koolshare_Merlin_Legacy_380(380.xx)，新版的是 Koolshare_Merlin_New_Gen_384(384.xx)，我选择下载的是 : <a href="https://koolshare.cn/thread-164857-1-1.html">https://koolshare.cn/thread-164857-1-1.html</a></p><h1 id="安装步骤">3. 安装步骤</h1><h2 id="安装V2Ray">3.1. 安装V2Ray</h2><p>将 v2ray-linux-arm.zip 压缩包上传到 路由器，然后解压到一个目录，配置 config.json 文件，使用 .&#x2F;v2ray -config config.json 命令即可启动。</p><p>如果出现内存不够的错误，增加 swap 内存即可 :</p><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建要作为swap分区的文件:增加1GB大小的交换分区，则命令写法如下，其中的count等于想要的块的数量（bs*count=文件大小）。</span></span><br><span class="line">dd if=/dev/zero of=/tmp/mnt/nas/swapfile bs=1M count=1024</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">格式化为交换分区文件:</span></span><br><span class="line">mkswap /tmp/mnt/nas/swapfile #建立swap的文件系统</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启用交换分区文件:</span></span><br><span class="line">swapon /tmp/mnt/nas/swapfile #启用swap文件</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看</span> </span><br><span class="line">free</span><br></pre></td></tr></table></figure><p>配置 config.json 文件，参考: <a href="https://guide.v2fly.org/app/transparent_proxy.html#%E8%AE%BE%E7%BD%AE%E6%AD%A5%E9%AA%A4">V2Ray 透明代理</a></p><p>配置好了，启动: </p><figure class="highlight shell"><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">chmod +x v2ray</span><br><span class="line">chmod +x v2ctl  </span><br><span class="line">ulimit -n 65536</span><br><span class="line">./v2ray -config config.json</span><br></pre></td></tr></table></figure><h2 id="配置-iptables">3.2. 配置 iptables</h2><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">新建一个名为 V2RAY 的链</span></span><br><span class="line">iptables -t nat -N V2RAY</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">直连 SO_MARK 为 0xff 的流量(0xff 是 16 进制数，数值上等同与上面配置的 255)，此规则目的是避免代理本机(网关)流量出现回环问题</span></span><br><span class="line">iptables -t nat -A V2RAY -p tcp -j RETURN -m mark --mark 0xff</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">允许连接保留地址</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">直连 192.168.0.0/16</span></span><br><span class="line">iptables -t nat -A V2RAY -d 0.0.0.0/8 -j RETURN</span><br><span class="line">iptables -t nat -A V2RAY -d 10.0.0.0/8 -j RETURN</span><br><span class="line">iptables -t nat -A V2RAY -d 127.0.0.0/8 -j RETURN</span><br><span class="line">iptables -t nat -A V2RAY -d 169.254.0.0/16 -j RETURN</span><br><span class="line">iptables -t nat -A V2RAY -d 172.16.0.0/12 -j RETURN</span><br><span class="line">iptables -t nat -A V2RAY -d 192.168.0.0/16 -j RETURN</span><br><span class="line">iptables -t nat -A V2RAY -d 224.0.0.0/4 -j RETURN</span><br><span class="line">iptables -t nat -A V2RAY -d 240.0.0.0/4 -j RETURN</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">其余流量转发到 12345 端口（即 V2Ray）</span></span><br><span class="line">iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-ports 12345</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">对局域网其他设备进行透明代理</span></span><br><span class="line">iptables -t nat -A PREROUTING -p tcp -j V2RAY</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">对本机进行透明代理</span></span><br><span class="line">iptables -t nat -A OUTPUT -p tcp -j V2RAY</span><br></pre></td></tr></table></figure><p>写入到一个脚本文件，然后执行脚本即可。</p><h1 id="开机自启动和定时监测">4. 开机自启动和定时监测</h1><h2 id="创建定时监测脚本">4.1. 创建定时监测脚本</h2><figure class="highlight shell"><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">cat &lt;&lt; EOF &gt; /tmp/mnt/nas/v2ray/koolshare-v2ray-restart.sh </span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/sh</span></span><br><span class="line">v2ray_dir=/tmp/mnt/nas/v2ray</span><br><span class="line">cd $&#123;v2ray_dir&#125;</span><br><span class="line">ps | grep -i  &#x27;v2ray&#x27;| grep -i &#x27;config.json&#x27; | grep -v &#x27;grep&#x27; |  awk &#x27;&#123;print $1&#125;&#x27; | xargs kill -9</span><br><span class="line">ulimit -n 65536</span><br><span class="line">nohup $&#123;v2ray_dir&#125;/v2ray -config $&#123;v2ray_dir&#125;/config.json &amp;</span><br><span class="line">echo &quot;time: $(date +%Y-%m-%d) $(date +%H:%M:%S)&quot; &gt;&gt; $&#123;v2ray_dir&#125;/log/monitor.log</span><br><span class="line"></span><br><span class="line">sh /tmp/mnt/nas/v2ray/router-iptables.sh</span><br><span class="line"></span><br><span class="line">EOF</span><br></pre></td></tr></table></figure><h2 id="添加开机自启动">4.2. 添加开机自启动</h2><p>修改 &#x2F;jffs&#x2F;scripts&#x2F;services-start</p><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line">cat &lt;&lt; EOF &gt;&gt; /jffs/scripts/services-start</span><br><span class="line"></span><br><span class="line">sh /tmp/mnt/nas/v2ray/koolshare-v2ray-restart.sh</span><br><span class="line">cru a ScheduledReboot &quot;*/2 * * * * /tmp/mnt/nas/v2ray/koolshare-v2ray.sh&quot;</span><br><span class="line"></span><br><span class="line">EOF</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>http://yuanmomo.net/2019/11/03/router-v2ray-transparent-proxy/</id>
    <link href="http://yuanmomo.net/2019/11/03/router-v2ray-transparent-proxy/"/>
    <published>2019-11-03T09:02:53.000Z</published>
    <summary>
      <![CDATA[<h1 id="清单">1. 清单</h1><ol>
<li>路由器 : ASUS RT-AC68U </li>
<li>系统版本: RT-AC68U_384.13_1-koolshare-20190823.trx</li>
<li>V2Ray 版本: v4.20.0 ( v4.20.0 过后开始使用 go 1.13+，官方编译的暂时不能在 ARMv7 执行)</li>
</ol>]]>
    </summary>
    <title>基于 V2Ray 的路由器透明代理配置</title>
    <updated>2026-06-21T21:12:41.658Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="VPS" scheme="http://yuanmomo.net/categories/VPS/"/>
    <category term="VPS" scheme="http://yuanmomo.net/tags/VPS/"/>
    <content>
      <![CDATA[<h1 id="电信">1. 电信</h1><h2 id="线路">1.1. 线路</h2><p>电信的国际出口一共有两条线路：163 骨干网（又称 CN1） 和 CN2 网络。</p><ul><li>163 骨干网: 最早，普通质量，特别是晚上丢包率高；承担 85% 流量；</li><li>CN2 : 2005 年投入使用，低丢包，低延迟，轻负载；承担 15% 流量；</li></ul><p>电信网络的回国或出国，必定经过北京&#x2F;上海&#x2F;广州；</p><p>进出口路径分为三个品级:<br>    1. 163 网（CN1）；<br>    2. CN2 GT（Global Transfer 又称半程 CN2 ）；<br>    3. CN2 GIA（Global Internet Access 又称纯 CN2&#x2F;全程 CN2）</p><span id="more"></span><h2 id="163-骨干网">1.2. 163 骨干网</h2><p>中国电信的 163 网络，一般会经过市级 → 省级 → 国际出口 → 境外接入点 AS（自治路由协议） 号为 4134 的路由节点，这些路由节点的 IP 地址开头一律是 “202.97.*.*”，全程不会经过 CN2 网络节点；</p><h2 id="CN2">1.3. CN2</h2><p>在没有购买昂贵的政企专线网络或氮气瓶加速服务的情况下，中国电信普通宽带用户连接海外节点具体走何种线路，取决于对方节点采用了何种路由自治协议.当然，决定它并不是靠心情，而是要和接入的电信运营商签署协议，一旦签署了走何种协议，如纯 CN2 网络，势必要向中国电信缴纳一笔高昂的 CN2 网络使用费用（最后这笔钱还得由用户承担），这就导致支持 CN2 GIA 网络的 VPS 产品价格最昂贵，CN2 GT 价格其次，163 网最为低廉（不用向中国电信缴纳一笔专门优化中国线路的银子）；</p><h3 id="CN2-GT">1.3.1. CN2 GT</h3><p>CN2 GT 产品在从市级 → 省级 → 国际出口这一段走的是 163 网络，国际出口 → 境外接入点这一段汇入 CN2 网络，返程同理，偶尔可能会走联通的国际网络；</p><h3 id="CN2-GIA">1.3.2. CN2 GIA</h3><p>CN2 GIA 产品在从市级 → 省级 → 国际出口 → 境外接入点的过程中，全程走 AS 号为 4809 的路由节点，这些路由节点的 IP 地址开头一律是 “59.43.*.*”，全程不会经过 163 网络节点；</p><p>CN2 GIA 产品的表现绝不会令任何人失望，无论是白天，还是晚高峰时期，纯 CN2 线路的掉包率均在 0.1% 以下。</p><p>更严格地划分，CN2 GIA 产品还分为单网、双网、三网三种。</p><ol><li>单网 CN2 GIA ： 一般指的是仅中国电信用户访问去回，走 CN2 GIA 网络，联通&#x2F;移动&#x2F;教育网等用户访问过去，均走各自运营商的国际出口（典型产品为阿里云国际香港节点）；</li><li>双网 CN2 GIA 一般指的是中国电信&#x2F;中国联通用户访问过去，走 CN2 GIA 网络（特别地，该产品允许中国联通线路在省级跨网并入到中国电信的 CN2 网络，典型产品为标准互联的圣何塞 CN2 GIA 产品）；</li><li>三网 CN2 GIA 一般指的是中国电信&#x2F;中国联通&#x2F;中国移动三网用户的去回访问，均会在省级并入到 CN2 网络，适用性最强（典型产品为搬瓦工的 DC9、DC6 机房）。</li></ol><h1 id="联通">2. 联通</h1><h2 id="线路-1">2.1. 线路</h2><p>联通的国际出口一共有两条线路：联通 169 网 和 A 网。</p><p>169 网络和 A 网之间的区别，与 163 网络和 CN2 之间的区别并不是一个概念。A 网早在中国网通时代就已存在，属于中国网通的骨干网。在网通和联通合并后，联通仍继续建设当年从电信 163 网分出来的那一部分，即现如今的 169 网(分出来的原因是应当年政企分离的要求，不是电信自己分的)，而这张 A 网就闲置了。虽然该产品的定位，名义上和中国电信的 CN2 网络对标，但这张“吃老本”的 A 网所具备的优势仅仅是用户少，网络负荷小，所以表现也还不错，一般给政企、高端用户使用。但由于这张网络多年没有再发展，所以跟持续扩容的 CN2 比，质量方面的差距只会越来越大。</p><p>联通网络回国或出国，必定经过北京&#x2F;上海&#x2F;广州；</p><ul><li>169网 : 从市级 → 省级 → 国际出口 → 境外接入点的过程中，全程走 AS 号为 4837 的路由节点，这些路由节点的 IP 地址开头一律是 “219.158.*.*”，全程不会经过 A网（AS9929）；</li><li></li><li>A 网: 从市级 → 省级 → 国际出口 → 境外接入点的过程中，全程走 AS 号为 9929 的路由节点，这些路由节点的 IP 地址开头一律是 “218.105.*.*&#x2F;210.*.*.*”，部分偏远地区，会经过 169 网络汇入到 A 网；</li></ul><h2 id="VPS-提供商和-线路选择">2.2. VPS 提供商和 线路选择</h2><p>选择标准：海外国人运营，支持支付宝付款，价格奇低，非一线大厂，NTT 线路，犄角旮旯地区，符合上述六条规则中的三条，打死都别碰，碰就是交学费。</p><h3 id="美国地区">2.2.1. 美国地区</h3><p>直连，不错。</p><h3 id="新加坡地区">2.2.2. 新加坡地区</h3><p>新加坡地区比较依赖当地 VPS 商的线路优化，很多情况下联通到新加坡去程统一绕日本 NTT（一家很讨厌的日本线路，不谈国际声誉，只要从中国连接到日本走得是这条线，一定爆炸）。除了阿里云国际新加坡这样对三网不错的，联通用户慎选新加坡机房。</p><h3 id="香港地区">2.2.3. 香港地区</h3><p>看商家线路。最普通的，如 Softlayer 等，依旧绕日 NTT，垃圾的一批；部分线路不错的机房，如安畅机房、沙田、香港阿里云、PCCW 等，一般直接从广州联通过去，到港走香港联通或香港 PCCW，但这种机房一般都是针对三网一起优化的，联通当然跑的也不差，除非兼顾其他运营商的访问者，否则联通用户没必要花大价钱选择三网优化的香港地区机房。</p><h3 id="日本地区">2.2.4. 日本地区</h3><p>日本地区，表现之好，花费之低，超乎想象，尤其是众多日本本土 VPS 商（如 Cloudgarage、IDCF、Kagoya、Conoha、Sakura、ABLENET、GMOCloud等），联通用户去&#x2F;回程统一经过上海联通的 IIJ 线路，质量非常理想，且上述日本本土商家的月付价格普遍不高，非常值得联通用户的选择，诸如 Linode 东京区二（Linode 东京区一走纯 KDDI 线路，联通表现也不错，可惜早已绝版）&#x2F; Vultr 东京等机房，走的是 NTT 线路，线路质量奇差，虽然它们购买门槛低，但非常不值得选择，买之前一定要测一下。</p><p>不少研究日本 VPS 的同学，都知道中日之间有一条品级最高的线路，名曰 bbtec ，我有必要单独拿出来说一下，它是日本软银(Soft Bank)的定制线路，神壕专属，价格昂贵。日本阿里云有在用这条线路，但一个是接入该线路的 VPS 商家本来就不多，产品难寻，还有就是阿里云日本的账号注册限制太严，非日本本土手机号＋无日本国内住所无法收到纸质注册确认信并寄回就不能买，这就挡住几乎所有国内人了。我印象里能勉强买到，且提供 bbtec 的只还有 Ucloudbiz，他家机房实际在韩国首尔，IP 地址映射到的日本福冈，XEN 虚拟架构，不如主流的 KVM 先进，价格也不便宜。另一方面就是感觉 bbtec 这款线路高不成低不就的：对电信用户，bbtec 国内部分并未接入 CN2，走得依旧是 163，该卡还是卡，且日本地区根本就没有 CN2 GIA 产品，所以中国电信用户在任何时候都绝不应该选择任何一家日本地区的 VPS，加多少钱都没有更好的效果；对联通用户而言，有物美价廉的 IIJ 为何要选它；对移动用户而言，没有任何特殊加成，还得从广州过去，舍近求远，你高攀不起，它爱搭不理，bbtec 线路我觉得没有任何入手价值。</p><h3 id="韩国地区">2.2.5. 韩国地区</h3><p>可以购买的本地商家不多，大多由国人代理运营，印象减分，再加上韩国地区比较严厉的互联网成人内容管制政策，韩国 VPS 有一条 porn 墙，不值得选择。</p><h3 id="俄罗斯地区">2.2.6. 俄罗斯地区</h3><p>毛熊的不少线路对联通用户是比较友好的，与中国临近，地理位置不吃亏，价格比较实惠。联通统一从北京出发，经过 Rostelecom (<a href="http://rt.ru/">http://rt.ru</a>) 线路过去，来回新西伯利亚机房的质量普遍比莫斯科的要好。但还有以下这些无法克服的问题：</p><ol><li>用俄语难以跟客服沟通；</li><li>不支持支付宝，paypal，付款困难；</li><li>别想着用来给美服、港服吃鸡，游戏加速，俄罗斯地区连接香港和美国的延迟极高；</li><li>同理，移动固网用户会先去香港，再去俄罗斯，延迟很高；</li><li>如果是建站，只有中国联通、欧洲用户访问过去的速度不错，全世界其他地区连接俄罗斯的速度都不理想，随着国力衰弱，俄罗斯网络设施的可利用价值不太高；</li></ol><h1 id="移动">3. 移动</h1><h2 id="线路-2">3.1. 线路</h2><p>移动网络回国或出国，必定经过北京&#x2F;上海&#x2F;广州，根据多方 Traceroute 观察，广州移动承担了大部分中国移动网络进出口的流量，如中美、中国东南亚等地区；</p><p>北京移动主要承担与欧洲地区进出口流量的通信（直连，非绕美）</p><p>中国移动的进出口跳跃性很大，国内部分必走 AS9808 路由（221.176.*.*&#x2F;221.183.*.*），在部分地区访问部分 VPS，会并入到铁通 AS9314&#x2F;电信 163 网络&#x2F;联通 169 网络的路由节点；</p><h2 id="线路选择">3.2. 线路选择</h2><p>中国移动网络的国际访问质量中规中矩，尤其是电信用户谈之色变的东南亚未优化 VPS 线路（一般要从日本 NTT 过去或是绕美），在移动用户看来真是小 Case，如果不能通过广州移动直接过去，那就呆在广州移动绕一圈再过去；</p><p>PCCW（电讯盈科） 线路目前是中港之间或是从中国到东南亚其他地区前且必须从香港中转线路的中，国内除纯 CN2 GIA 以外质量最好的线路；</p><p>移动现在的QoS，尽量使用80和443端口，可以的话，直接上 CloudFlare + V2ray(tls + ws)</p><h1 id="品质三原则">4. 品质三原则</h1><p>又要便宜，又要稳定，又要速度快？去做梦吧，梦里啥都有~~<br><img src="https://img.tupm.net/2019/10/20DA78CD7CB13684197AA99C8E8268D3.jpg" alt="network-quality-price"></p><h1 id="参考地址">5. 参考地址:</h1><p><a href="https://zhuanlan.zhihu.com/p/64467370">https://zhuanlan.zhihu.com/p/64467370</a></p>]]>
    </content>
    <id>http://yuanmomo.net/2019/10/28/network-to-abroad/</id>
    <link href="http://yuanmomo.net/2019/10/28/network-to-abroad/"/>
    <published>2019-10-28T06:28:11.000Z</published>
    <summary>
      <![CDATA[<h1 id="电信">1. 电信</h1><h2 id="线路">1.1. 线路</h2><p>电信的国际出口一共有两条线路：163 骨干网（又称 CN1） 和 CN2 网络。</p>
<ul>
<li>163 骨干网: 最早，普通质量，特别是晚上丢包率高；承担 85% 流量；</li>
<li>CN2 : 2005 年投入使用，低丢包，低延迟，轻负载；承担 15% 流量；</li>
</ul>
<p>电信网络的回国或出国，必定经过北京&#x2F;上海&#x2F;广州；</p>
<p>进出口路径分为三个品级:<br>    1. 163 网（CN1）；<br>    2. CN2 GT（Global Transfer 又称半程 CN2 ）；<br>    3. CN2 GIA（Global Internet Access 又称纯 CN2&#x2F;全程 CN2）</p>]]>
    </summary>
    <title>不同运营商，国外 VPS 线路选择</title>
    <updated>2026-06-21T21:12:41.658Z</updated>
  </entry>
  <entry>
    <author>
      <name>yuanmomo</name>
    </author>
    <category term="IDEA" scheme="http://yuanmomo.net/categories/IDEA/"/>
    <category term="IDEA" scheme="http://yuanmomo.net/tags/IDEA/"/>
    <category term="Gradle" scheme="http://yuanmomo.net/tags/Gradle/"/>
    <category term="JDK" scheme="http://yuanmomo.net/tags/JDK/"/>
    <content>
      <![CDATA[<p>最近尝试使用 Gradle 开始管理项目依赖，替代 Maven。但是在编译的时候，依然按照原来的方式添加。但是在编译的时候，出现下面的错误:</p><span id="more"></span><figure class="highlight shell"><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="meta prompt_">&gt; </span><span class="language-bash">Configure project :xxxxxxxx</span></span><br><span class="line">Errors occurred while build effective model from /Users/MoMo/.gradle/caches/modules-2/files-2.1/com.alibaba/druid/1.1.18/83a6ea652284b08567d8553ae0b6f99ec80ea7c3/druid-1.1.18.pom:</span><br><span class="line">    &#x27;dependencies.dependency.systemPath&#x27; for com.alibaba:jconsole:jar must specify an absolute path but is $&#123;env.JAVA_HOME&#125;/lib/jconsole.jar in com.alibaba:druid:1.1.18</span><br><span class="line">    &#x27;dependencies.dependency.systemPath&#x27; for com.alibaba:tools:jar must specify an absolute path but is $&#123;env.JAVA_HOME&#125;/lib/tools.jar in com.alibaba:druid:1.1.18</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">&gt; </span><span class="language-bash">Configure project :xxxxxxxx</span></span><br><span class="line">Errors occurred while build effective model from /Users/MoMo/.gradle/caches/modules-2/files-2.1/com.alibaba/druid/1.1.18/83a6ea652284b08567d8553ae0b6f99ec80ea7c3/druid-1.1.18.pom:</span><br><span class="line">    &#x27;dependencies.dependency.systemPath&#x27; for com.alibaba:jconsole:jar must specify an absolute path but is $&#123;env.JAVA_HOME&#125;/lib/jconsole.jar in com.alibaba:druid:1.1.18</span><br><span class="line">    &#x27;dependencies.dependency.systemPath&#x27; for com.alibaba:tools:jar must specify an absolute path but is $&#123;env.JAVA_HOME&#125;/lib/tools.jar in com.alibaba:druid:1.1.18</span><br></pre></td></tr></table></figure><p>大概意思就是 druid 依赖了 jdk 的 jconsole.jar 和  tools.jar，但是在 JDK 11 中又移除了这两个 jar 包:</p><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line">[I] [ 0 ]:[ 2019-10-26 10:10:03 ] MoMo in /L/J/JavaVirtualMachines</span><br><span class="line">» ls -al</span><br><span class="line">total 0</span><br><span class="line">drwxr-xr-x 5 root wheel 160 Oct 17 18:43 ./</span><br><span class="line">drwxr-xr-x 4 root wheel 128 Sep 30 04:20 ../</span><br><span class="line">drwxr-xr-x 3 root wheel  96 Sep  3 00:15 jdk-11.0.4.jdk/</span><br><span class="line">drwxr-xr-x 3 root wheel  96 Jun 17  2017 jdk1.7.0_80.jdk/</span><br><span class="line">drwxr-xr-x 3 root wheel  96 Jan 30  2018 jdk1.8.0_161.jdk/</span><br><span class="line"></span><br><span class="line">[I] [ 0 ]:[ 2019-10-26 10:10:23 ] MoMo in /L/J/JavaVirtualMachines</span><br><span class="line">» find . -name &quot;tools.jar&quot;</span><br><span class="line">./jdk1.7.0_80.jdk/Contents/Home/lib/tools.jar</span><br><span class="line">./jdk1.8.0_161.jdk/Contents/Home/lib/tools.jar</span><br><span class="line"></span><br><span class="line">[I] [ 0 ]:[ 2019-10-26 10:10:27 ] MoMo in /L/J/JavaVirtualMachines</span><br><span class="line">» find . -name &quot;jconsole.jar&quot;</span><br><span class="line">./jdk1.7.0_80.jdk/Contents/Home/lib/jconsole.jar</span><br><span class="line">./jdk1.8.0_161.jdk/Contents/Home/lib/jconsole.jar</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>解决办法最好是等 druid 兼容 JDK11，不过 issue 还在，一直没有人处理。<br><a href="https://github.com/alibaba/druid/issues/3060">https://github.com/alibaba/druid/issues/3060</a></p><p>当前我选择切换回 jdk8 进行开发，如果使用命令行，则添加参数 -Dorg.gradle.java.home 即可:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/gradlew -Dorg.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home   DownloadSources</span><br></pre></td></tr></table></figure><p>如果在 IDEA，配置 Gradle 使用指定的 JDK 版本即可:<br><img src="https://img.tupm.net/2019/10/0D3DBE3533311FAC77DA51D65705A0F9.jpg" alt="idea-gradle-jdk-version"></p><p>注意主要在 Gradle projects 选择你的项目，右边选择版本即可。</p><p>执行 task DownloadSources 时，说不能在 offline 模式下下载 jar。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Could not download spring-boot-sources.jar (org.springframework.boot:spring-boot:2.1.6.RELEASE): No cached version available for offline mode</span><br></pre></td></tr></table></figure><p>关掉这个开关即可。<br><img src="https://img.tupm.net/2019/10/838CD4DC355F1674DBD3D4F5BB7B46A7.jpg" alt="idea-gradle-offline"></p>]]>
    </content>
    <id>http://yuanmomo.net/2019/10/26/idea-gradle-jdk-version/</id>
    <link href="http://yuanmomo.net/2019/10/26/idea-gradle-jdk-version/"/>
    <published>2019-10-26T01:59:04.000Z</published>
    <summary>
      <![CDATA[<p>最近尝试使用 Gradle 开始管理项目依赖，替代 Maven。但是在编译的时候，依然按照原来的方式添加。但是在编译的时候，出现下面的错误:</p>]]>
    </summary>
    <title>IDEA 配置 Gradle 使用指定 JDK 版本</title>
    <updated>2026-06-21T21:12:41.654Z</updated>
  </entry>
</feed>
