<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>彩笺的信息资源网</title><description>专注于收集和分享网络资源的平台，包括热门电影、实用软件、网站源码、学习教程等资源</description><link>https://zywang.org/</link><language>zh_CN</language><item><title>useful website2</title><link>https://zywang.org/posts/goodweb2/</link><guid isPermaLink="true">https://zywang.org/posts/goodweb2/</guid><description>Ai tool</description><pubDate>Wed, 30 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;免费可商用图标库&lt;/h2&gt;
&lt;p&gt;remixicon.com&lt;/p&gt;
&lt;h2&gt;经典绝版游戏&lt;/h2&gt;
&lt;p&gt;原文：https://skywind.me/blog/archives/2863
韦神收集并开源的经典绝版游戏合集&lt;/p&gt;
</content:encoded></item><item><title>使用AI生成美观卡片&amp;AI算卦</title><link>https://zywang.org/posts/aicard/</link><guid isPermaLink="true">https://zywang.org/posts/aicard/</guid><description>AI算卦、AI卡片版本动物的一生、城市分布图、命理大师</description><pubDate>Wed, 23 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;所有prompt记录在：https://github.com/netlogs/prompt&lt;/p&gt;
&lt;p&gt;以下为部分展示&lt;/p&gt;
&lt;h2&gt;国家/城市分布图&lt;/h2&gt;
&lt;p&gt;::image{src=&quot;/images/prompt/city.webp&quot; alt=&quot;国家/城市分布图&quot;}&lt;/p&gt;
&lt;h2&gt;命理大师&lt;/h2&gt;
&lt;p&gt;::image{src=&quot;/images/prompt/minglidashi.webp&quot; alt=&quot;命理大师&quot;}&lt;/p&gt;
&lt;h2&gt;AI算卦图&lt;/h2&gt;
&lt;p&gt;::image{src=&quot;/images/prompt/8guaImage.png&quot; alt=&quot;AI算卦&quot;}&lt;/p&gt;
&lt;h2&gt;青蛙的一生&lt;/h2&gt;
&lt;p&gt;::image{src=&quot;/images/prompt/frog.webp&quot; alt=&quot;青蛙的一生&quot;}&lt;/p&gt;
</content:encoded></item><item><title>Google AdSense 国内提现教程：工商银行收款攻略</title><link>https://zywang.org/posts/googleadsense/</link><guid isPermaLink="true">https://zywang.org/posts/googleadsense/</guid><description>Google AdSense 国内提现教程：工商银行收款攻略</description><pubDate>Sun, 13 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Google AdSense 国内提现教程：工商银行收款攻略
https://uuzi.net/google-adsense-withdrawal-guide-china-icbc-payment-strategy/&lt;/p&gt;
</content:encoded></item><item><title>有趣的网站1</title><link>https://zywang.org/posts/goodweb1/</link><guid isPermaLink="true">https://zywang.org/posts/goodweb1/</guid><description>有趣的网站第一期</description><pubDate>Sat, 12 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;免费在线证件照制作&lt;/h2&gt;
&lt;p&gt;https://photo4you.win/&lt;/p&gt;
&lt;h2&gt;文字转图片&lt;/h2&gt;
&lt;p&gt;开源的、纯前端的文字转图片网站&lt;/p&gt;
&lt;p&gt;https://oneimgai.com/&lt;/p&gt;
&lt;p&gt;https://github.com/byodian/oneimg（github地址&lt;/p&gt;
&lt;h2&gt;匿名聊天&lt;/h2&gt;
&lt;p&gt;开源的浏览器插件，基于 WebRTC，为同一个页面的访问者建立去中心化、无服务器的匿名聊天，可用于任意网站。&lt;/p&gt;
&lt;p&gt;https://chromewebstore.google.com/detail/webchat/cpaedhbidlpnbdfegakhiamfpndhjpgf&lt;/p&gt;
&lt;h2&gt;NotebookLM&lt;/h2&gt;
&lt;p&gt;https://notebooklm.google/&lt;/p&gt;
&lt;p&gt;谷歌推出的一个新服务，可以将一篇文章转成学习笔记或者播客。&lt;/p&gt;
&lt;p&gt;也就是说，你上传文章后，它可以将文章转成一个英文的广播节目，内容是两个 AI 主持人一问一答介绍这篇文章，参见&lt;a href=&quot;https://blog.google/technology/ai/notebooklm-audio-overviews/&quot;&gt;官方的介绍&lt;/a&gt;。它甚至能将 Youtube 的视频转成播客。&lt;/p&gt;
&lt;h2&gt;文本转语音&lt;/h2&gt;
&lt;p&gt;跨平台的文本转语音的桌面工具，支持调用多个 API，免费使用&lt;/p&gt;
&lt;p&gt;https://github.com/ElmTran/praises&lt;/p&gt;
&lt;h2&gt;Hack news|黑客新闻搜索引擎&lt;/h2&gt;
&lt;p&gt;第三方的“黑客新闻”搜索引擎，使用体验很不错。&lt;/p&gt;
&lt;p&gt;https://hn.trieve.ai/&lt;/p&gt;
&lt;h2&gt;中文Hack news&lt;/h2&gt;
&lt;p&gt;这个网站实时给“黑客新闻”每个链接生成摘要。&lt;/p&gt;
&lt;p&gt;https://zeli.app/&lt;/p&gt;
</content:encoded></item><item><title>esim-moldova保号流程</title><link>https://zywang.org/posts/esim-moldova/</link><guid isPermaLink="true">https://zywang.org/posts/esim-moldova/</guid><description>摩尔多瓦Moldova esim卡保号流程</description><pubDate>Fri, 11 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;h1&gt;注册账号&lt;/h1&gt;
&lt;p&gt;打开&lt;a href=&quot;https://my.moldtelecom.md/my-moldtelecom/&quot;&gt;My Moldtelecom的Web端登录界面&lt;/a&gt;。（也可以在Google Play Store或者Apple Store中下载&lt;strong&gt;My Moldtelecom&lt;/strong&gt;的APP。）&lt;/p&gt;
&lt;p&gt;首次登录账号需要进行注册。点击“Sign up”按钮。&lt;/p&gt;
&lt;p&gt;::image{src=&quot;/images/moldova/moldtelecom-08.jpg&quot; alt=&quot;摩尔多瓦esim&quot;}&lt;/p&gt;
&lt;p&gt;点击“Phone”输入自己的手机号码，接下来点击“Next”按钮，此时系统会向我们的手机号发送一条短信验证码。&lt;/p&gt;
&lt;p&gt;::image{src=&quot;/images/moldova/moldtelecom-09.jpg&quot; alt=&quot;摩尔多瓦esim&quot;}&lt;/p&gt;
&lt;p&gt;在“Verification code”一栏填入收到的短信验证码，在“Password”和“Re-enter the password”一栏输入自己设置的登录密码，然后点击“Sign up”按钮。此时已完成注册。&lt;/p&gt;
&lt;p&gt;::image{src=&quot;/images/moldova/moldtelecom-10.jpg&quot; alt=&quot;摩尔多瓦esim&quot;}&lt;/p&gt;
&lt;p&gt;再次回到&lt;a href=&quot;https://my.moldtelecom.md/my-moldtelecom/&quot;&gt;My Moldtelecom的Web端登录界面&lt;/a&gt;，输入用户名和密码，然后点击“Login”按钮。其中用户名是我们的号码。&lt;/p&gt;
&lt;h2&gt;查看号码有效期&lt;/h2&gt;
&lt;p&gt;登陆后，界面如下图所示。&lt;/p&gt;
&lt;p&gt;::image{src=&quot;/images/moldova/moldtelecom-11.jpg&quot; alt=&quot;摩尔多瓦esim&quot;}&lt;/p&gt;
&lt;p&gt;页面的中心区域显示的就是当前号码的信息。Status表示号码当前的状态，Active till表示号码的有效期，Grace period表示号码的宽限期。&lt;/p&gt;
&lt;h2&gt;充值&lt;/h2&gt;
&lt;p&gt;点击页面左下角的“Pay for services”按钮。&lt;/p&gt;
&lt;p&gt;在页面左上角勾选需要充值的号码，输入充值的金额，点击“Pay with credit card”按钮，进入支付界面。&lt;/p&gt;
&lt;p&gt;::image{src=&quot;/images/moldova/moldtelecom-12.jpg&quot; alt=&quot;摩尔多瓦esim&quot;}&lt;/p&gt;
&lt;p&gt;在支付界面依次输入银行卡上的持卡人姓名、卡号、有效期、CVV码，然后点击底部的“PAY”按钮。支持Visa、Master、Google Pay、Apply Pay。&lt;/p&gt;
&lt;p&gt;支付成功后，号码信息会相应的更新。经测试，号码的有效期、宽限期不会累积，只是从充值当日重新顺延。&lt;/p&gt;
</content:encoded></item><item><title>纯净无广告galgame资源网站</title><link>https://zywang.org/posts/galgame/</link><guid isPermaLink="true">https://zywang.org/posts/galgame/</guid><description>无门槛无广告免登录最牛galgame网站</description><pubDate>Fri, 11 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;https://amoebi.com/&lt;/p&gt;
</content:encoded></item><item><title>好用网站、应用第三期</title><link>https://zywang.org/posts/goodapporweb3/</link><guid isPermaLink="true">https://zywang.org/posts/goodapporweb3/</guid><description>在线音频处理, SMS-Activate线接受短信的虚拟号码服务, 在线工具箱, 免费的 Notion 风格头像在线制作器</description><pubDate>Fri, 13 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;在线音频处理&lt;/h2&gt;
&lt;p&gt;之前分离歌曲人声，找到的网站，免费使用，无广告&lt;/p&gt;
&lt;p&gt;::image{src=&quot;/images/apporweb3/0.png&quot; alt=&quot;在线音频处理&quot;}&lt;/p&gt;
&lt;p&gt;https://100audio.com/sound/100audio_editor/&lt;/p&gt;
&lt;h2&gt;SMS-Activate线接受短信的虚拟号码服务&lt;/h2&gt;
&lt;p&gt;使用SMS-Activate的虚拟号码来在线接受短信。可以在600个多服务注册的一次性号码。&lt;/p&gt;
&lt;p&gt;::image{src=&quot;/images/apporweb3/1.png&quot; alt=&quot;SMS-Activate&quot;}&lt;/p&gt;
&lt;p&gt;https://sms-activate.io/cn&lt;/p&gt;
&lt;h2&gt;在线工具箱&lt;/h2&gt;
&lt;p&gt;在线工具,开发人员工具,代码格式化、压缩、加密、解密,下载链接转换,json格式化,正则测试工具,favicon在线制作,字帖工具,中文简繁体转换,迅雷下载链接转换,进制转换,二维码,照片压缩,pdf合并&lt;/p&gt;
&lt;p&gt;::image{src=&quot;/images/apporweb3/2.png&quot; alt=&quot;在线工具箱&quot;}&lt;/p&gt;
&lt;p&gt;https://tool.lu/&lt;/p&gt;
&lt;h2&gt;免费的 Notion 风格头像在线制作器&lt;/h2&gt;
&lt;p&gt;Notion头像是一种个性化的头像，设计风格与Notion（一款流行的笔记和组织工具平台）相匹配。这些头像可以用作Notion内的个人头像，或用于其他社交媒体平台，以保持视觉上的一致性和个人品牌形象。&lt;/p&gt;
&lt;p&gt;风格如何，是不是很文艺~&lt;/p&gt;
&lt;p&gt;::image{src=&quot;/images/apporweb3/3.png&quot; alt=&quot;Notion风格头像在线制作器&quot;}&lt;/p&gt;
&lt;p&gt;https://www.notionavatarmaker.com/zh&lt;/p&gt;
&lt;p&gt;如果没有查找到想要的资源，欢迎去公众号给我留言~&lt;/p&gt;
</content:encoded></item><item><title>web3入门1 | 人话说比特币和区块链</title><link>https://zywang.org/posts/web3tutorial1/</link><guid isPermaLink="true">https://zywang.org/posts/web3tutorial1/</guid><description>人话讲解比特币和区块链</description><pubDate>Wed, 11 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;由比特币区块链构成的去中心化的电子记账系统，实现了去中心化的功能，如何实现，且看下面：&lt;/p&gt;
&lt;h1&gt;1.比特币和区块链详解&lt;/h1&gt;
&lt;h2&gt;比特币&lt;/h2&gt;
&lt;p&gt;数字货币，基于区块链。&lt;/p&gt;
&lt;h2&gt;区块链&lt;/h2&gt;
&lt;p&gt;中本聪提出了一个概念：去中心化的电子记账系统&lt;/p&gt;
&lt;p&gt;去中心化：每个人的&lt;strong&gt;账本&lt;/strong&gt;公开&lt;/p&gt;
&lt;p&gt;假设A，B，C，D四个人之间互相交易，每两个人之间的交易记录都会被其他人记录到。&lt;/p&gt;
&lt;p&gt;把n(4k左右)个交易记录合成的账单称之为&lt;strong&gt;区块&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;账单多了之后，区块与区块链接起来，成为&lt;strong&gt;区块链&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这种格局就形成了所谓的：&lt;strong&gt;电子记账&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;比特币从何而来？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;记账&lt;/strong&gt;：中本聪规定每10分钟打一个新的区块包，&lt;strong&gt;打包&lt;/strong&gt;成功的人会获得手续费和比特币奖励，比特币奖励最初为50个比特币，每四年折半。&lt;/p&gt;
&lt;h3&gt;怎么界定成功打包的这个人？&lt;/h3&gt;
&lt;h4&gt;工作量证明&lt;/h4&gt;
&lt;p&gt;中本聪规定，大约每10分钟打一个包。&lt;/p&gt;
&lt;p&gt;每一个参与打包的都要做一个很难的数学题，谁先做出来谁就有权利打包（大白话一个一个数去尝试，尝试出来你就有权利）这也就是：&lt;strong&gt;挖矿&lt;/strong&gt;。&lt;/p&gt;
&lt;h4&gt;挖矿的具体原理&lt;/h4&gt;
&lt;h4&gt;背景了解：&lt;/h4&gt;
&lt;p&gt;密码学有个东西叫做hash函数，他的&lt;strong&gt;特点&lt;/strong&gt;为：&lt;/p&gt;
&lt;p&gt;一个任意长度的字符串可以通过运算转换为一个叫做&lt;strong&gt;摘要&lt;/strong&gt;的东西。&lt;/p&gt;
&lt;p&gt;正向运算转换很容易，反向很难&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;举例：&lt;/strong&gt; hash运算有个很著名的算法SHA256&lt;/p&gt;
&lt;p&gt;字符串：SHA256(&quot;awegagasdf&quot;) = &quot;0100110111&quot;(一共256位的0和1)&lt;/p&gt;
&lt;h4&gt;挖矿原理：&lt;/h4&gt;
&lt;p&gt;每个区块除了具体信息还包含一个头部。&lt;/p&gt;
&lt;p&gt;假设区块链此时长度为5，此时有n个人要准备打新包，每个人都有账单&lt;/p&gt;
&lt;p&gt;每个人手里都有一个字符串，大致组成为：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;字符串&lt;/strong&gt; = 区块链最后一个块的头部信息+手里账单信息+时间戳+随机数&lt;/p&gt;
&lt;p&gt;每个人对此字符串做两次hash运算&lt;/p&gt;
&lt;p&gt;hash=sha256(sha256(字符串))&lt;/p&gt;
&lt;p&gt;最后得到一个256位包含0和1的数。&lt;/p&gt;
&lt;p&gt;什么样的人可以获得最后打包权利呢？&lt;/p&gt;
&lt;p&gt;**答：**谁计算出来的hash的前m位都为0，那么谁就获得打包权利。&lt;/p&gt;
&lt;p&gt;如何才能计算出来符合要求的hash呢？通过&lt;strong&gt;不断改变字符串里面的随机数进行尝试&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;如何保证每10分钟打包一个块呢？&lt;/h3&gt;
&lt;p&gt;**答：**根据全世界的算力，调整m的难度。也就是说随着挖矿的人越来越多，m会越来越长。&lt;/p&gt;
&lt;h1&gt;2. 比特币交易&lt;/h1&gt;
&lt;h3&gt;如何保证交易真实？&lt;/h3&gt;
&lt;p&gt;在中心化交易的世界里，由银行和背后的国家来确保交易双方的身份。比如人脸、签名、指纹&lt;/p&gt;
&lt;p&gt;在去中心化的世界里，通过&lt;strong&gt;电子签名&lt;/strong&gt;来实现。&lt;/p&gt;
&lt;h3&gt;电子签名&lt;/h3&gt;
&lt;p&gt;比特币用户在注册的时候，会生成一个随机数&lt;/p&gt;
&lt;p&gt;随机数--&amp;gt; 私钥  --&amp;gt; 公钥 --&amp;gt; 地址&lt;/p&gt;
&lt;p&gt;私钥必须保存好，它代表了你的资产，要保管好。&lt;/p&gt;
&lt;p&gt;公钥和地址都是公开的。&lt;/p&gt;
&lt;p&gt;如果你想别人给你钱，你把地址给他就可以了。&lt;/p&gt;
&lt;p&gt;如果你要给别人钱，你把自己的地址和公钥给他。&lt;/p&gt;
&lt;p&gt;特点：公钥反算不出来私钥。&lt;/p&gt;
&lt;p&gt;**使用：**私钥可以对一串字符加密，公钥可以将私钥加密的数据解密。（非对称加密）&lt;/p&gt;
&lt;p&gt;举例：A要付给B 10个比特币&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A先写一条记录：A---(10BTC)---&amp;gt; B&lt;/li&gt;
&lt;li&gt;A对记录进行hash运算出来&lt;strong&gt;摘要&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;A使用私钥对摘要加密，产生一个&lt;strong&gt;密码&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;对全网广播，告诉别人我给了B10个比特币，同时广播&lt;strong&gt;公钥和密码&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;别人拿到广播之后，会对A这一条记录先hash运算，这个结果和A自己算出来的摘要是一样的。&lt;/li&gt;
&lt;li&gt;使用A的公钥和密码进行解密，将上一步算出来的摘要和解密的摘要进行对比。&lt;/li&gt;
&lt;li&gt;比对结果一致，代表你的电子签名ok。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;交易隐患&lt;/h3&gt;
&lt;p&gt;存在两个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A要给10个BTC给B，那怎么检查A有没有10个BTC？&lt;/li&gt;
&lt;li&gt;假设A有10个BTC，如果A同时说我分别给B和C10个BTC，如何避免这种现象？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我们知道区块链的概念，我们每个人都知道前面的所有区块的信息。当A说要支付10个BTC给B时，可以从前面的区块链检查，A所有的比特币交易记录，从而得知A的余额。&lt;/p&gt;
&lt;p&gt;如果你余额足够，那么你广播的这条：你要支付B10个BTC的信息就会被打包，反之，大家会拒绝你这条消息。&lt;/p&gt;
&lt;p&gt;第二个问题：&lt;/p&gt;
&lt;p&gt;A同时广播：&lt;/p&gt;
&lt;p&gt;消息1：A---(10BTC)---&amp;gt; B&lt;/p&gt;
&lt;p&gt;消息2：A---(10BTC)---&amp;gt; C&lt;/p&gt;
&lt;p&gt;当有人接收到第一条消息之后，会检查A的余额，不够的话会自然的拒绝第二条消息，同理其他先接收到第二条消息的也一样。&lt;/p&gt;
&lt;p&gt;此时会有两部分人，分别将消息1和消息2打包到块里面，但是此时还没确认，大家都在打包挖矿做工作量证明。&lt;/p&gt;
&lt;p&gt;假设一个幸运儿挖到了矿，那么他成功打包了一个新的区块，这个区块包含了消息1。&lt;/p&gt;
&lt;p&gt;然后他将新区块链接到了最大的区块链上（公链）&lt;/p&gt;
&lt;p&gt;此时在消息2上挖矿的人一看，上面有新块被打出来了，那么所以人都会放弃自己的块，站队到消息1的那个块。反之同理。&lt;/p&gt;
&lt;p&gt;总结：我们接收到别人对我们的付款时，必须等到付款消息被打包，才是真的到账了。&lt;/p&gt;
&lt;h3&gt;最长链原则&lt;/h3&gt;
&lt;p&gt;是存在那么一种可能，同一时刻有两个幸运儿同时挖矿打包成功，此时会造成公链会分叉。&lt;/p&gt;
&lt;p&gt;有两拨人会继续基于自己的分叉继续挖矿，总有一个时刻，某分叉：分叉1上会优先打出来一个包，分叉1为最长的区块链。此时分叉2的人会过来站队，放弃分叉2，区块链又回归到了一条链的状态。&lt;/p&gt;
&lt;h2&gt;下一篇：以太网那些事&lt;/h2&gt;
</content:encoded></item><item><title>web3入门2 | 人话说以太坊</title><link>https://zywang.org/posts/web3tutorial2/</link><guid isPermaLink="true">https://zywang.org/posts/web3tutorial2/</guid><description>以太坊是什么？</description><pubDate>Wed, 11 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;公链之王以太坊&lt;/h2&gt;
&lt;p&gt;上一期我们介绍了去中心化、区块链，比特币；那为什么还有以太坊呢？&lt;/p&gt;
&lt;p&gt;它是什么？解决了什么问题？&lt;/p&gt;
&lt;h2&gt;以太坊解决了什么问题？&lt;/h2&gt;
&lt;p&gt;先来看看以太坊对自己的定义：以太坊是新一代的智能合约和去中心化应用&lt;/p&gt;
&lt;p&gt;看不懂没关系，先不看。&lt;/p&gt;
&lt;p&gt;回顾比特币，我们可以发现他的去中心化仅仅体现在了交易上，有了比特币，我们每个人都拥有着对自己的资金的绝对掌握权，不用考虑现实中国际边界等一系列问题。&lt;/p&gt;
&lt;p&gt;但也仅限于此了。比特币设计之初我们也能看到就只是一个电子现金交易的解决方案：去中心化的电子记账系统&lt;/p&gt;
&lt;p&gt;其他的去中心化需求，是不能很好的得到支持的，此时以太坊应然而生。&lt;/p&gt;
&lt;p&gt;以太坊提出来一种设想，是不是可以提供一个平台来创建这些去中心化的应用。&lt;/p&gt;
&lt;h2&gt;解决方案&lt;/h2&gt;
&lt;h3&gt;1.做标准、统一语言、简化协议&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;基于区块链技术，以太坊提出了一套全球通用，简单易用的可编程区块链语言：Solidity&lt;/li&gt;
&lt;li&gt;在协议上你想发行自己的代币，那么就要使用ERC-20协议标准。该协议标准允许开发者构建可以和其他应用或者服务交互的代币应用程序。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;ERC-20&lt;/h4&gt;
&lt;p&gt;一个同质化代币的标准，换句话说，它们具有一种属性，使得每个代币都与另一个代币（在类型和价值上）完全相同。 例如，一个 ERC-20 代币就像以太币一样，意味着一个代币会并永远会与其他代币一样。&lt;/p&gt;
&lt;p&gt;在以太坊的官方文档里，有着非常详细并且清晰的解释文档链接&lt;/p&gt;
&lt;h3&gt;2. 智能合约&lt;/h3&gt;
&lt;p&gt;Solidity这个编程语言主要用来写智能合约，智能合约从&lt;strong&gt;smartcontract&lt;/strong&gt;翻译而来，直白翻译可以理解为：&lt;strong&gt;不可更改的电子合同&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在现实世界，我们和外界的交互，很多都需要签合同来确保双方的规范行为。例如租房、找工作，都需要签合同，只不过合同依靠国家系统来确保其发挥作用。&lt;/p&gt;
&lt;p&gt;而智能合约就是比特币的分布式记账，不可被篡改的思路的一个很好的体现。它就像合同代码化、程序化并且放在了区块链上确保其不被更改。智能合约一旦运行就不可更改。&lt;/p&gt;
&lt;p&gt;举个栗子：美元兑换人民币&lt;/p&gt;
&lt;p&gt;交易逻辑是A的账户减去一定量的美元，同时B的账户增加一定量的人民币&lt;/p&gt;
&lt;p&gt;智能合约就是把此逻辑使用代码实现并切放在了公链上，大家都能看到其具体的实现，并且无法篡改。&lt;/p&gt;
&lt;h2&gt;其中的隐患&lt;/h2&gt;
&lt;p&gt;当时基于智能合约的特点，人们发现去中心化的组织也完全可以利用智能合约来实现。&lt;/p&gt;
&lt;p&gt;组织或者社区的本质是一群人聚到一起，按照特定的规则形式，而这个规则完全可以用智能合约实现。&lt;/p&gt;
&lt;p&gt;当时最初的一个组织，The DAO(decentralized autonomous organization)，其使用的叫DAO币。&lt;/p&gt;
&lt;p&gt;发生了这么一个事：DAO众筹了总价值约1.5亿美元的资金，如此大的众筹项目被黑客盯上了，并且还真给黑客找到了合约中的漏洞，盗走了约1/3的总资金。&lt;/p&gt;
&lt;p&gt;这就相当于一个合同在设计之初，遗漏了某些特殊情况，留下了漏洞，被钻了空子。&lt;/p&gt;
&lt;p&gt;按照现实来理解：彩票规则出现了漏洞，结果奖池被人为的掏空。&lt;/p&gt;
&lt;p&gt;此时社区经过讨论，选择基于被盗之前的公链&lt;strong&gt;硬分叉&lt;/strong&gt;出去，强行改变规则按照新叉来走。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;可想而知，争议也是巨大的。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一部分人任务这违反了去中心化的精神，而另一部分人认为社区需要正义的力量。&lt;/p&gt;
&lt;p&gt;由此次事件，也衍生出了两种以太坊代币。&lt;/p&gt;
&lt;p&gt;一种是ETC，代表了去中心化不可篡改的精神，账本形成了就是不可更改。&lt;/p&gt;
&lt;p&gt;另一种就是今天我们最常用的ETH。也就是硬分叉之后的新链。&lt;/p&gt;
&lt;p&gt;而比特币，到目前为止可以说是一个完全去中心化的网络，中本聪创建比特币网络之后，就消失了，区块链按照最初的规则就这么运行了10多年。&lt;/p&gt;
&lt;h2&gt;奖励机制&lt;/h2&gt;
&lt;p&gt;最开始以太坊和比特币一样，都是按照工作量证明POW（Proof of work）来进行&lt;/p&gt;
&lt;p&gt;后来以太坊更改激励规则成了POS（Proof of stack）。简单来说就是你持有该网络的货币数量越多，参与记账可获得的奖励就越多。&lt;/p&gt;
</content:encoded></item><item><title>web3入门3 | Solidity简明教程</title><link>https://zywang.org/posts/web3tutorial3/</link><guid isPermaLink="true">https://zywang.org/posts/web3tutorial3/</guid><description>Solidity简明教程</description><pubDate>Wed, 11 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Solidity简明教程&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;本教程适用于有语言基础，速查或者快速入门。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;版权许可标识&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一般放在文件开头&lt;/p&gt;
&lt;p&gt;更多内容请查看https://learnblockchain.cn/docs/solidity/layout-of-source-files.html&lt;/p&gt;
&lt;h2&gt;版本&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;pragma solidity ^0.5.2;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;含义是既不允许低于 0.5.2 版本的编译器编译， 也不允许高于（包含） &lt;code&gt;0.6.0&lt;/code&gt; 版本的编译器编译（第二个条件因使用 &lt;code&gt;^&lt;/code&gt; 被添加）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pragma solidity &amp;gt;=0.6.12 &amp;lt;0.9.0;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;变量&lt;/h2&gt;
&lt;h3&gt;默认值&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract DefaultValues {
    bool public b; //false
    uint public u; //0
    int public i; //0
    address public a; //0x0000000(一共40个0,20位16进制数字)
    bytes32 public b32; //0x00000 一共64个0,32位

}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;常量&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract Constants {
    address public constant MY_ADDRESS = 0x2E35C375782713b7feedEd99B18C2F2728B2566D;
    uint public constant MY_UINT = 123;
}


contract Var {
    address public myaddr = 0x2E35C375782713b7feedEd99B18C2F2728B2566D;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;constant&lt;/strong&gt;定义常量&lt;/p&gt;
&lt;p&gt;常量和变量消耗的gas不一样，deploy之后点击&lt;code&gt;MY_ADDRESS&lt;/code&gt;可以查看gas费用是373&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;execution cost	373 gas (Cost only applies when called by a contract)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面这是Var合约内读取&lt;code&gt;myaddr&lt;/code&gt;消耗的gas&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;execution cost	2483 gas (Cost only applies when called by a contract)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;结构控制&lt;/h2&gt;
&lt;h3&gt;判断&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract IfElse {
    function example(uint x) external pure returns (uint) {
        if (x &amp;lt; 10) {
            return 1;
        } else if ( x &amp;lt; 20) {
            return 2;
        } else {
            return 3;
        }
    }
    function ternary(uint x) external pure returns (uint) {
        return x &amp;lt; 10 ? 1 : 2;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;循环&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract ForAndWhile {
    function loops() external pure {
        for (uint i = 0; i &amp;lt; 10; ++i) {
            //code
           if (i == 2)  continue;
            if (i == 4) {
                break;
            }
        }
        int b = 3;
        while(b &amp;gt; 0) {
            --b;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;和C语言一样，同时要注意控制循环次数，太多的循环会导致gas费用的高昂&lt;/p&gt;
&lt;h2&gt;Error&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

// require, revert, assert
// - gas refund, state updates are reverted
// 8.0 version 更新了，custom error, save gas
contract Error {
    function testRequire(uint _i) public pure {
        require(_i &amp;lt;= 10, &quot;i &amp;gt; 10&quot;);
        //code
    }
    function testRevert(uint _i) public pure {
        if(_i &amp;gt; 10) {
            revert(&quot;i &amp;gt; 10&quot;);
        }
        //code
    }
    uint public num = 123;
    function testAssert() public view {
        assert(num == 123);
    }

    function foo(uint _i) public {
        num += 1;
        require(_i &amp;lt; 10); //如果i不符合条件，前面+1的num会被回滚，状态不会被更改，gas退还
    }

    
    function testCustomError1(uint _i) public pure {
        require(_i &amp;lt;= 10, &quot;very long error message xxxxxxxxxxxxxxx&quot;);//使用require时，如果error信息很长，会消耗很多gas
    }

    error MyError();

    function testCustomError2(uint _i) public pure {
        if (_i &amp;gt; 10) revert MyError(); //通过这种方式触发自定义报错
    }
    //同时可以：
    error MyError2(address caller, uint i);
    function testCustomError3(uint _i) public view {
        if (_i &amp;gt; 10) revert MyError2(msg.sender, _i); //通过这种方式触发自定义报错
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;函数&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract Counter {
    uint public cnt;
    function inc() external {
        cnt += 1;
    }

    function dec() external {
        cnt -= 1;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;external&lt;/strong&gt;：外部可视，意思是在合约内部的其他函数不可以调用，只能被外部读取&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt;：公开可视，内部外部都可以调用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract FUnctionOutputs {
    function returnMany() public pure returns (uint, bool) {
        return (1, true);
    }
    function returnManyWithname() public pure returns (uint x, bool b) {
        return (1, true);
    }
    //隐式赋值返回
    function assigned() public pure returns (uint x, bool b) {
        x = 1; 
        b = true;
    }

    //合约内调用
    function otherfunc() public pure {
        (uint a, bool b) = returnMany();
        (, bool _b) = returnManyWithname();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;函数修改器&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract FunctionModifier {
    bool public paused;
    uint public cnt;

    function setPasuse(bool _paused) external {
        paused = _paused;
    }

    function inc() external {
        require(!paused, &quot;paused&quot;);
        cnt += 1;
    }
    function dec() external {
        require(!paused, &quot;paused&quot;);
        cnt -= 1;
    }
    //当我们期望合约暂停时cnt不被修改，我们可以在修改的func中添加require，函数修改器支持更强大的操作，
    //有点类似于C语言中，把暂停的判断提炼到一个判断函数内，然后在修改的函数都提前调用一下判断函数
    //写法：
    modifier whenNotPaused() {
        require(!paused, &quot;paused&quot;);
        _; //此处代表，使用此修改器的函数的其他的代码在哪里运行
    }

    function new_incOr_dec() external whenNotPaused {
        //cnt += 1; or cnt -= 1;
    }


    //带参数的函数修改器

    modifier cap(uint _x) {
        require(_x &amp;lt; 100, &quot;x &amp;gt;= 100&quot;);
        _;
    }
    function incBy(uint _x) external whenNotPaused cap(_x) {
        cnt += _x;
    }

    //sanddwich写法
    //下面相当于把foo中对cnt的一部分操作提到了修改器中
    //cnt 先执行+=10，再返回foo执行+=1，再返回sandwich执行*=2
    modifier sandwich() {
        cnt += 10;
        _;
        cnt *= 2;
    }

    function foo() external sandwich {
        cnt += 1;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;构造函数&lt;/h3&gt;
&lt;p&gt;合约部署时被调用一次，之后再也不能被调用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract Constructor {
    address public owner;
    uint public x;

    constructor(uint _x) {
        owner = msg.sender;
        x = _x;
    }
    //通过传参赋予x值，ctrl+s编译好之后，部署时，Deploy旁边会多一个输入框，代表构造函数的参数列表
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;数组&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract Array {
    uint[] public nums = [1, 2, 3];
    uint[10] public numsFixed= [4, 5, 6];

    function examples() external {
        nums.push(4); //[1, 2, 3, 4]; 适用于不定长数组
        nums[1] = 9; //下标，和C语言一样[1, 9, 3, 4]
        delete nums[1]; //[1, 0, 3, 4] ！不能减少数组长度
        nums.pop(); //[1, 0, 3] 类似于stl中的stack，减少了数组长度
        uint len = nums.length; //长度

        //create array in memory
        uint[] memory arr = new uint[](5);
        //在内存中的不允许pop、push
    }

    function returnArray() external view  returns (uint[] memory) {
        return nums;


    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;映射&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract Array {
    mapping(address =&amp;gt; uint) public balances;
    mapping(address =&amp;gt; mapping(address =&amp;gt; bool)) public isFriend;

    function examples() external {
        balances[msg.sender] = 123;
        uint bal = balances[msg.sender];
        uint bal2 = balances[address(1)]; // 0
        balances[msg.sender] += 456;

        delete balances[msg.sender]; //0

        isFriend[msg.sender][address(this)] = true;

    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;结构体&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

//结合数组和mapping
contract Structs {
    struct Car {
        string model;
        uint year;
    }

    Car public car;
    Car[] public cars;

    mapping(address =&amp;gt; Car[]) public carsByOwner;

    function examples() external {
        Car memory toyota = Car(&quot;Toyota&quot;, 1999);
        Car memory lambo = Car({year: 111, model: &quot;Lamborghini&quot;});
        Car memory zero;
        zero.model = &quot;aaaa&quot;;
        zero.year = 1993;

        cars.push(zero);
        cars.push(toyota);
        cars.push(lambo);

        cars.push(Car(&quot;Tesla&quot;, 1991));

        Car memory temp = cars[0];
        Car storage real = cars[0];
        real.year = 0; //storage带有指针效果
        delete real.year; //恢复cars[0]的成员year的默认值
        delete cars[1]; //默认值全部恢复
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;枚举&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

//结合数组和mapping
contract Enums {
    enum Status {
        None,
        Pending,
        Shipped,
        Completed,
        Rejected,
        Canceled
    }

    Status public status;

    struct Order {
        address buyer;
        Status status;
    }

    Order[] public orders;

    function get() external view returns (Status) {
        return status;
    }

    function set(Status _status) external {
        status = _status;
    }

    function ship() external {
        status = Status.Shipped;
    }

    function reset() external {
        delete status; //枚举类型的默认值是第一个字段，本例为&quot;None&quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;小结&lt;/h2&gt;
&lt;p&gt;管理员合约&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract Owner {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(owner == msg.sender, &quot;no owner&quot;);
        _;
    }

    function setOwner(address _newowner) external onlyOwner {
        require(_newowner != address(0), &quot;no 0 address&quot;);
        owner = _newowner;
    }

    function ownerUse() external onlyOwner {
        //code
    }

    function anyoneUse() external {
        //code
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;存储位置&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;memory&lt;/strong&gt; 内存的存储类型，&lt;strong&gt;局部变量&lt;/strong&gt;，生命周期随着作用域结束而结束&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;storage&lt;/strong&gt; &lt;strong&gt;状态变量&lt;/strong&gt;的存储类型，有点像引用或者指针&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;calldata&lt;/strong&gt; 只能用在参数中，如果使用calldata，会节约gas&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

contract DataLocations {
    struct Mystruct {
        uint foo;
        string text;
    }

    mapping(address =&amp;gt; Mystruct) public mys;

    function examples(uint[] calldata y, string calldata s) external returns (uint[] memory) {
        mys[msg.sender] = Mystruct({foo: 123, text: &quot;bar&quot;});
         Mystruct storage p = mys[msg.sender]; //此处也可以直接mys[msg.sender].text进行修改，当修改量少时消耗较少的gas，修改项多时使用storage
         p.text = &quot;new_text&quot;; //mys[msg.sender].text is: new_text

         Mystruct memory readonly = mys[msg.sender];
         readonly.foo = 444; //but ..mys[msg.sender].foo is: 123

         _internal(y); 
         //1. 如果_internal函数的参数列表中的y是memory类型，那么这里调用的时候会进行一次拷贝，消耗gas
         //如果使用calldata那么可以直接传递过去，不会发生拷贝

         uint[] memory memArr = new uint[](5);
         memArr[0] = 1;
         return memArr;
    }

    function _internal(uint[] calldata y) private {
        uint x = y[0];
    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;事件&lt;/h2&gt;
&lt;p&gt;记录当前contract状态的方法，不会记录在状态变量之中，而是体现在区块链浏览器上或者交易记录中的log&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

contract Event {
    event Log(string message, uint val);
    event IndexLog(address indexed sender, uint val, uint a, uint b); //添加indexed 链外可以搜索查询

    

    function examples() external {
        emit Log(&quot;hahaha&quot;, 1234);
        emit IndexLog(msg.sender, 22, 22, 22); //在链外通过工具可以查询该地址的一些事件
        
    }

    event Message(address indexed _from, address indexed _to, string message);

    function sendMessage(address _to, string calldata message) external {
        emit Message(msg.sender, _to, message);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;继承那些事&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

contract A {
    function foo() public pure virtual returns (string memory) {
        return &quot;A&quot;;
    }
    function bar() public pure virtual returns (string memory) {
        return &quot;A&quot;;
    }
    function baz() public pure returns (string memory) {
        return &quot;A&quot;;
    }
}

contract B is A { //继承写法
    function foo() public pure override returns (string memory) {
        return &quot;B&quot;;
    }
    function bar() public pure virtual override returns (string memory) {
        return &quot;A&quot;;
    }
}

contract C is B {
    function bar() public pure override returns (string memory) {
        return &quot;C&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;多线继承&lt;/h3&gt;
&lt;p&gt;优先写比较基类的继承关系，&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;X基类，Y is X
Z is X, Y
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

contract X {
    function foo() public pure virtual returns (string memory) {
        return &quot;X&quot;;
    }
    function bar() public pure virtual returns (string memory) {
        return &quot;X&quot;;
    }
    function x() public pure returns (string memory) {
        return &quot;X&quot;;
    }
}

contract Y is X { //继承写法
    function foo() public pure virtual override returns (string memory) {
        return &quot;Y&quot;;
    }
    function bar() public pure virtual override returns (string memory) {
        return &quot;Y&quot;;
    }
    function y() public pure returns (string memory) {
        return &quot;Y&quot;;
    }
}

contract Z is X, Y {
    function foo() public pure override(X, Y) returns (string memory) {
        return &quot;Z&quot;;
    }

    function bar() public pure override(X, Y) returns (string memory) {
        return &quot;Z&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;调用父级合约的构造函数&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;contract X {
    function foo() public pure virtual returns (string memory) {
        return &quot;X&quot;;
    }
    function bar() public pure virtual returns (string memory) {
        return &quot;X&quot;;
    }
    function x() public pure returns (string memory) {
        return &quot;X&quot;;
    }
}

contract Y is X {
	X.foo(); //1
	super.foo(); //2 多重继承时，父类的func都会被执行
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;可视范围&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;private 内部可见&lt;/li&gt;
&lt;li&gt;internal 内部inside和继承child范围可见&lt;/li&gt;
&lt;li&gt;public 内部inside和外部可见&lt;/li&gt;
&lt;li&gt;external  仅仅外部可见&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;不可变常量&lt;/h2&gt;
&lt;p&gt;关键词：&lt;code&gt;immutable&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;第一次定义后，就不可被改变&lt;/p&gt;
&lt;p&gt;一般用于你不知道其初始化，但是又是常量的情况。第一次赋值后变为常量。&lt;/p&gt;
&lt;h2&gt;接受ETH&lt;/h2&gt;
&lt;p&gt;关键词：&lt;code&gt;payable&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

contract Payable {
    address payable public owner; //可发送ETH主币

    constructor() {
        owner = payable(msg.sender); //使用时要给带有payable属性
    }

    function deposit() external payable { //函数可接受ETH主币的传入

    }

    function getBalance() external view returns (uint) {
        return address(this).balance;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;回退函数&lt;/h2&gt;
&lt;p&gt;当你调用合约中不存在的函数时，或者向合约发送主币的时候，都会调用回退函数&lt;/p&gt;
&lt;p&gt;当你期望发送主币的时候触发fallback，那么你需要给fallback方法加上payable属性，&lt;/p&gt;
&lt;p&gt;solidity8.0以上，新增&lt;strong&gt;receive&lt;/strong&gt;用来只接受主币&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;触发逻辑：*&lt;em&gt;当合约收到主币时，判断是否调用了数据，也就是msg.data是否为空，如果没有调用数据，执行*&lt;em&gt;fallback&lt;/em&gt;&lt;/em&gt;。如果为空，判断&lt;/strong&gt;receive&lt;strong&gt;是否存在，存在调用&lt;/strong&gt;receive**，调用&lt;strong&gt;receive&lt;/strong&gt;，如果不为空，不存在调用&lt;strong&gt;fallback&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

contract Fallback {
    event Log(string func, address sender, uint value, bytes data);
    fallback() external payable {
        emit Log(&quot;fallback&quot;, msg.sender, msg.value, msg.data);
    }
    receive() external payable {
        emit Log(&quot;receive&quot;, msg.sender, msg.value, &quot;&quot;);
     }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;发送ETH&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;transfer &lt;/code&gt;消耗2300gas，gas耗费完或者其他异常情况，revert&lt;/p&gt;
&lt;p&gt;&lt;code&gt;send &lt;/code&gt;消耗2300gas，返回bool值&lt;/p&gt;
&lt;p&gt;&lt;code&gt;call&lt;/code&gt; 会把剩余的gas都发送过去&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;
//transfer  2300gas revert
//send    2300 gas, return bool
//call   all gas, returns bool and data
contract SendETH {
    constructor() payable {

    }
    receive() external payable {

    }

    //三种发送ETH主币的方法
    function Sendbytransfer(address payable _to) external payable {
        _to.transfer(123);
    }
    function Sendbysend(address payable _to) external payable {
        bool sent = _to.send(123);
        require(sent, &quot;send failed&quot;);
    }
    function Sendbycall(address payable _to) external payable returns (bytes memory) {
        (bool success, bytes memory data) = _to.call{value: 123}(&quot;&quot;);
        require(success, &quot;send failed&quot;);
        return data;
    }
    
}

//接受ETH的合约，即上面的发送合约发送ETH到该地址

contract Ethreceive {
    event Log(uint amount, uint gas);

    receive() external payable {
        emit Log(msg.value, gasleft());
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;小结：钱包合约&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

contract EthWallet {
    address payable public owner;

    constructor() payable {
        owner = payable(msg.sender);
    }

    receive() external payable { }

    function withdraw(uint _amount) external {
        require(msg.sender == owner, &quot;no owner&quot;);

        owner.transfer(_amount); //两种效果一样，但是msg.sender在内存，节约gas
        //payable(msg.sender).transfer(_amount);
    }
    function getBalance() external view returns (uint) {
        return address(this).balance;
    }
    function getOwnBalance() external view returns (uint) {
        return msg.sender.balance;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;调用其他合约&lt;/h2&gt;
&lt;p&gt;区分两种不同的调用方式，以及可以在调用的时候发送主币&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

contract CallTest {
    function setOtherContract_X(address _test, uint _x) external {
        Test(_test).setX(_x);
    }
    
    function getOtherContract_X(Test _test) external view returns (uint) {
        return _test.getX(); //直接将另一个合约名字作为类型传参，然后调用也可
    }

    function setOtherContract_XandETH(address _test, uint _x) external payable {
        Test(_test).setXandReceiveETH{value: msg.value}(_x);
    }

    function getOtherContract_XandETH(Test _test) external view returns (uint, uint) {
        return _test.getXandETH(); 
    }
    

}
contract Test {
    uint public x;
    uint public value;

    function setX(uint _x) external {
        x = _x;
    }
    function getX() external view returns (uint) {
        return x;
    }

    function setXandReceiveETH(uint _x) external payable {
        x = _x;
        value = msg.value;
    }
    function getXandETH() external view returns (uint, uint) {
        return (x, value);
    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;接口合约&lt;/h2&gt;
&lt;p&gt;当我们不知道另一个合约的源码，或者另一个合约源码很长，可以通过接口方法来调用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

//此为外部其他的合约，我们不知道其源码，但是我们知道它实现了Icounter接口
contract Count {
    uint public count;

    function inc() external {
        count += 1;
    }
    function dec() external {
        count -= 1;
    }

}

interface Icounter {
    function count() external view returns (uint); //外部合约Count中有count变量，所以这也可以是一个接口
    function inc() external;
}

contract CallInterface {
    uint public count;
    function example(address _cnt) external {
        Icounter(_cnt).inc();
        count = Icounter(_cnt).count();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;call调用合约&lt;/h2&gt;
&lt;p&gt;在&lt;strong&gt;call&lt;/strong&gt;合约中使用：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;_test.call{value: 111}(abi.encodeWithSignature());&lt;/code&gt;来调用另一个合约的&lt;strong&gt;函数&lt;/strong&gt;，依靠&lt;code&gt;abi.encodeWithSignature&lt;/code&gt;来实现。&lt;/p&gt;
&lt;p&gt;其中&lt;code&gt;value: 111&lt;/code&gt;表示在调用是发送主币，也可以带有gas&lt;code&gt;value: 111, gas:5000&lt;/code&gt;但是要确保gas够用。&lt;/p&gt;
&lt;p&gt;当Test合约的fallback不存在时，使用call调用不存在的函数时，即下文&lt;code&gt;callnoexist&lt;/code&gt;会失败，原理见：&lt;strong&gt;回退函数&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

contract Test {
    string public message;
    uint public x;

    event Log(string message);

    
    fallback() external payable {
        emit Log(&quot;fallback was called&quot;);
    }
    

    function foo(string memory _message, uint _x) external payable returns (bool, uint) {
        message = _message;
        x = _x;
        return (true, 11);
    }
}

contract Call {
    bytes public data;
    function callFoo(address _test) external payable {
        (bool success, bytes memory _data) = _test.call{value: 111}(abi.encodeWithSignature(
            &quot;foo(string, uint256&quot;, &quot;call foo&quot;, 123
        ));
        require(success, &quot;call failed&quot;);
        data = _data;
    }

    function callnoexist(address  _test) external {
        (bool success, ) = _test.call(abi.encodeWithSignature(&quot;noexist&quot;));
        require(success, &quot;call failed&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;委托调用&lt;/h2&gt;
&lt;p&gt;传统调用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;A call B, send 100wei
B call C, send 50wei

在C的视角
msg.sender = B;
msg.value = 50;
可能发生的状态变量也是在C上，ETH主币也会留在C中
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而委托调用：delegatecall&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;A call B, send 100wei
B delegatecall C

此时，在C的视角
msg.sender = A;
msg.value = 100;
100个ETH主币保存在B，状态也是B中的状态变量发生改变。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;人话：&lt;/strong&gt; 合约X委托调用合约Y的函数，相当于使用了Y的函数作用于自身，在下面的函数中，DelegateCall委托调用了Test中的setVars方法，作用于DelegateCall合约自身。发生改变的也是DelegateCall的状态变量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tip：两个合约的状态变量等布局要保持一致，不然会发生奇怪的错误&lt;/strong&gt;，本质上像是内存布局的调用，假设DelegateCall的状态变量和Test的前面的状态变量一样，Test后面新增几个新的状态变量，就不会发生错误。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

contract Test {
    uint public num;
    address public sender;
    uint public value;

    function setVars(uint _num) external payable {
        num = _num*2;
        sender = msg.sender;
        value = msg.value;
    }
}

contract DelegateCall {
    uint public num;
    address public sender;
    uint public value;

    function setVars(address _test, uint _num) external payable {
        //_test.delegatecall (
        //    abi.encodeWithSignature(&quot;setVars(uint256)&quot;, _num)
        //);

        //两种方法效果一样

        (bool success, bytes memory _data) = _test.delegatecall (
            abi.encodeWithSelector(Test.setVars.selector, _num)
        );
        require(success, &quot;delegatecall failed&quot;);
    }


}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;工厂合约&lt;/h2&gt;
&lt;p&gt;可以使用一个合约，创建另一个合约，同时也是可以添加payable方法，使用&lt;code&gt;value&lt;/code&gt;来给合约发送ETH主币。&lt;/p&gt;
&lt;p&gt;在ide测试使用的时候，deploy工厂之后，生成了一个account地址，可以通过deploy按钮下面的&lt;code&gt;At address&lt;/code&gt;来直接生成对应的Account合约，然后就可以查看其内容了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

contract Account {
    address public bank;
    address public owner;

    constructor(address _owner) payable {
        bank = msg.sender;
        owner = _owner;
    }
}

contract AccountFactory {
    Account[] public accounts;
    function createAccount(address _owner) external payable {
        Account account = new Account{value: 123}(_owner);
        accounts.push(account);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;库合约&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

library Math {
    function max(uint x, uint y) internal pure returns (uint) {
        return x &amp;gt;= y ? x : y;
    }
}

contract Test {
    function testMax(uint x, uint y) external pure returns (uint) {
        return Math.max(x, y);
    }
}

library ArrayLib {
    function find(uint[] storage arr, uint x) internal view returns (uint) {
        for(uint i = 0; i &amp;lt; arr.length; i++) {
            if (arr[i] == x) {
                return i;
            }
        }
        revert(&quot;not found&quot;);
    }
}

contract TestArray {
    uint[] public arr = [3, 2, 1];

    function testFind() external view returns (uint i) {
        return ArrayLib.find(arr, 2);
    }
}

//更方便的写法
contract TestArray2 {
    using ArrayLib for uint[];
    uint[] public arr = [3, 2, 1];

    function testFind() external view returns (uint i) {
        return arr.find(2);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;hash运算&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;keccak256
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;tip：在做hash运算进行编码时，使用abi.encodexxxx编码时，不同的编码方式出来的结果不一致&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;image-20240630194319168&lt;/p&gt;
&lt;p&gt;可以看到一个会补0，另一个不会补0。&lt;/p&gt;
&lt;p&gt;那么使用&lt;code&gt;encodePacked&lt;/code&gt;对&lt;code&gt;&quot;AAAA&quot;, &quot;BBB&quot;&lt;/code&gt; &lt;code&gt;&quot;AAA&quot;, &quot;ABBB&quot;&lt;/code&gt;编码，出来的结果会是一样的。如果在这个的基础上再次进行hash运算，就会导致hash碰撞。所以编码时比较好的方式是采用&lt;code&gt;abi.encode&lt;/code&gt;，或者在要编码的字符串之前添加uint等方式来隔开。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

contract HashFunc {
    function hash(string memory text, uint num, address addr) external pure returns (bytes32) {
        return keccak256(abi.encodePacked(text, num, addr));
    }

    function encode(string memory text1, string memory text2) external pure returns (bytes memory) {
        return abi.encode(text1, text2);
    }
    function encodePacked(string memory text1, string memory text2) external pure returns (bytes memory) {
        return abi.encodePacked(text1, text2);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;验证签名&lt;/h2&gt;
&lt;p&gt;对一个消息签名分为四步&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将消息签名，message to sign&lt;/li&gt;
&lt;li&gt;hash(message)&lt;/li&gt;
&lt;li&gt;sign(hash(message), private key) | offchain  把消息和私钥签名，在链下完成&lt;/li&gt;
&lt;li&gt;恢复签名 ecrecover(hash(message), signature) == signer ，然后验证signer和你期望的是否一致&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

contract Verifysign {
    function verify(address _signer, string memory _message, bytes memory _sign) external pure returns (bool) {
        bytes32 messageHash = getMessageHash(_message);
        bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);
        return recover(ethSignedMessageHash, _sign) == _signer;
    }
    function getMessageHash(string memory _message) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(_message));
    }
    function getEthSignedMessageHash(bytes32 _messageHash) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(
            &quot;\x19Ethereum Signed Message:\n32&quot;,
            _messageHash)); //进行两次hash的原因可能是在数学界一次hash已经有被破解的可能性了
    }

    function recover(bytes32 _ethSignedMessageHash, bytes memory _sign) public pure returns (address) {
        (bytes32 r, bytes32 s, uint8 v) = _split(_sign);
        return ecrecover(_ethSignedMessageHash, v, r, s);
    }

    function _split(bytes memory _sign) internal pure returns (bytes32 r, bytes32 s, uint8 v) {
        require(_sign.length == 65, &quot;invalid signature length&quot;);

        assembly {
            r := mload(add(_sign, 32))
            s := mload(add(_sign, 64))
            v := byte(0, mload(add(_sign, 96)))
        }
        
    }
    
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;小结：权限控制合约&lt;/h2&gt;
&lt;h2&gt;自毁合约&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

contract Killer {
    constructor() payable {}

    function kill() external {
        selfdestruct(payable(msg.sender)); //像该地址强制发送ETH，即使你是不接受ETH主币的合约，也会给你
    }

    function testCall() external pure returns (uint) {
        return 123;
    }
}

contract Helper {
    function getBalance() external view returns (uint) {
        return address(this).balance;
    }

    function kill(Killer _kill) external {
        _kill.kill();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;ERCP20标准合约&lt;/h2&gt;
&lt;p&gt;ERC20标准包含了一组接口IERC20，只要你的代码实现了全部接口，就代表你满足了ERC20标准&lt;/p&gt;
&lt;h2&gt;在线IDE&lt;/h2&gt;
&lt;p&gt;https://remix.ethereum.org/&lt;/p&gt;
</content:encoded></item><item><title>好用网站、应用第二期</title><link>https://zywang.org/posts/goodapporweb2/</link><guid isPermaLink="true">https://zywang.org/posts/goodapporweb2/</guid><description>好用网站、应用第二期 AI网盘检索、要知、橙篇、黄柚水印工具</description><pubDate>Tue, 10 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;AI网盘检索&lt;/h2&gt;
&lt;p&gt;AI网盘检索是一个实用的搜索软件；
软件支持安卓。
它特别强大，可以帮助你轻松找到需要的东西，例如：PPT 模板、Excel 模板、考研学习资料、英语学习资料、摄影学习资料、编程学习资料、图片素材、音频素材等。
它使用简单，通过对话的方式交互，非常智能。
::image{src=&quot;/images/apporweb2/app1.jpg&quot; alt=&quot;app1&quot;}&lt;/p&gt;
&lt;h2&gt;要知&lt;/h2&gt;
&lt;p&gt;要知是一个干净清爽的新闻资讯聚合软件；
软件支持安卓、iPhone 、iPad。
它一个软件相当于多个软件，界面简单清新，让你拥有纯净舒适的新闻浏览阅读体验；
它一直在更新完善，支持每日早报一键播报、热门榜单合集、全网聚合 24 小时热榜、时间轴展示新闻资讯、资讯聚合、卡片设计、横竖排切换、强大的搜索功能、日历样式展示早报回顾。
::image{src=&quot;/images/apporweb2/app2.jpg&quot; alt=&quot;app2&quot;}&lt;/p&gt;
&lt;h2&gt;橙篇&lt;/h2&gt;
&lt;p&gt;橙篇是一个强大的 AI 助手软件；
软件支持安卓、iPhone。
它免费好用，支持的功能包括：照片漫改视频、AI 一键创作风格化视频、AI 智能全网搜索、AI 帮你精准筛选总结、AI 今日热点、汇集全网热点事件、AI 为你梳理来龙去脉和多维度解读。
它还支持超长文章写作、一键生成万字长文、文档总结回答、超多数量和超多类型的文档快速总结回答、学术搜索、文献期刊搜索。
::image{src=&quot;/images/apporweb2/app3.jpg&quot; alt=&quot;app3&quot;}&lt;/p&gt;
&lt;h2&gt;黄柚水印工具&lt;/h2&gt;
&lt;p&gt;黄柚水印工具是一个苹果视频去水印软件；软件支持 iPhone。
它支持视频去水印，还支持视频编辑、视频提取音频、视频删除音频、视频制作动态壁纸、视频加文字、视频滤镜、视频涂鸦、视频调速、图片编辑、图片去水印、图片模糊、图片像素、图片字符。
其中视频去水印支持上百个主流平台，使用简单便捷。
::image{src=&quot;/images/apporweb2/app4.jpg&quot; alt=&quot;app4&quot;}&lt;/p&gt;
&lt;p&gt;15款冷门稀缺的App&lt;/p&gt;
&lt;p&gt;1：直链下载：https://muziqi.lanzoul.com/b0foro70d
密码：myu4&lt;/p&gt;
&lt;p&gt;2：百度云链接: https://pan.baidu.com/s/1tznhRtu2Nn2h9_zQJLELUA?pwd=rs1d&lt;/p&gt;
&lt;p&gt;3：iOS下载：https://shimo.im/docs/913JMQKxK5i0RRAE/&lt;/p&gt;
&lt;p&gt;4：部分安卓手机在安装的时候显示无法安装，可以通过断开网络再安装&lt;/p&gt;
</content:encoded></item><item><title>好用的网站/应用第一期</title><link>https://zywang.org/posts/goodapporwebsite/</link><guid isPermaLink="true">https://zywang.org/posts/goodapporwebsite/</guid><description>分享我看到的好用的应用、网站、资源第一期, 现代文转古文, 视频字幕编辑, 极小图标, 英语语法书籍</description><pubDate>Sun, 08 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://modelscope.cn/studios/chostem/ancient_Chinese_text_generator&quot;&gt;现代文转古文大模型&lt;/a&gt;
::image{src=&quot;/images/app11.png&quot; alt=&quot;现代文转古文大模型&quot;}&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/SubtitleEdit/subtitleedit/releases/tag/4.0.7&quot;&gt;subtitleedit&lt;/a&gt;开源的视频字幕编辑工具。适用于 Windows 的免费视频字幕编辑器。开箱即用且功能强大，支持创建、调整、同步和翻录字幕，还提供了自动翻译、字幕格式转换和语音识别等功能。
::image{src=&quot;/images/app12.png&quot; alt=&quot;视频字幕编辑工具&quot;}&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/danklammer/bytesize-icons&quot;&gt;bytesize-icons&lt;/a&gt;极小、极简的 SVG 图标集合
::image{src=&quot;/images/app13.png&quot; alt=&quot;图标&quot;}&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/llwslc/grammar-club&quot;&gt;grammar-club&lt;/a&gt; 旋元佑老师写的一本英语语法书籍，旨在帮助读者建立扎实的语法基础，适合各个水平的英语学习者。
::image{src=&quot;/images/app14.png&quot; alt=&quot;英语语法书籍&quot;}&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>资源网站导航 网盘/磁力/影视/学习/工具</title><link>https://zywang.org/posts/resource-website/</link><guid isPermaLink="true">https://zywang.org/posts/resource-website/</guid><description>资源导航网站</description><pubDate>Sun, 08 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;导航页：
图欧学习导航：https://tuostudy.upnb.top/
黑洞导航：https://hddh.link/&lt;/p&gt;
&lt;p&gt;阿里云盘论坛：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;网盘小站：https://wpxz.top/
羊驼小站：http://xdys88.com.cn/
我的小站：https://pan666.net/
猫狸盘搜：https://www.alipansou.com/
up云搜：https://www.upyunso.com/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;优秀的阿里云盘个人资源舱或合集舱：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;小小树洞400T：https://docs.qq.com/sheet/DS25FQkJjbkZpUnZh?tab=b4ob6e
柠檬的资源库：http://sj.ysupan.com/
影视资源分享官：https://link3.cc/hygf888
网盘资源合集：https://p.kdocs.cn/s/VH4JIBAA64
学习资源船舱：https://link3.cc/studyship
学习资源五大仓：https://tuostudy.top/音范丝：https://www.yinfans.cc/
             https://www.yinfans.me/
             https://www.yinfans.net/
布谷TV：https://www.bugutv.org/
最爱片源网：https://www.z2pyw.com/
4K世界：https://www.4khdr.cn/
送个：
茶杯狐：https://cupfox2.com/KK小站：https://kkxz.vip/
网盘资源合集：https://p.kdocs.cn/s/VH4JIBAA64
磁力猫：clm.la
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;bt seed&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://www.3bt0.com/
这个主打bt
https://www.btnull.org/
无名小站，也是bt
https://www.bdys10.com/
这个也是bt，体积小一些，清晰度差一些。
https://wpxz.top/
这个是阿里云盘。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;seed、电影&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;磁力搜索：
（手机访问，资源最全）https://www.btnull.org/
（知名站点，体积小巧）https://btbtt12.com/
网盘搜索：
https://yiso.fun/
https://zhaoziyuan.me/
还有更绝的，能直接搜索全网在线播放
http://soupian.xyz/
不太灵 
butailing.com
阿里云资源
https://www.aliyundrive.com/s/3gTt6wdZoFY/folder/63fafab8f325089a9cc0477d9d566735f85cc4f8
特殊种子搜索
sukebei.nyaa.SI
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;片库（推荐）---网盘/种子/磁力&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://www.btnull.si/
@哔嘀影视（推荐）---种子/磁力/电驴
https://www.bdys10.com/
@MP4电影---磁力/电驴
https://www.wemp4.com/
@深影驿站（原创字幕组）---网盘
https://sysub.vip/
@皮皮虾（推荐）---网盘
https://ppxzy.net/
@我的小站（推荐）---网盘
https://pan666.net/
@小纸条（推荐）---网盘
https://ali.gitcafe.ink/
@盘友圈---网盘
https://panyq.com/
低端影视（在线）---网盘
https://ddys.pro/
@蜜柑计划（动漫）---种子
https://mikanani.me/
@ACG（动漫）---种子
https://acg.rip/
@不太灵---种子
https://www.1bt0.com/
@BT之家---种子
http://btbtt19.com/

&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>（全网最全最详细）天涯神贴合集1000篇 | 超全合集，无需解压</title><link>https://zywang.org/posts/tianya/</link><guid isPermaLink="true">https://zywang.org/posts/tianya/</guid><description>天涯社区天涯社区创办于1999年，要知道，那时候的中国互联网才刚刚起步，BAT 甚至还没有创建。 到2007年时，天涯社区的注册用户就已经突破了2000万，天涯给了自己一个身份：全球最大的中文互联网社区</description><pubDate>Sun, 08 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;天涯社区创办于1999年，要知道，那时候的中国互联网才刚刚起步，BAT 甚至还没有创建。&lt;/p&gt;
&lt;p&gt;到2007年时，天涯社区的注册用户就已经突破了2000万，天涯给了自己一个身份：全球最大的中文互联网社区，喊出了“全球华人的网上家园”口号。&lt;/p&gt;
&lt;p&gt;::image{src=&quot;/images/tianya/tianya.jpeg&quot; alt=&quot;tianya&quot;}&lt;/p&gt;
&lt;p&gt;天涯社区曾经捧红过以“芙蓉姐姐”为代表的第一代网红。&lt;/p&gt;
&lt;p&gt;截至2013年8月，天涯社区注册用户数就高达8500万。&lt;/p&gt;
&lt;p&gt;当年的天涯部分大神们名单：
1.经济类: KK、喜数女、缠中说禅、雕爷、高铭、新垣平、大江宁静、Mark、波得莱神，KU神，0715，白马，咸聊，蛮族勇士
2.神秘类: 神奇的老贼头、个三、天下霸唱、何马、四书五经、乾泰丰、老夜、li非凡、猪头大拿、脚踏阴阳
3.煮酒论史类: 当年明月、南派三叔、天下霸唱、燕垒生，慕容雪春，蜘蛛，小汗、小鹏、宁财神、神之手123、雨花石。
4.其他类: 我是骗子他祖宗、赚钱7788、上海高隐、麻帝等&lt;/p&gt;
&lt;p&gt;其中不乏这些现在依然很有影响力的大V和作家们，当年全部成名于天涯，虽说是相互成就，但侧面也反映出天涯的多样性，包容性，尤其是小说这一类，不仅在当时，哪怕是现在，也是行业第一的水准。&lt;/p&gt;
&lt;p&gt;::image{src=&quot;/images/tianya/tianya2.png&quot; alt=&quot;tianya2&quot;}&lt;/p&gt;
&lt;p&gt;天涯社区生于 PC 时代，死于移动互联网（手机）。
在移动互联网的冲击下， 论坛没有了往日的风光，现在大家的时间都被手机直播、短视频等占据了，逛论坛的习惯渐渐的没有了。
天涯论坛也终于在2022年11月22日18时正式宣布永久关闭...随之消失的还有一代人的青春...&lt;/p&gt;
&lt;p&gt;不过，幸运的是我和我的团队把这些天涯神贴收集整理在了一起，基本上是目前能找到的天涯神贴合集最全的了，而且是PDF版本免解压点开直接看，共计800w+字1000篇。&lt;/p&gt;
&lt;p&gt;::image{src=&quot;/images/tianya/tianya3.png&quot; alt=&quot;tianya3&quot;}&lt;/p&gt;
&lt;p&gt;其中比较经典的天涯十大神贴：
1、【大鹏金翅明王】系列：谈论了房价现象，同时也分享了一些人生经验、社会法则、个人感悟等，发人深省
2、【 kkkndme】系列：写于2010年左右，用浅显的话对房地产市场进行了分析
3、【灵宠灵草】：带有灵异性质，讲述了如何培养灵宠、灵草，比如芦荟能带来好运、乌龟能带来财运，如何把鲤鱼、泥鳅和猫培养成灵兽等等
4、【我当道士那些年】：从主角出生被百鬼缠身，到之后拜师，修炼长大等一系列故事，非常细腻
5、【他手机里有爱人，有秘密，有感情】：情感类帖子，刻在DNA里的意难平
6、【我是一名杀手，仅此而已】：讲述一个杀手的故事，仿佛令人身临其境，点击破千万
7、【感谢小月月这样一个极品的朋友】：横空出世的极品女小月月，刷新了诸多网络红人造的雷人纪录
8、【客房，大三租房灵异经历】：莲蓬鬼话板块神贴，讲述灵异故事
9、【宜昌鬼事】：描述了上世纪一些离奇诡异的事件，引人入胜
10、【英雄末路：历史上那些大人物之死】：历史类&lt;/p&gt;
&lt;p&gt;下载链接：https://pan.quark.cn/s/4072a2ff82ee&lt;/p&gt;
</content:encoded></item></channel></rss>