<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>阿5</title>
        <link>https://paragraph.com/@5-3</link>
        <description>undefined</description>
        <lastBuildDate>Sat, 04 Jul 2026 22:32:14 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>阿5</title>
            <url>https://storage.googleapis.com/papyrus_images/5283ce2ef806fa06f8b97083d7f35f73b50e7a5eeb3c20eb6cf21c13e28a4341.jpg</url>
            <link>https://paragraph.com/@5-3</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Optimism with Moving from Optimism to Ethereum]]></title>
            <link>https://paragraph.com/@5-3/optimism-with-moving-from-optimism-to-ethereum</link>
            <guid>ouJNSPuXdXWb9gklTO7U</guid>
            <pubDate>Fri, 18 Mar 2022 23:42:31 GMT</pubDate>
            <description><![CDATA[Optimism batch提交示例optimistic etherscan 29307 包含72 transactions etherscan txHash 0x8c81f25ab1c3e9f4359f0d605a2e12a5a73cbfba6cdb340c66ccf0a5ea2439df 合约0x5e4e65926ba27467555eb562121fac00d24e9dd2 ，即layer1上的Ethereum(Optimism: Canonical Transaction Chain，权威交易链)，权威交易链是一个追加型 日志，它代表Rollup链的“正式历史”（所有交易以及其顺序），链接如图所示： 交易可以由Sequencer等提交给CTC。为了保留L1的抗审查 能力，任何人都可以将交易提交到此队列，并在一定滞后期之后将其包括在CTC中。权威交易链（CTC：Canonical Transaction ChainCTC为每批发布的L2交易提供数据可用性。可以通过两种方式创建批处理：预计每隔几秒钟，Sequencer就会检查接收到的新交易，将它们分批汇总，以及所需的任何其他...]]></description>
            <content:encoded><![CDATA[<h2 id="h-optimism-batch" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Optimism batch提交示例</h2><p>optimistic etherscan 29307 包含<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://optimistic.etherscan.io/txs?batch=29307">72 transactions</a></p><p>etherscan txHash</p><p>0x8c81f25ab1c3e9f4359f0d605a2e12a5a73cbfba6cdb340c66ccf0a5ea2439df</p><p>合约<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/0x5e4e65926ba27467555eb562121fac00d24e9dd2">0x5e4e65926ba27467555eb562121fac00d24e9dd2</a> ，即layer1上的Ethereum(Optimism: Canonical Transaction Chain，权威交易链)，权威交易链是一个追加型 日志，它代表Rollup链的“正式历史”（所有交易以及其顺序），链接如图所示：</p><p>交易可以由Sequencer等提交给CTC。为了保留L1的抗审查 能力，任何人都可以将交易提交到此队列，并在一定滞后期之后将其包括在CTC中。</p><h2 id="h-ctccanonical-transaction-chain" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">权威交易链（CTC：Canonical Transaction Chain</h2><p>CTC为每批发布的L2交易提供数据可用性。可以通过两种方式创建批处理：</p><ul><li><p>预计每隔几秒钟，Sequencer就会检查接收到的新交易，将它们分批汇总，以及所需的任何其他元数据。然后，他们 利用appendSequencerBatch将该数据发布到以太坊。这是由批处理提交者<strong>batch_submitter</strong>服务自动完成的。</p></li><li><p>当Sequencer审查其用户或当用户执行从L1到L2的交易，用户需要调用enqueue和appendQueueBatch，这会强制在CTC中 包含交易.</p></li></ul><p>你可能会注意到，appendSequencerBatch没有任何参数。批次以紧密打包的格式提交，而使用ABI编码和解码则效率要 低得多。它使用内联汇编来对calldata进行切片，并以预期的格式将其解压缩。</p><p>一个批次由以下部分组成：</p><ul><li><p>批次头</p></li><li><p>批处理上下文（&gt; = 1，请注意：此上下文与我们在上面的“ OVM”部分中提到的消息/交易/全局上下文不同）</p></li><li><p>交易（&gt; = 1）</p></li></ul><p>批次头指定了上下文的数量，因此序列化的批处理看起来像是 [header, context1, context2, …, tx1, tx2, … ]</p><p>该函数继续执行以下两项操作：</p><ul><li><p>验证所有与上下文相关的不变量是否适用</p></li><li><p>根据已发布的交易数据创建默克尔树</p></li></ul><p>如果通过了上下文验证，则该批次将转换为OVM链批次头，然后将其存储在CTC中。</p><p>存储的批次头包含该批次的merkle根，这意味着证明已包含交易是提供针对针对CTC中存储的merkle根进行验证的 merkle证明的简单问题。</p><h2 id="h-sccstate-commitment-chain" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">状态承诺链（SCC：State Commitment Chain）</h2><p>SCC包含状态根列表，在乐观情况下，该列表对应于 针对先前状态在CTC中应用每个交易的结果。如果不是这种情况，则欺诈验证过程将删除无效的状态根，然后删除所有 无效的状态根，以便可以为这些交易提出正确的状态根。</p><p>与CTC相反，SCC没有任何酷炫的数据表示形式。它的目的很简单：给定状态根列表，它会对其进行存储并保存批处理中 包含的中间状态根的merkle根，以供以后通过appendStateBatch用作欺诈证明。</p><p>Sequencer执行3件事：</p><ul><li><p>接收用户提交的交易</p></li><li><p>批量汇总这些交易并将其发布在权威交易链中</p></li><li><p>在状态承诺链中将交易产生的中间状态根发布为状态批。Sequencer执行3件事：</p><ul><li><p>接收用户提交的交易</p></li><li><p>批量汇总这些交易并将其发布在权威交易链中</p></li><li><p>在状态承诺链中将交易产生的中间状态根发布为状态批。</p></li></ul></li></ul><h2 id="h-ovmexecutionmanager" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">OVM核心合约ExecutionManager</h2><p><strong>Goal: A sandboxed environment which guarantees deterministic smart contract execution between L1 and L2.</strong></p><p>Optimism’s solution is the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52">Optimistic Virtual Machine</a>. The OVM is implemented by replacing context-dependent EVM opcodes with their OVM counterparts.</p><p>方案：修改Solidity和Vyper编译器以生成OVM字节码</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">参考</h2>]]></content:encoded>
            <author>5-3@newsletter.paragraph.com (阿5)</author>
        </item>
        <item>
            <title><![CDATA[Renaissance Labs]]></title>
            <link>https://paragraph.com/@5-3/renaissance-labs-2</link>
            <guid>zpreDEgZLfZv9Gss0ueV</guid>
            <pubDate>Fri, 18 Mar 2022 23:41:50 GMT</pubDate>
            <description><![CDATA[第一章 背景实现目标：基于地理位置坐标实现对用户所在区域的零知识监控，即用户无需无需上报个人详细的地理位置信息，即可证明自己在合法的区域。Zk算法：Zk算法基于Groth16实现，该算法目前是公认的在加密领域应用最多的算法，包括著名ZCash，其生成的证据最小，认证时间较快。第二章 开发准备依赖组件：circom 、snarkjs开发环境：Visual Code环境安装安装Node(如果已经安装请跳过)sudo apt update sudo apt install nodejs npm -y node --version 安装Rust(如果已经安装请跳过)sudo apt install curl -y sudo apt install cmake build-essential -y curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh 安装Circom(如果已经安装请跳过)git clone https://github.com/iden3/circom.git cd circom source $HO...]]></description>
            <content:encoded><![CDATA[<h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">第一章 背景</h2><ol><li><p>实现目标：基于地理位置坐标实现对用户所在区域的零知识监控，即用户无需无需上报个人详细的地理位置信息，即可证明自己在合法的区域。</p></li><li><p>Zk算法：Zk算法基于Groth16实现，该算法目前是公认的在加密领域应用最多的算法，包括著名ZCash，其生成的证据最小，认证时间较快。</p></li></ol><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">第二章 开发准备</h2><ol><li><p>依赖组件：circom 、snarkjs</p></li><li><p>开发环境：Visual Code</p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">环境安装</h3><ol><li><p>安装Node(如果已经安装请跳过)</p><pre data-type="codeBlock" text="sudo apt update
sudo apt install nodejs npm -y
node --version
"><code>sudo apt update
sudo apt install nodejs npm <span class="hljs-operator">-</span>y
node <span class="hljs-operator">-</span><span class="hljs-operator">-</span>version
</code></pre></li><li><p>安装Rust(如果已经安装请跳过)</p><pre data-type="codeBlock" text="sudo apt install curl -y
sudo apt install cmake build-essential -y
curl --proto &apos;=https&apos; --tlsv1.2 https://sh.rustup.rs -sSf | sh
"><code>sudo apt install curl <span class="hljs-operator">-</span>y
sudo apt install cmake build<span class="hljs-operator">-</span>essential <span class="hljs-operator">-</span>y
curl <span class="hljs-operator">-</span><span class="hljs-operator">-</span>proto <span class="hljs-string">'=https'</span> <span class="hljs-operator">-</span><span class="hljs-operator">-</span>tlsv1<span class="hljs-number">.2</span> https:<span class="hljs-comment">//sh.rustup.rs -sSf | sh</span>
</code></pre></li><li><p>安装Circom(如果已经安装请跳过)</p><pre data-type="codeBlock" text="git clone https://github.com/iden3/circom.git
cd circom
source $HOME/.cargo/env
cargo build --release
"><code>git <span class="hljs-built_in">clone</span> https://github.com/iden3/circom.git
<span class="hljs-built_in">cd</span> circom
<span class="hljs-built_in">source</span> <span class="hljs-variable">$HOME</span>/.cargo/env
cargo build --release
</code></pre><p>在这一步特别提醒一下，如果用户已经安装了请确保安装了正确的版本，因为之前用户可能通过执行npm install circom命令来安装的，这种方法提示也是安装成功，但是版本和库都不对，此时需要通过执行which circom命令来查看具体安装的位置，然后进入到对应的目录把相关的文件夹全部删除掉，通过执行npm uninstall circom是没有效果的。最后可以通过执行circom --version，如果显示的是类似2.*.*就代表OK了。</p></li><li><p>更新Circom</p><pre data-type="codeBlock" text="cargo install --path circom
circom --help
"><code>cargo install <span class="hljs-operator">-</span><span class="hljs-operator">-</span>path circom
circom <span class="hljs-operator">-</span><span class="hljs-operator">-</span>help
</code></pre></li><li><p>安装Snarkjs(如果已经安装请跳过)</p><pre data-type="codeBlock" text="sudo npm install -g snarkjs
"><code>sudo npm install <span class="hljs-operator">-</span>g snarkjs
</code></pre><p>如果执行到此处都没有错误的话，那么就是安装环境OK了。</p></li></ol><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">第三章 计算和证明</h2><h3 id="h-1" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">1. 设计电路</h3><p>在VS code中新建文件InRange.circom，编写如下电路代码</p><pre data-type="codeBlock" text="   
template Main() {
    signal input latitudeRange[2];
    signal input longitudeRange[2];
   
    signal input fishingLocation[2];
   
    signal output out;
   
    component gt1 = GreaterEqThan(9);
    gt1.in[0] &lt;== fishingLocation[0];
    gt1.in[1] &lt;== latitudeRange[0];
    gt1.out === 1;
}
   
template GreaterEqThan(n) {
    signal input in[2];
    signal output out;
   
    component lt = LessThan(n);
   
    lt.in[0] &lt;== in[1];
    lt.in[1] &lt;== in[0]+1;
    lt.out ==&gt; out;
}
   
template LessThan(n) {
    assert(n &lt;= 252);
    signal input in[2];
    signal output out;
   
    component n2b = Num2Bits(n+1);
   
    n2b.in &lt;== in[0]+ (1&lt;&lt;n) - in[1];
   
    out &lt;== 1-n2b.out[n];
}
   
template Num2Bits(n) {
    signal input in;
    signal output out[n];
    var lc1=0;
   
    var e2=1;
    for (var i = 0; i&lt;n; i++) {
        out[i] &lt;-- (in &gt;&gt; i) &amp; 1;
        out[i] * (out[i] -1 ) === 0;
        lc1 += out[i] * e2;
        e2 = e2+e2;
    }
   
    lc1 === in;
}
   
component main = Main();
"><code>   
template Main() {
    signal input latitudeRange[<span class="hljs-number">2</span>];
    signal input longitudeRange[<span class="hljs-number">2</span>];
   
    signal input fishingLocation[<span class="hljs-number">2</span>];
   
    signal output out;
   
    component gt1 <span class="hljs-operator">=</span> GreaterEqThan(<span class="hljs-number">9</span>);
    gt1.in[<span class="hljs-number">0</span>] <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> fishingLocation[<span class="hljs-number">0</span>];
    gt1.in[<span class="hljs-number">1</span>] <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> latitudeRange[<span class="hljs-number">0</span>];
    gt1.out <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
}
   
template GreaterEqThan(n) {
    signal input in[<span class="hljs-number">2</span>];
    signal output out;
   
    component lt <span class="hljs-operator">=</span> LessThan(n);
   
    lt.in[<span class="hljs-number">0</span>] <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> in[<span class="hljs-number">1</span>];
    lt.in[<span class="hljs-number">1</span>] <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> in[<span class="hljs-number">0</span>]<span class="hljs-operator">+</span><span class="hljs-number">1</span>;
    lt.out <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> out;
}
   
template LessThan(n) {
    <span class="hljs-built_in">assert</span>(n <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span> <span class="hljs-number">252</span>);
    signal input in[<span class="hljs-number">2</span>];
    signal output out;
   
    component n2b <span class="hljs-operator">=</span> Num2Bits(n<span class="hljs-operator">+</span><span class="hljs-number">1</span>);
   
    n2b.in <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> in[<span class="hljs-number">0</span>]<span class="hljs-operator">+</span> (<span class="hljs-number">1</span><span class="hljs-operator">&#x3C;</span><span class="hljs-operator">&#x3C;</span>n) <span class="hljs-operator">-</span> in[<span class="hljs-number">1</span>];
   
    out <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">1</span><span class="hljs-operator">-</span>n2b.out[n];
}
   
template Num2Bits(n) {
    signal input in;
    signal output out[n];
    <span class="hljs-keyword">var</span> lc1<span class="hljs-operator">=</span><span class="hljs-number">0</span>;
   
    <span class="hljs-keyword">var</span> e2<span class="hljs-operator">=</span><span class="hljs-number">1</span>;
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i<span class="hljs-operator">&#x3C;</span>n; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
        out[i] <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span> (in <span class="hljs-operator">></span><span class="hljs-operator">></span> i) <span class="hljs-operator">&#x26;</span> <span class="hljs-number">1</span>;
        out[i] <span class="hljs-operator">*</span> (out[i] <span class="hljs-number">-1</span> ) <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">0</span>;
        lc1 <span class="hljs-operator">+</span><span class="hljs-operator">=</span> out[i] <span class="hljs-operator">*</span> e2;
        e2 <span class="hljs-operator">=</span> e2<span class="hljs-operator">+</span>e2;
    }
   
    lc1 <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> in;
}
   
component main <span class="hljs-operator">=</span> Main();
</code></pre><h3 id="h-2" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">2. 编译电路</h3><p>执行如下命令进行编译</p><pre data-type="codeBlock" text="circom InRange.circom --r1cs --wasm --sym
"><code>circom InRange.circom <span class="hljs-operator">-</span><span class="hljs-operator">-</span>r1cs <span class="hljs-operator">-</span><span class="hljs-operator">-</span>wasm <span class="hljs-operator">-</span><span class="hljs-operator">-</span>sym
</code></pre><blockquote><p>With these options we generate three types of files:</p><p><code>--r1cs</code>: it generates the file <code>multiplier2.r1cs</code> that contains the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.circom.io/background/background#rank-1-constraint-system">R1CS constraint system</a> of the circuit in binary format.</p><p><code>--wasm</code>: it generates the directory <code>multiplier2_js</code> that contains the <code>Wasm</code> code (multiplier2.wasm) and other files needed to generate the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.circom.io/background/background#witness">witness</a>.</p><p><code>--sym</code> : it generates the file <code>multiplier2.sym</code> , a symbols file required for debugging or for printing the constraint system in an annotated mode.</p><p><code>--c</code> : it generates the directory <code>multiplier2_cpp</code> that contains several files (multiplier2.cpp, multiplier2.dat, and other common files for every compiled program like main.cpp, MakeFile, etc) needed to compile the C code to generate the witness.</p></blockquote></li><li><p>执行成功后，会生成如下截图的文件1：</p></li></ol><p>3月3日Cosmos EVM网络Evmos宣布主网正式上线。作为连接EVM和Cosmos两大生态系统的项目，Evmos颇受加密社区关注。金色财经带你看懂Evmos。</p><h2 id="h-evmos" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">EVMOS由来</h2><p>EVMOS一词来自是EVM和CosmOS。 这个名字清楚地表明了EVMOS的使命，成为链接Cosmos生态系统的EVM Hub。</p><p>简而言之，Evmos能够将EVM兼容链（不仅仅是以太坊）集成到Cosmos。这意味着Fantom、Avalanche和Harmony等公链可以通过Evmo将资产整合到Cosmos生态系统中，也意味着基于EVM的去中心化应用程序、代币和NFT都可以桥接到Cosmos。</p><p>本人手工制，引用请注明出处。</p><p>❶ A端先将自己的公钥Public Key提供给B端。\</p><p> ❷ A端将运算出的讯息摘要，透过自己的私钥Private Key，执行签章运算Sign( )，产生了数字签名Signature。\ ❸ A端将讯息与数字签名一同传送给B端。(上图省略了讯息的传输示意) \ ❹ B端利用收到的数字签名与A端公钥，解密出讯息摘要。</p><p>本文将为您详细解读 ZKS Token 的分发机制，带您了解 ZKS Token 是如何帮助 ZKSwap 启动生态并发挥重要作用的。</p><p>原文标题：ZKSwap 经济白皮书</p><p>项目背景\</p><p> ZKSwap 是首个基于 ZK-Rollups 技术的 Layer2 自动做市商模型去中心化交易所, 目前在以太坊 Layer2 上面完整实现了免信任并且免费的 Layer2 支付和转账（ZKPay），以及Layer2 上免费的、极速的、可以无限扩容的 Swap 交易体验（ZKSwap）。</p><p>在 ZKPay 中, 我们提供一套完整的 Layer2 解决方案，可以支持所有的 ERC20 的免费、实时、最终 TPS 超过 2000 的转账体验，后续计划重点支持所有的稳定币，使用 ZKPay 的转账服务。</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">故事</h2><blockquote><p>美国登山运动有句行话 fourteener，指海拔 14000 英尺以上的山峰。全美 96 座，科罗拉多州最多，有 58 座。所有高阶的登山者对科罗拉多州有一种向往。ETHDenver 的象征虚拟神兽 Bufficorn，就是生活在 14ers 上，与 Unicorn 是堂表亲关系。Peeking Bufficorn，勇于攀登，又与社区、开发者更近。</p></blockquote><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">背景</h2><p>为期10 天的ETHDenver 2022 正式落幕。在这里，多名黑客松参与者组成的超过170 个团队角逐30 强， 以获得总计100 万美元的赏金和奖金、200 万美元的投资资本以及额外100 万枚SPORK 零知识二次方奖金矿池，当然，也是为了共同建设以太坊和多链生态。</p><p>从NFT到GameFi，再到Loot，在市场热潮的几番更迭下，市场对于Layer 2的需求已经逐渐加大，随着Arbitrum主网的上线，越来越多的资金开始投身于Layer2 扩容协议市场，市场又掀起了新一轮的赛道竞争。</p><p>        虽然现阶段的Layer 2网络总锁仓量屡创新高，但仍然无法满足目前市场上投资者的需求，而且，现在市场Layer 2热度都是基于Zksync ,Arbitrum、Opitimism等项目的炒热而升温，根本无法长期持续。基于此，<strong>Layer 2</strong>热潮是否会成为“昙花一现”也成为了大众比较关注的事情。那么Layer 2技术目前发展如何？Layer 2网络的未来究竟是怎样的？而这一个个的疑问，路印协议CTO Steve Guo在一次演讲中给了我们答案。</p><p>        笔者用简单的方式讲述了Layer 2技术的演进，深入分析了每个Layer 2项目的优缺点，并且向我们叙述了Layer 2网络未来的发展方向。以下内容来自Steve的演讲实录。</p><p>           随着Layer 2热度的高涨，一个疑问逐渐浮现在大众面前：Layer 2的真正未来到底是什么？</p><h2 id="h-overflow" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Overflow</h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://so.csdn.net/so/search?q=Solidity&amp;spm=1001.2101.3001.7020">Solidity</a> 可以处理 256 位数字, 最高为 2^256 - 1, 所以对 (2^256 - 1) 加 1 会导致归 0。同理, 对 unsigned 类型 0 做减 1 运算会得到 (2**256 - 1)</p><pre data-type="codeBlock" text="pragma solidity 0.4.18;
contract OverflowUnderflow {
    uint public zero = 0;
    uint public max = 2^256 - 1;
    // zero will end up at  2^256 - 1
    function underflow() public {
        zero -= 1;
    }
    function overflow() public {
        max += 1;
    }
}
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> 0.4.18;</span>
<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">OverflowUnderflow</span> </span>{
    <span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> zero <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;
    <span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> max <span class="hljs-operator">=</span> <span class="hljs-number">2</span><span class="hljs-operator">^</span><span class="hljs-number">256</span> <span class="hljs-operator">-</span> <span class="hljs-number">1</span>;
    <span class="hljs-comment">// zero will end up at  2^256 - 1</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">underflow</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        zero <span class="hljs-operator">-</span><span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
    }
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">overflow</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        max <span class="hljs-operator">+</span><span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
    }
}
</code></pre><blockquote><p>DAS 之于加密世界，应如手机号/Email 之于互联网。</p></blockquote><h2 id="h-1" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">1. 背景</h2><p>伴随比特币的出现，人类第一次真正意义上实现了私人财产不可侵犯。更深层次的，它启发了人们开始以去中心化的视角重新审核和着手重构这个世界。既然我们的货币可以彻底掌握在我们自己的手中，那我们的数据是不是也可以，我们的身份是不是也可以？答案是肯定的。</p><p>去中心化身份是 Web3.0 的关键组成部分。已有不少团队在尝试构建去中心化身份，但这些尝试仍存在诸多的问题。这些尝试包括：</p><h2 id="h-version-claim" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Version claim</h2><blockquote><p>合约文件开头需要声明编译器的版本号，目的是为了该合约在未来版本的升级中引入了不兼容的编译器，其语法为：</p></blockquote><pre data-type="codeBlock" text="pragma solidity 版本号
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> 版本号
</span></code></pre><blockquote><p>版本号应该遵循“0.x.0”或者“x.0.0”的形式，比如：</p></blockquote><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">一、投注合约</h2><p>主要功能点：1）投注；2）开奖；3）退奖；4）获取奖池奖金；5）返回当前期数；6）返回中奖者地址；7）返回参与彩民的地址；</p><h2 id="h-11" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">1.1 定义合约属性</h2><p>合约主要包含有四个属性：</p><h2 id="h-1-create-contract-instance" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">1. create contract instance</h2><p>创建合约的语法:</p><pre data-type="codeBlock" text="new 合约名();

示例：
contract A {}
contract B {
    function test() public { 
        A a = new A();
    }
}
"><code><span class="hljs-keyword">new</span> 合约名();

示例：
<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">A</span> </span>{}
<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">B</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{ 
        A a <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> A();
    }
}
</code></pre><p>创建合约实例的时候，默认会调用构造函数，并执行构造函数中的代码。如果没有定义构造函数，EVM编译器会自动生成一个默认的构造函数。如果构造函数指定了参数，那么创建合约实例时候需要传入相同数量的实参。</p><h2 id="h-function-define" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">function define</h2><blockquote><p>函数入参和出参类型不能够使用var关键字。另外，函数可以返回多个值。</p><p>如果参数没有被使用，那么可以省略参数名。但是这些参数仍然存在堆栈中，只是无法访问而已。</p></blockquote><pre data-type="codeBlock" text="function 函数名(参数类型 参数名, ...) 修饰符 [returns(返回类型, ...)] {
    函数体
}

示例：
function sum(int a, int b) public pure returns(int) {
   return a + b;
}

function test1(int a, int b) public pure returns(int, int) {
   return (a, b);
}

function test2(int a, int b) public pure returns(int x, int y) {
   x = a;
   y = b;
}
function test(int a, int) public pure returns(int) {
  return a;
}
"><code><span class="hljs-function"><span class="hljs-keyword">function</span> 函数名(<span class="hljs-params">参数类型 参数名, ...</span>) 修饰符 [<span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params">返回类型, ...</span>)] </span>{
    函数体
}

示例：
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sum</span>(<span class="hljs-params"><span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">int</span></span>) </span>{
   <span class="hljs-keyword">return</span> a <span class="hljs-operator">+</span> b;
}

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test1</span>(<span class="hljs-params"><span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">int</span>, <span class="hljs-keyword">int</span></span>) </span>{
   <span class="hljs-keyword">return</span> (a, b);
}

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test2</span>(<span class="hljs-params"><span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y</span>) </span>{
   x <span class="hljs-operator">=</span> a;
   y <span class="hljs-operator">=</span> b;
}
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test</span>(<span class="hljs-params"><span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">int</span></span>) </span>{
  <span class="hljs-keyword">return</span> a;
}
</code></pre><blockquote><p>函数声明使用<code>pure</code>，代表该函数不能读取或修改状态变量，也不能发送和接收以太币，只能调用其他<code>pure</code>函数</p><p>除了<code>pure</code>以外，还可以使用<code>view</code>来修饰函数，这时候该函数只能够读取状态变量，而不能修改状态变量，也不能发送或接收以太币，只能调用其他<code>pure</code>或<code>view</code>函数。</p></blockquote><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/95401af71cd7e0f04046e8f97154293a17ef6955db01185a92eed4731bbf2896.png" alt="ART" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">ART</figcaption></figure><p>ART</p><p>主要是通过代码中memory来大幅度减少gas使用，示例代码如下：</p><pre data-type="codeBlock" text="pragma solidity ^0.5.10;

contract Test{
    
    struct User{
        uint age;
        uint balance;
        uint num;
    }
    
    User user;
    
    function initUser() public{
        user = User({age:20,balance:1000,num:1});
    }
    
    function setUser1() public {
        user.age = 30;
        user.balance = 20000;
        user.num = 2;
    }
    
    function setUser2() public {
        User memory temp = user;
        temp.age = 40;
        temp.age = 20001;
        user.num = 3;
        user = temp;
    }
}
pragma solidity ^0.5.10;

contract Test{
    
    struct User{
        uint age;
        uint balance;
        uint num;
    }
    
    User user;
    
    function initUser() public{
        user = User({age:20,balance:1000,num:1});
    }
    
    function setUser1() public {
        user.age = 30;
        user.balance = 20000;
        user.num = 2;
    }
    
    function setUser2() public {
        User memory temp = user;
        temp.age = 40;
        temp.age = 20001;
        user.num = 3;
        user = temp;
    }
}
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.5.10;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Test</span></span>{
    
    <span class="hljs-keyword">struct</span> <span class="hljs-title">User</span>{
        <span class="hljs-keyword">uint</span> age;
        <span class="hljs-keyword">uint</span> balance;
        <span class="hljs-keyword">uint</span> num;
    }
    
    User user;
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">initUser</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span></span>{
        user <span class="hljs-operator">=</span> User({age:<span class="hljs-number">20</span>,balance:<span class="hljs-number">1000</span>,num:<span class="hljs-number">1</span>});
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setUser1</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        user.age <span class="hljs-operator">=</span> <span class="hljs-number">30</span>;
        user.<span class="hljs-built_in">balance</span> <span class="hljs-operator">=</span> <span class="hljs-number">20000</span>;
        user.num <span class="hljs-operator">=</span> <span class="hljs-number">2</span>;
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setUser2</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        User <span class="hljs-keyword">memory</span> temp <span class="hljs-operator">=</span> user;
        temp.age <span class="hljs-operator">=</span> <span class="hljs-number">40</span>;
        temp.age <span class="hljs-operator">=</span> <span class="hljs-number">20001</span>;
        user.num <span class="hljs-operator">=</span> <span class="hljs-number">3</span>;
        user <span class="hljs-operator">=</span> temp;
    }
}
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.5.10;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Test</span></span>{
    
    <span class="hljs-keyword">struct</span> <span class="hljs-title">User</span>{
        <span class="hljs-keyword">uint</span> age;
        <span class="hljs-keyword">uint</span> balance;
        <span class="hljs-keyword">uint</span> num;
    }
    
    User user;
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">initUser</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span></span>{
        user <span class="hljs-operator">=</span> User({age:<span class="hljs-number">20</span>,balance:<span class="hljs-number">1000</span>,num:<span class="hljs-number">1</span>});
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setUser1</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        user.age <span class="hljs-operator">=</span> <span class="hljs-number">30</span>;
        user.<span class="hljs-built_in">balance</span> <span class="hljs-operator">=</span> <span class="hljs-number">20000</span>;
        user.num <span class="hljs-operator">=</span> <span class="hljs-number">2</span>;
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setUser2</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        User <span class="hljs-keyword">memory</span> temp <span class="hljs-operator">=</span> user;
        temp.age <span class="hljs-operator">=</span> <span class="hljs-number">40</span>;
        temp.age <span class="hljs-operator">=</span> <span class="hljs-number">20001</span>;
        user.num <span class="hljs-operator">=</span> <span class="hljs-number">3</span>;
        user <span class="hljs-operator">=</span> temp;
    }
}
</code></pre><p>我们首先通过initUser方法来初始化一个User对象的数据，然后分别调用setUser1和setUser2两个方法。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/a78fbb937d646c36a86febd9820458d734fe6d1296ef305138e5441a5d6f9723.png" alt="Art" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Art</figcaption></figure><p>Art</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">概念</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/557fcb7fa43e968fa3be0ee0628890c004c0504ecc4e5e5f9da255b80c0c89ac.png" alt="概念" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">概念</figcaption></figure><p>概念</p><blockquote><p>Merkle Tree，也被称作<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://so.csdn.net/so/search?q=Hash&amp;spm=1001.2101.3001.7020">Hash</a> Tree，存储hash值的一棵树。Merkle树的叶子是数据块(例如，文件或者文件的集合)的hash值，非叶节点是其对应子节点串联字符串的hash。</p></blockquote><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5063ab4470a352a5058419b578249cc5fb702c8cb832b68a9a07a0e209eda3a4.png" alt="Art" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Art</figcaption></figure><p>Art</p><h2 id="h-bitcoin" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Bitcoin中的数据区块</h2><p>由区块头和区块体2部分组成，如下：</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/bee419c3dac28becce72e8002341ef9ef8d4ec7819171baf99441576c4b853e9.png" alt="区块结构" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">区块结构</figcaption></figure><p>区块结构</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/fff7d2fe1df09cc840322b2293b4e0bb6b42fc9bb03d3a12b1603070e6e6ca08.png" alt="Learn Solidity Series" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Learn Solidity Series</figcaption></figure><p>Learn Solidity Series</p><h2 id="h-delete" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">delete</h2><p>它用于将变量设置为其初始值，这意味着该语句delete a的行为如下：</p><p>对于整数，它等于a = 0。 对于数组，它分配长度为零的动态数组或长度相同的静态数组，并将所有元素设置为其初始值。 delete a[x]删除数组索引x处的项目，并保持所有其他元素和数组长度不变。这尤其意味着它在数组中留有间隙。 对于结构体，它将重置结构体的所有成员。 delete对映射没有影响(因为映射的键可能是任意的，并且通常是未知的)。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c89c66949231ed1978aa157c38f8ebeb44a45b07fa00ac0e49aeb092bf9470b6.png" alt="Learn Solidity Series" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Learn Solidity Series</figcaption></figure><p>Learn Solidity Series</p><h2 id="h-struct" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Struct</h2><blockquote><p>与在C和C ++中一样，结构体允许你定义自己的类型</p></blockquote><p>定义结构体后，就可以开始将其用作状态变量或在函数中使用。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c5b855393055dde7486bb9f6dae8f17adcb798ba1d0184de400c6948143bb6d9.png" alt="Learn Solidity Series" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Learn Solidity Series</figcaption></figure><p>Learn Solidity Series</p><blockquote><p>Solidity中，有两种类型的数组：存储数组和内存数组。</p></blockquote><h2 id="h-storage-arrays" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">存储数组(Storage Arrays)</h2><blockquote><p>这些数组被声明为状态变量，并且可以具有固定长度或动态长度。动态存储数组可以调整数组的大小，它们通过访问<code>push()</code>和<code>pop()</code>方法来调节长度。</p></blockquote><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/520e605d924d553f81b21c43fa3af8a79fc8871ed1e10759c5042db4642aef84.png" alt="Learn Solidity Series" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Learn Solidity Series</figcaption></figure><p>Learn Solidity Series</p><h2 id="h-before-solidity-0422" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Before Solidity 0.4.22</h2><p>默认构造方法与Java类似，如果未指定会采用默认的构造方法。当然，也可以明确指定构造方法。通过function指定了Solidity的构造方法，同时也可以像Java一样，给构造方法指定参数，但无法像Java那样创建多个重载的构造方法。</p><pre data-type="codeBlock" text="pragma solidity ^0.4.21;

contract DemoTest{

    function DemoTest() public{

    }
}
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.4.21;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">DemoTest</span></span>{

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">DemoTest</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span></span>{

    }
}
</code></pre><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b579a47723b368f62110ca4e3442142720bd232ee9e396b07ea5ec370262301a.png" alt="Solidity Series" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Solidity Series</figcaption></figure><p>Solidity Series</p><blockquote><p>在Solidity中一个<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://so.csdn.net/so/search?q=%E5%87%BD%E6%95%B0&amp;spm=1001.2101.3001.7020">函数</a>方法是可以返回多个结果的</p></blockquote><pre data-type="codeBlock" text="pragma solidity ^0.5.10;

contract ManyReturns{

    // 基础方法：返回多个参数，用于被调用
    function getThreeNum() public returns(uint one,uint two, uint three){
        uint one = 1;
        uint two = 2;
        uint three = 3;
        return(one,two,three);
    }

    // 场景一：接收全部参数
    function call() public {
        uint one;
        uint two;
        uint three;
        // 接收结果的变量必须实现定义完成
        (one,two,three) = getThreeNum();
    }

    // 场景二：接收部分参数
    function call1() public{
        uint one;
        uint two;
        // 定义部分参数进行接收，未接收的参数，直接用逗号&quot;,&quot;分割即可。
        (one,two,) = getThreeNum();
    }
}
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.5.10;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">ManyReturns</span></span>{

    <span class="hljs-comment">// 基础方法：返回多个参数，用于被调用</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getThreeNum</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> one,<span class="hljs-keyword">uint</span> two, <span class="hljs-keyword">uint</span> three</span>)</span>{
        <span class="hljs-keyword">uint</span> one <span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
        <span class="hljs-keyword">uint</span> two <span class="hljs-operator">=</span> <span class="hljs-number">2</span>;
        <span class="hljs-keyword">uint</span> three <span class="hljs-operator">=</span> <span class="hljs-number">3</span>;
        <span class="hljs-keyword">return</span>(one,two,three);
    }

    <span class="hljs-comment">// 场景一：接收全部参数</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">call</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-keyword">uint</span> one;
        <span class="hljs-keyword">uint</span> two;
        <span class="hljs-keyword">uint</span> three;
        <span class="hljs-comment">// 接收结果的变量必须实现定义完成</span>
        (one,two,three) <span class="hljs-operator">=</span> getThreeNum();
    }

    <span class="hljs-comment">// 场景二：接收部分参数</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">call1</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span></span>{
        <span class="hljs-keyword">uint</span> one;
        <span class="hljs-keyword">uint</span> two;
        <span class="hljs-comment">// 定义部分参数进行接收，未接收的参数，直接用逗号","分割即可。</span>
        (one,two,) <span class="hljs-operator">=</span> getThreeNum();
    }
}
</code></pre><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/559fd426e1139b3499c64d1595d23e79ab17e693e06d0a8b023df9ccf3785713.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-what-is-constant" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What is constant ?</h2><blockquote><p>Functions can be declared constant in which case they <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://so.csdn.net/so/search?q=promise&amp;spm=1001.2101.3001.7020">promise</a> not to modify the state.</p></blockquote><p>也就是说当执行函数时不会去修改区块中的数据状态时，那么这个函数就可以被声明成constant的，比如说getter类的方法。</p><h2 id="h-optimism-batch" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Optimism batch提交示例</h2><p>optimistic etherscan 29307 包含<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://optimistic.etherscan.io/txs?batch=29307">72 transactions</a></p><p>etherscan txHash</p><h2 id="h-state-transfer" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">State Transfer</h2><h3 id="h-overview" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Overview</h3><p>Polygon validators continuously monitor a contract on Ethereum chain called <strong><em>StateSender</em></strong>. Each time a registered contract on Ethereum chain calls this contract, it emits an event. Using this event Polygon validators relay the data to another contract on Polygon chain. This <strong><em>StateSync</em></strong> mechanism is used to send data from Ethereum to Polygon.</p><p>Polygon validators also periodically submit a hash of all transactions on Polygon chain to Ethereum chain. This <strong><em>Checkpoint</em></strong> can be used to verify any transaction that happened on Polygon. Once a transaction is verified to have happened on Polygon chain, action can be taked accordingly on Ethereum.</p><p>近来最火的圈内“技术”事件，无疑是Arbitrum的上线。</p><p>原因无他，去年V神便已定调Rollup将会作为ETH当前的主要扩容手段，未来在2.0分片时代也将会和分片一起承担ETH“全球结算层”的历史重任。定调之后，LRC（路印协议）算是第一个实现了Rollup方案的项目，但LRC本质上只是一个应用，并非一个通用型Rollup解决方案。</p><p>刚刚主网上线的Arbitrum，严格意义来说，才是历史上第一个上线了主网的“通用性Rollup Layer2扩容方案”（OP更早上线了测试网，但主网要7、8月份了）。</p><p>这几天在不少社群里看到有人问：“Arbitrum和Matic哪个厉害啊？不都是Layer2 么？Arbitrum和后面的Optimism以及Zk-Sync哪个厉害呀？不都是Rollup吗？”</p><h2 id="h-transactions" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Transactions</h2><h2 id="h-fact-sheet" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Fact Sheet</h2><ul><li><p>Instructions are the most basic operational unit on Solana</p></li><li><p>Each instruction contains:</p><ul><li><p>The <code>program_id</code> of the intended program</p></li><li><p>An array of all <code>accounts</code> it intends to read from or write to</p></li><li><p>An <code>instruction_data</code> byte array that is specific to the intended program</p></li></ul></li><li><p>Multiple instructions can be bundled into a single transaction</p></li><li><p>Each transaction contains:</p><ul><li><p>An array of all <code>accounts</code> it intends to read from or write to</p></li><li><p>One or more <code>instructions</code></p></li><li><p>A recent <code>blockhash</code></p></li><li><p>One or more <code>signatures</code></p></li></ul></li><li><p>Instructions are processed in order and atomically</p></li><li><p>If any part of an instruction fails, the entire transaction fails.</p></li><li><p>Transactions are limited to 1232 bytes</p></li></ul><p><strong>什么是分片（Sharding）</strong></p><p>分片技术并不是什么创新的概念，早在区块链技术出现之前，就已经在传统数据库中运作了，主要用于大型商业数据库的优化。</p><p>其概念就是<strong>将数据库中的数据，切割成很多数据分片</strong>，再将这些分片分配到不同的伺服器中储存，如此一来，就不会因为短时间内出现大量数据访问请求，而出现单一伺服器压力过大的问题。</p><p>在传统的区块链网络中，交易必须有网络中的每个节点进行确认，以保证交易的安全，然而这也是导致交易速度难以提升的主因之一。</p><p><strong>DeFi 的出现凸显了区块链技术的真正能力，并展示了其在金融领域的实用性。随着 DeFi 的增长迅猛，越来越多的组织和项目利用其功能，高度安全和去中心化的信息源也大量增加。</strong></p><p>这就是预言机出现的地方——随着 DeFi 的发展，它们的用例变得比以往任何时候都更加重要和相关。</p><p><strong>究竟什么是预言机？</strong></p><p>预言机可以定义为第三方服务，它利用区块链上的智能合约从链下世界检索任何所需的信息或从外部来源检索数据。</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">前言</h2><p>匿名性一直被视为 加密货币 社区的非常有价值的特征之一。它是可替代性的前身，该特性对于广泛使用的货币形式来说也是必要的。同样，大多数加密资产持有者不希望他们的资产和交易记录被完全公开。在所有在为区块链提供隐私性的各种加密技术中，zk-SNARK 和 zk-STARK 是两个值得注意的例子。</p><p>zk-SNARK 代表了简洁化的非交互式零知识证明，而 zk-STARK 代表了简洁化的全透明零知识证明。 Zk-SNARK 已经在基于区块链的支付系统上如 Zcash，JP Morgan Chase 项目中使用，并作为一种客户端到服务器的安全验证方式。但是，虽然 zk-SNARKs 已经很成熟并被很广泛的使用，但 zk-STARK 现在也被吹捧为该协议的新版本和改进版本，旨在解决 zk-SNARKs 先前的许多缺点。</p><p>从历史角度而言，以太坊的 Gas 费用曾三次飙升至天文数字的高度：2017 年的牛市期间、2020 年的 DeFi 之夏以及 2021 年的 NFT 之夏。如下图所示：</p><p>上图：2015年至2021年11月的以太坊网络 Gas 费用上涨情况。</p><p>每次 Gas 费再次飙升时，围绕以太坊区块链可扩展性的讨论就会再次燃起，与此同时更多人则争先恐后地寻找下一个与之竞争的区块链网络。实际上，高涨的 Gas 费用只是我们必须应对的冰山一角。当前 Gas 费用如此之高的原因是因为以太坊无法扩展，也即对交易的需求仍然比以太坊区块链每次实际能够处理的更多。</p><p>在当前区块链世界中，主要有两种记录保存方式，UTXO 模式（Unspent Transaction Output) 和 Account 模式。<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://so.csdn.net/so/search?q=Bitcoin&amp;spm=1001.2101.3001.7020">Bitcoin</a> 采用的是 UTXO 模型，Ethereum 采用的 Account 模型，同样 CITA 也采用了 Account 模型。</p><p>Bitcoin 的设计初衷是点对点的电子现金系统，在比特币中，每个交易消耗之前交易生成的 UTXO 然后生成新的 UTXO，账户的余额即所有属于该地址的未花费 UTXO 集合，Bitcoin 的全局状态即当前所有未花费的 UTXO 集合。Ethereum 意图创建一个更为通用的协议，该协议支持图灵完备的编程语言，在此协议上用户可以编写智能合约，创建各种去中心化的应用。由于 UTXO 模型在状态保存以及可编程性方面的缺陷，Ethereum 引入了 Account 模型。下面我们对两种模型的优缺点做进一步展开。</p><h2 id="h-utxo" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">UTXO 模型</h2><p>UTXO 模型中，交易只是代表了 UTXO 集合的变更。而账户和余额的概念是在 UTXO 集合上更高的抽象，账号和余额的概念只存在于钱包中。</p><p>跨链通信是一个跨链的技术，它和 Plasma 不一样，两条链之间没有特别强的主次关系，其子链和侧链仍然有权利自己产生资产，自己运行，然后通过某种协议和主链或者其他链进行跨链交互，大家进行数据互通。</p><p>它严格来说不是 <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://so.csdn.net/so/search?q=Layer&amp;spm=1001.2101.3001.7020">Layer</a> 1 的 Layer 2，但是它对整个系统 Scability 的提升是很有好处的。接下来我简单介绍两个项目，方便大家来理解。</p><h3 id="h-cosmos" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Cosmos</h3><p>Cosmos 的系统架构如图所示，它中间有一个 Cosmos Hub，周围的叫做 Zone，可以认为中间是一个交换链，周围其他是子链。Zone 是用 Tendermint 来做的，采用的是 BFT 共识以及区块链框架，它也满足 Instant Finality（即时终结性），如果系统是少于三分之一的作恶节点，它一定是正确的。它引入了链间通讯协议（ Inter-Blockchain Communication ，简称 IBC） ，这个是类似 Plasma 和 State Channel 的一个协议。</p><h3 id="h-tvl" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">查看TVL工具</h3><ul><li><p>TVL 追踪工具</p><ul><li><p>ETH：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=https%3A//defipulse.com/">DeFi Pulse</a></p></li><li><p>BSC：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=https%3A//www.defistation.io/">DeFi Station</a></p></li></ul></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=https%3A//zapper.fi/dashboard">Zapper</a>：DeFi 资产追踪工具，支持 ETH、BSC、Polygon、Fantom</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=https%3A//app.zerion.io/">Zerion</a>：ETH 和 BSC 资产追踪工具，可以清晰看到 ETH 上的资产分布（自己或别人），设置交易提醒。（ V神的 <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=https%3A//bit.ly/3oGsy2l">ETH 钱包</a>）</p></li></ul><h2 id="h-off-chain-computation" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">链下计算（ Off Chain Computation ）</h2><p>以太坊声称要做计算机，EOS 要做全球操作系统，但无论是做计算机还是做操作系统都得正视计算这个问题，链上计算的开销是非常大的，链上每一个 EVM 的 Code 计算需要全球计算机都算一遍，才能得出结果，所以有人做了这么一个计算的扩展，在链外做 Computation。</p><p>这个方式大致有两种</p><h2 id="h-research-institute" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Research Institute</h2><h3 id="h-state-channel" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">状态通道 State Channel</h3><p>我们先来谈谈状态通道，举一个例子方便大家理解。</p><p>Alice 和 Bob 一起玩一个划拳游戏。Alice 赢了可以从 Bob 那里得到 1 块钱，而如果 Alice 输了需要给 Bob 1 块钱，反之亦然。</p><p>如果这个游戏是在以太坊主链上运行，我们通常的方法是 Alice 和 Bob 一起创建一个智能合约，每当划拳游戏开始的时候，他们向智能合约发起一个交易，当其中一个玩家赢了的时候，智能合约会执行规则付给赢家 1 块钱。</p><p>在上一篇文章中，我们介绍了解决扩展性问题的第一个 Layer2  解决方案，即状态通道。接下来，本篇将会为大家揭开另一个称为 Plasma 的链下交易技术，而该技术则是由 Vitalik Buterin 和 Joseph Poon 在 2017 年，含金量十足。</p><h2 id="h-plasma" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Plasma</h2><p>Plasma 是一个链下交易的技术，由 Vitalik Buterin 和 Joseph Poon 在 2017 年提出，它相当于贡献了一条子链，可以让你在主链上质押资产，然后在子链上产生资产，而且它提供一个服务器，不需要点对点的交互，在服务器上就可以进行交互。</p><p>Plasma 子链可以更快地操作，且交易费用更低，因为它的操作不需要在整个以太坊区块链存留副本</p><p>Layer2是个大的话题。是否去中心化，是否安全，资金状态确认时间是Layer2的主要的讨论话题。最近有点时间，总结一下Layer2的理解和思考。</p><h2 id="h-layer2" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Layer2交互模型</h2><p>Layer2，相对于Layer1，在Layer1的基础上提供更丰富功能，更好的用户体验。抽象一下Layer2的逻辑以及交互模型如下：</p><h2 id="h-0" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">0.账户 交易 消息</h2><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">账户</h3><p>以太坊账户与我们所知的账户概念有一定相似之处，却又有很大的区别，更不同于比特币中UTXO。 账户分两类：</p><ul><li><p>外部拥有账户(EOA)，也就是普通账户</p></li><li><p>合约账户</p></li></ul><p>unitimes.io</p><p><strong>全球视角，独到见解</strong></p><p>预计将于2019年1月16日进行的以太坊君士坦丁堡硬分叉(当区块高度到达7,080,000时)，即将对以太坊网络带来怎样的升级呢？我们一起来了解一下。</p><p>提醒一下：如果你只是一名普通的ETH持有者，你不需要对这次升级做任何准备。</p><p>imToken 服务协议</p><p>最近更新于：2021年10月14日</p><p>imToken Pte. Ltd.（“我们”、或“我们的”）是一家领先的区块链软件开发公司，专注于利用去中心化技术为像您这样的个人（“您”或“您的”）提供可信的数字资产管理服务。我们托管一个顶级域名站：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://token.im/">https://token.im</a>，该网站提供有关imToken和我们的产品的信息，以及我们产品的子域（“网站”）信息，其中包括文本、图像、音频、代码和其他材料或第三方信息。</p><p>由于越来越多的诈骗者想方设法欺骗毫无戒心的受害者的数字资产，请您在每次访问我们的域名站时验证SSL证书。本《服务协议》（定义如下）仅适用于由Encryption Everywhere DV TLS CA发布的具备有效SSL证书的域名站：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://token.im/">https://token.im</a>。在从您正在访问的网站下载、点击或以其他方式与之交互之前，请确保SSL证书的真实性。为免疑义，我们无法控制任何第三方网站或服务的内容、隐私政策或行为，也不对其承担任何责任。对于因使用或依赖任何此类网站或服务上或通过此类网站或服务提供的任何此类内容、商品或服务而造成或声称造成的任何损害或损失，我们概不负责或承担任何直接或间接责任。</p><h3 id="h-11-dao" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">1.1 DAO</h3><h4 id="h-111-dao" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">1.1.1 DAO定义</h4><blockquote><p>DAO 即 Decentralized Autonomous Corporations，中文为去中心化的自治组织，是一个以公开透明的计算机代码来体现的组织，其受控于组织成员，并不受集中控制或第三方干预，一个分布式自治组织的金融交易记录和程序规则是保存在区块链中的。</p></blockquote><p>Web3的核心是去中心化和用户拥有信息，因此所有的创业投资机会将围绕着这两点。</p><p>互联网经过40年的发展逐渐进入了一个新时代，一方面消费互联网由于巨头垄断停滞发展；另一方面，企业互联网的发展在过去10年取得突飞猛进的进展，SaaS成为最亮眼的股票。</p><p>从2010年起，消费互联网的巨头进入收割期，各大巨头的垄断利润暴涨，占据了市值前10名的90%。另一方面，在创新领域，却再也没有巨头产生。虽然在中国，由于巨头的反应迟钝，给了移动互联网的巨头字节跳动和美团机会。但是整体上，全球范围内消费互联网进入一个停滞状态毫无争议。</p><p>大家经常讲创新总是发生在边缘，正如互联网诞生于70年代，万维网诞生于90年代，最初的互联网只是由几个大学的节点组成，经过40年的发展，在没有任何人能够预测到的情况下，发展出来改变世界的各种应用。</p>]]></content:encoded>
            <author>5-3@newsletter.paragraph.com (阿5)</author>
        </item>
        <item>
            <title><![CDATA[Renaissance Labs]]></title>
            <link>https://paragraph.com/@5-3/renaissance-labs</link>
            <guid>OX4KECQgQzfuKkkf7MBt</guid>
            <pubDate>Fri, 18 Mar 2022 23:41:24 GMT</pubDate>
            <description><![CDATA[第一章 背景实现目标：基于地理位置坐标实现对用户所在区域的零知识监控，即用户无需无需上报个人详细的地理位置信息，即可证明自己在合法的区域。Zk算法：Zk算法基于Groth16实现，该算法目前是公认的在加密领域应用最多的算法，包括著名ZCash，其生成的证据最小，认证时间较快。第二章 开发准备依赖组件：circom 、snarkjs开发环境：Visual Code环境安装安装Node(如果已经安装请跳过)sudo apt update sudo apt install nodejs npm -y node --version 安装Rust(如果已经安装请跳过)sudo apt install curl -y sudo apt install cmake build-essential -y curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh 安装Circom(如果已经安装请跳过)git clone https://github.com/iden3/circom.git cd circom source $HO...]]></description>
            <content:encoded><![CDATA[<h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">第一章 背景</h2><ol><li><p>实现目标：基于地理位置坐标实现对用户所在区域的零知识监控，即用户无需无需上报个人详细的地理位置信息，即可证明自己在合法的区域。</p></li><li><p>Zk算法：Zk算法基于Groth16实现，该算法目前是公认的在加密领域应用最多的算法，包括著名ZCash，其生成的证据最小，认证时间较快。</p></li></ol><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">第二章 开发准备</h2><ol><li><p>依赖组件：circom 、snarkjs</p></li><li><p>开发环境：Visual Code</p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">环境安装</h3><ol><li><p>安装Node(如果已经安装请跳过)</p><pre data-type="codeBlock" text="sudo apt update
sudo apt install nodejs npm -y
node --version
"><code>sudo apt update
sudo apt install nodejs npm <span class="hljs-operator">-</span>y
node <span class="hljs-operator">-</span><span class="hljs-operator">-</span>version
</code></pre></li><li><p>安装Rust(如果已经安装请跳过)</p><pre data-type="codeBlock" text="sudo apt install curl -y
sudo apt install cmake build-essential -y
curl --proto &apos;=https&apos; --tlsv1.2 https://sh.rustup.rs -sSf | sh
"><code>sudo apt install curl <span class="hljs-operator">-</span>y
sudo apt install cmake build<span class="hljs-operator">-</span>essential <span class="hljs-operator">-</span>y
curl <span class="hljs-operator">-</span><span class="hljs-operator">-</span>proto <span class="hljs-string">'=https'</span> <span class="hljs-operator">-</span><span class="hljs-operator">-</span>tlsv1<span class="hljs-number">.2</span> https:<span class="hljs-comment">//sh.rustup.rs -sSf | sh</span>
</code></pre></li><li><p>安装Circom(如果已经安装请跳过)</p><pre data-type="codeBlock" text="git clone https://github.com/iden3/circom.git
cd circom
source $HOME/.cargo/env
cargo build --release
"><code>git <span class="hljs-built_in">clone</span> https://github.com/iden3/circom.git
<span class="hljs-built_in">cd</span> circom
<span class="hljs-built_in">source</span> <span class="hljs-variable">$HOME</span>/.cargo/env
cargo build --release
</code></pre><p>在这一步特别提醒一下，如果用户已经安装了请确保安装了正确的版本，因为之前用户可能通过执行npm install circom命令来安装的，这种方法提示也是安装成功，但是版本和库都不对，此时需要通过执行which circom命令来查看具体安装的位置，然后进入到对应的目录把相关的文件夹全部删除掉，通过执行npm uninstall circom是没有效果的。最后可以通过执行circom --version，如果显示的是类似2.*.*就代表OK了。</p></li><li><p>更新Circom</p><pre data-type="codeBlock" text="cargo install --path circom
circom --help
"><code>cargo install <span class="hljs-operator">-</span><span class="hljs-operator">-</span>path circom
circom <span class="hljs-operator">-</span><span class="hljs-operator">-</span>help
</code></pre></li><li><p>安装Snarkjs(如果已经安装请跳过)</p><pre data-type="codeBlock" text="sudo npm install -g snarkjs
"><code>sudo npm install <span class="hljs-operator">-</span>g snarkjs
</code></pre><p>如果执行到此处都没有错误的话，那么就是安装环境OK了。</p></li></ol><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">第三章 计算和证明</h2><h3 id="h-1" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">1. 设计电路</h3><p>在VS code中新建文件InRange.circom，编写如下电路代码</p><pre data-type="codeBlock" text="   
template Main() {
    signal input latitudeRange[2];
    signal input longitudeRange[2];
   
    signal input fishingLocation[2];
   
    signal output out;
   
    component gt1 = GreaterEqThan(9);
    gt1.in[0] &lt;== fishingLocation[0];
    gt1.in[1] &lt;== latitudeRange[0];
    gt1.out === 1;
}
   
template GreaterEqThan(n) {
    signal input in[2];
    signal output out;
   
    component lt = LessThan(n);
   
    lt.in[0] &lt;== in[1];
    lt.in[1] &lt;== in[0]+1;
    lt.out ==&gt; out;
}
   
template LessThan(n) {
    assert(n &lt;= 252);
    signal input in[2];
    signal output out;
   
    component n2b = Num2Bits(n+1);
   
    n2b.in &lt;== in[0]+ (1&lt;&lt;n) - in[1];
   
    out &lt;== 1-n2b.out[n];
}
   
template Num2Bits(n) {
    signal input in;
    signal output out[n];
    var lc1=0;
   
    var e2=1;
    for (var i = 0; i&lt;n; i++) {
        out[i] &lt;-- (in &gt;&gt; i) &amp; 1;
        out[i] * (out[i] -1 ) === 0;
        lc1 += out[i] * e2;
        e2 = e2+e2;
    }
   
    lc1 === in;
}
   
component main = Main();
"><code>   
template Main() {
    signal input latitudeRange[<span class="hljs-number">2</span>];
    signal input longitudeRange[<span class="hljs-number">2</span>];
   
    signal input fishingLocation[<span class="hljs-number">2</span>];
   
    signal output out;
   
    component gt1 <span class="hljs-operator">=</span> GreaterEqThan(<span class="hljs-number">9</span>);
    gt1.in[<span class="hljs-number">0</span>] <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> fishingLocation[<span class="hljs-number">0</span>];
    gt1.in[<span class="hljs-number">1</span>] <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> latitudeRange[<span class="hljs-number">0</span>];
    gt1.out <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
}
   
template GreaterEqThan(n) {
    signal input in[<span class="hljs-number">2</span>];
    signal output out;
   
    component lt <span class="hljs-operator">=</span> LessThan(n);
   
    lt.in[<span class="hljs-number">0</span>] <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> in[<span class="hljs-number">1</span>];
    lt.in[<span class="hljs-number">1</span>] <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> in[<span class="hljs-number">0</span>]<span class="hljs-operator">+</span><span class="hljs-number">1</span>;
    lt.out <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> out;
}
   
template LessThan(n) {
    <span class="hljs-built_in">assert</span>(n <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span> <span class="hljs-number">252</span>);
    signal input in[<span class="hljs-number">2</span>];
    signal output out;
   
    component n2b <span class="hljs-operator">=</span> Num2Bits(n<span class="hljs-operator">+</span><span class="hljs-number">1</span>);
   
    n2b.in <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> in[<span class="hljs-number">0</span>]<span class="hljs-operator">+</span> (<span class="hljs-number">1</span><span class="hljs-operator">&#x3C;</span><span class="hljs-operator">&#x3C;</span>n) <span class="hljs-operator">-</span> in[<span class="hljs-number">1</span>];
   
    out <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">1</span><span class="hljs-operator">-</span>n2b.out[n];
}
   
template Num2Bits(n) {
    signal input in;
    signal output out[n];
    <span class="hljs-keyword">var</span> lc1<span class="hljs-operator">=</span><span class="hljs-number">0</span>;
   
    <span class="hljs-keyword">var</span> e2<span class="hljs-operator">=</span><span class="hljs-number">1</span>;
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i<span class="hljs-operator">&#x3C;</span>n; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
        out[i] <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span> (in <span class="hljs-operator">></span><span class="hljs-operator">></span> i) <span class="hljs-operator">&#x26;</span> <span class="hljs-number">1</span>;
        out[i] <span class="hljs-operator">*</span> (out[i] <span class="hljs-number">-1</span> ) <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">0</span>;
        lc1 <span class="hljs-operator">+</span><span class="hljs-operator">=</span> out[i] <span class="hljs-operator">*</span> e2;
        e2 <span class="hljs-operator">=</span> e2<span class="hljs-operator">+</span>e2;
    }
   
    lc1 <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> in;
}
   
component main <span class="hljs-operator">=</span> Main();
</code></pre><h3 id="h-2" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">2. 编译电路</h3><p>执行如下命令进行编译</p><pre data-type="codeBlock" text="circom InRange.circom --r1cs --wasm --sym
"><code>circom InRange.circom <span class="hljs-operator">-</span><span class="hljs-operator">-</span>r1cs <span class="hljs-operator">-</span><span class="hljs-operator">-</span>wasm <span class="hljs-operator">-</span><span class="hljs-operator">-</span>sym
</code></pre><blockquote><p>With these options we generate three types of files:</p><p><code>--r1cs</code>: it generates the file <code>multiplier2.r1cs</code> that contains the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.circom.io/background/background#rank-1-constraint-system">R1CS constraint system</a> of the circuit in binary format.</p><p><code>--wasm</code>: it generates the directory <code>multiplier2_js</code> that contains the <code>Wasm</code> code (multiplier2.wasm) and other files needed to generate the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.circom.io/background/background#witness">witness</a>.</p><p><code>--sym</code> : it generates the file <code>multiplier2.sym</code> , a symbols file required for debugging or for printing the constraint system in an annotated mode.</p><p><code>--c</code> : it generates the directory <code>multiplier2_cpp</code> that contains several files (multiplier2.cpp, multiplier2.dat, and other common files for every compiled program like main.cpp, MakeFile, etc) needed to compile the C code to generate the witness.</p></blockquote></li><li><p>执行成功后，会生成如下截图的文件1：</p></li></ol><p>3月3日Cosmos EVM网络Evmos宣布主网正式上线。作为连接EVM和Cosmos两大生态系统的项目，Evmos颇受加密社区关注。金色财经带你看懂Evmos。</p><h2 id="h-evmos" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">EVMOS由来</h2><p>EVMOS一词来自是EVM和CosmOS。 这个名字清楚地表明了EVMOS的使命，成为链接Cosmos生态系统的EVM Hub。</p><p>简而言之，Evmos能够将EVM兼容链（不仅仅是以太坊）集成到Cosmos。这意味着Fantom、Avalanche和Harmony等公链可以通过Evmo将资产整合到Cosmos生态系统中，也意味着基于EVM的去中心化应用程序、代币和NFT都可以桥接到Cosmos。</p><p>本人手工制，引用请注明出处。</p><p>❶ A端先将自己的公钥Public Key提供给B端。\</p><p> ❷ A端将运算出的讯息摘要，透过自己的私钥Private Key，执行签章运算Sign( )，产生了数字签名Signature。\ ❸ A端将讯息与数字签名一同传送给B端。(上图省略了讯息的传输示意) \ ❹ B端利用收到的数字签名与A端公钥，解密出讯息摘要。</p><p>本文将为您详细解读 ZKS Token 的分发机制，带您了解 ZKS Token 是如何帮助 ZKSwap 启动生态并发挥重要作用的。</p><p>原文标题：ZKSwap 经济白皮书</p><p>项目背景\</p><p> ZKSwap 是首个基于 ZK-Rollups 技术的 Layer2 自动做市商模型去中心化交易所, 目前在以太坊 Layer2 上面完整实现了免信任并且免费的 Layer2 支付和转账（ZKPay），以及Layer2 上免费的、极速的、可以无限扩容的 Swap 交易体验（ZKSwap）。</p><p>在 ZKPay 中, 我们提供一套完整的 Layer2 解决方案，可以支持所有的 ERC20 的免费、实时、最终 TPS 超过 2000 的转账体验，后续计划重点支持所有的稳定币，使用 ZKPay 的转账服务。</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">故事</h2><blockquote><p>美国登山运动有句行话 fourteener，指海拔 14000 英尺以上的山峰。全美 96 座，科罗拉多州最多，有 58 座。所有高阶的登山者对科罗拉多州有一种向往。ETHDenver 的象征虚拟神兽 Bufficorn，就是生活在 14ers 上，与 Unicorn 是堂表亲关系。Peeking Bufficorn，勇于攀登，又与社区、开发者更近。</p></blockquote><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">背景</h2><p>为期10 天的ETHDenver 2022 正式落幕。在这里，多名黑客松参与者组成的超过170 个团队角逐30 强， 以获得总计100 万美元的赏金和奖金、200 万美元的投资资本以及额外100 万枚SPORK 零知识二次方奖金矿池，当然，也是为了共同建设以太坊和多链生态。</p><p>从NFT到GameFi，再到Loot，在市场热潮的几番更迭下，市场对于Layer 2的需求已经逐渐加大，随着Arbitrum主网的上线，越来越多的资金开始投身于Layer2 扩容协议市场，市场又掀起了新一轮的赛道竞争。</p><p>        虽然现阶段的Layer 2网络总锁仓量屡创新高，但仍然无法满足目前市场上投资者的需求，而且，现在市场Layer 2热度都是基于Zksync ,Arbitrum、Opitimism等项目的炒热而升温，根本无法长期持续。基于此，<strong>Layer 2</strong>热潮是否会成为“昙花一现”也成为了大众比较关注的事情。那么Layer 2技术目前发展如何？Layer 2网络的未来究竟是怎样的？而这一个个的疑问，路印协议CTO Steve Guo在一次演讲中给了我们答案。</p><p>        笔者用简单的方式讲述了Layer 2技术的演进，深入分析了每个Layer 2项目的优缺点，并且向我们叙述了Layer 2网络未来的发展方向。以下内容来自Steve的演讲实录。</p><p>           随着Layer 2热度的高涨，一个疑问逐渐浮现在大众面前：Layer 2的真正未来到底是什么？</p><h2 id="h-overflow" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Overflow</h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://so.csdn.net/so/search?q=Solidity&amp;spm=1001.2101.3001.7020">Solidity</a> 可以处理 256 位数字, 最高为 2^256 - 1, 所以对 (2^256 - 1) 加 1 会导致归 0。同理, 对 unsigned 类型 0 做减 1 运算会得到 (2**256 - 1)</p><pre data-type="codeBlock" text="pragma solidity 0.4.18;
contract OverflowUnderflow {
    uint public zero = 0;
    uint public max = 2^256 - 1;
    // zero will end up at  2^256 - 1
    function underflow() public {
        zero -= 1;
    }
    function overflow() public {
        max += 1;
    }
}
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> 0.4.18;</span>
<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">OverflowUnderflow</span> </span>{
    <span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> zero <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;
    <span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> max <span class="hljs-operator">=</span> <span class="hljs-number">2</span><span class="hljs-operator">^</span><span class="hljs-number">256</span> <span class="hljs-operator">-</span> <span class="hljs-number">1</span>;
    <span class="hljs-comment">// zero will end up at  2^256 - 1</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">underflow</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        zero <span class="hljs-operator">-</span><span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
    }
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">overflow</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        max <span class="hljs-operator">+</span><span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
    }
}
</code></pre><blockquote><p>DAS 之于加密世界，应如手机号/Email 之于互联网。</p></blockquote><h2 id="h-1" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">1. 背景</h2><p>伴随比特币的出现，人类第一次真正意义上实现了私人财产不可侵犯。更深层次的，它启发了人们开始以去中心化的视角重新审核和着手重构这个世界。既然我们的货币可以彻底掌握在我们自己的手中，那我们的数据是不是也可以，我们的身份是不是也可以？答案是肯定的。</p><p>去中心化身份是 Web3.0 的关键组成部分。已有不少团队在尝试构建去中心化身份，但这些尝试仍存在诸多的问题。这些尝试包括：</p><h2 id="h-version-claim" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Version claim</h2><blockquote><p>合约文件开头需要声明编译器的版本号，目的是为了该合约在未来版本的升级中引入了不兼容的编译器，其语法为：</p></blockquote><pre data-type="codeBlock" text="pragma solidity 版本号
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> 版本号
</span></code></pre><blockquote><p>版本号应该遵循“0.x.0”或者“x.0.0”的形式，比如：</p></blockquote><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">一、投注合约</h2><p>主要功能点：1）投注；2）开奖；3）退奖；4）获取奖池奖金；5）返回当前期数；6）返回中奖者地址；7）返回参与彩民的地址；</p><h2 id="h-11" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">1.1 定义合约属性</h2><p>合约主要包含有四个属性：</p><h2 id="h-1-create-contract-instance" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">1. create contract instance</h2><p>创建合约的语法:</p><pre data-type="codeBlock" text="new 合约名();

示例：
contract A {}
contract B {
    function test() public { 
        A a = new A();
    }
}
"><code><span class="hljs-keyword">new</span> 合约名();

示例：
<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">A</span> </span>{}
<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">B</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{ 
        A a <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> A();
    }
}
</code></pre><p>创建合约实例的时候，默认会调用构造函数，并执行构造函数中的代码。如果没有定义构造函数，EVM编译器会自动生成一个默认的构造函数。如果构造函数指定了参数，那么创建合约实例时候需要传入相同数量的实参。</p><h2 id="h-function-define" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">function define</h2><blockquote><p>函数入参和出参类型不能够使用var关键字。另外，函数可以返回多个值。</p><p>如果参数没有被使用，那么可以省略参数名。但是这些参数仍然存在堆栈中，只是无法访问而已。</p></blockquote><pre data-type="codeBlock" text="function 函数名(参数类型 参数名, ...) 修饰符 [returns(返回类型, ...)] {
    函数体
}

示例：
function sum(int a, int b) public pure returns(int) {
   return a + b;
}

function test1(int a, int b) public pure returns(int, int) {
   return (a, b);
}

function test2(int a, int b) public pure returns(int x, int y) {
   x = a;
   y = b;
}
function test(int a, int) public pure returns(int) {
  return a;
}
"><code><span class="hljs-function"><span class="hljs-keyword">function</span> 函数名(<span class="hljs-params">参数类型 参数名, ...</span>) 修饰符 [<span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params">返回类型, ...</span>)] </span>{
    函数体
}

示例：
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sum</span>(<span class="hljs-params"><span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">int</span></span>) </span>{
   <span class="hljs-keyword">return</span> a <span class="hljs-operator">+</span> b;
}

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test1</span>(<span class="hljs-params"><span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">int</span>, <span class="hljs-keyword">int</span></span>) </span>{
   <span class="hljs-keyword">return</span> (a, b);
}

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test2</span>(<span class="hljs-params"><span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y</span>) </span>{
   x <span class="hljs-operator">=</span> a;
   y <span class="hljs-operator">=</span> b;
}
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test</span>(<span class="hljs-params"><span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">int</span></span>) </span>{
  <span class="hljs-keyword">return</span> a;
}
</code></pre><blockquote><p>函数声明使用<code>pure</code>，代表该函数不能读取或修改状态变量，也不能发送和接收以太币，只能调用其他<code>pure</code>函数</p><p>除了<code>pure</code>以外，还可以使用<code>view</code>来修饰函数，这时候该函数只能够读取状态变量，而不能修改状态变量，也不能发送或接收以太币，只能调用其他<code>pure</code>或<code>view</code>函数。</p></blockquote><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/95401af71cd7e0f04046e8f97154293a17ef6955db01185a92eed4731bbf2896.png" alt="ART" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">ART</figcaption></figure><p>ART</p><p>主要是通过代码中memory来大幅度减少gas使用，示例代码如下：</p><pre data-type="codeBlock" text="pragma solidity ^0.5.10;

contract Test{
    
    struct User{
        uint age;
        uint balance;
        uint num;
    }
    
    User user;
    
    function initUser() public{
        user = User({age:20,balance:1000,num:1});
    }
    
    function setUser1() public {
        user.age = 30;
        user.balance = 20000;
        user.num = 2;
    }
    
    function setUser2() public {
        User memory temp = user;
        temp.age = 40;
        temp.age = 20001;
        user.num = 3;
        user = temp;
    }
}
pragma solidity ^0.5.10;

contract Test{
    
    struct User{
        uint age;
        uint balance;
        uint num;
    }
    
    User user;
    
    function initUser() public{
        user = User({age:20,balance:1000,num:1});
    }
    
    function setUser1() public {
        user.age = 30;
        user.balance = 20000;
        user.num = 2;
    }
    
    function setUser2() public {
        User memory temp = user;
        temp.age = 40;
        temp.age = 20001;
        user.num = 3;
        user = temp;
    }
}
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.5.10;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Test</span></span>{
    
    <span class="hljs-keyword">struct</span> <span class="hljs-title">User</span>{
        <span class="hljs-keyword">uint</span> age;
        <span class="hljs-keyword">uint</span> balance;
        <span class="hljs-keyword">uint</span> num;
    }
    
    User user;
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">initUser</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span></span>{
        user <span class="hljs-operator">=</span> User({age:<span class="hljs-number">20</span>,balance:<span class="hljs-number">1000</span>,num:<span class="hljs-number">1</span>});
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setUser1</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        user.age <span class="hljs-operator">=</span> <span class="hljs-number">30</span>;
        user.<span class="hljs-built_in">balance</span> <span class="hljs-operator">=</span> <span class="hljs-number">20000</span>;
        user.num <span class="hljs-operator">=</span> <span class="hljs-number">2</span>;
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setUser2</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        User <span class="hljs-keyword">memory</span> temp <span class="hljs-operator">=</span> user;
        temp.age <span class="hljs-operator">=</span> <span class="hljs-number">40</span>;
        temp.age <span class="hljs-operator">=</span> <span class="hljs-number">20001</span>;
        user.num <span class="hljs-operator">=</span> <span class="hljs-number">3</span>;
        user <span class="hljs-operator">=</span> temp;
    }
}
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.5.10;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Test</span></span>{
    
    <span class="hljs-keyword">struct</span> <span class="hljs-title">User</span>{
        <span class="hljs-keyword">uint</span> age;
        <span class="hljs-keyword">uint</span> balance;
        <span class="hljs-keyword">uint</span> num;
    }
    
    User user;
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">initUser</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span></span>{
        user <span class="hljs-operator">=</span> User({age:<span class="hljs-number">20</span>,balance:<span class="hljs-number">1000</span>,num:<span class="hljs-number">1</span>});
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setUser1</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        user.age <span class="hljs-operator">=</span> <span class="hljs-number">30</span>;
        user.<span class="hljs-built_in">balance</span> <span class="hljs-operator">=</span> <span class="hljs-number">20000</span>;
        user.num <span class="hljs-operator">=</span> <span class="hljs-number">2</span>;
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setUser2</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        User <span class="hljs-keyword">memory</span> temp <span class="hljs-operator">=</span> user;
        temp.age <span class="hljs-operator">=</span> <span class="hljs-number">40</span>;
        temp.age <span class="hljs-operator">=</span> <span class="hljs-number">20001</span>;
        user.num <span class="hljs-operator">=</span> <span class="hljs-number">3</span>;
        user <span class="hljs-operator">=</span> temp;
    }
}
</code></pre><p>我们首先通过initUser方法来初始化一个User对象的数据，然后分别调用setUser1和setUser2两个方法。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/a78fbb937d646c36a86febd9820458d734fe6d1296ef305138e5441a5d6f9723.png" alt="Art" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Art</figcaption></figure><p>Art</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">概念</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/557fcb7fa43e968fa3be0ee0628890c004c0504ecc4e5e5f9da255b80c0c89ac.png" alt="概念" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">概念</figcaption></figure><p>概念</p><blockquote><p>Merkle Tree，也被称作<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://so.csdn.net/so/search?q=Hash&amp;spm=1001.2101.3001.7020">Hash</a> Tree，存储hash值的一棵树。Merkle树的叶子是数据块(例如，文件或者文件的集合)的hash值，非叶节点是其对应子节点串联字符串的hash。</p></blockquote><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5063ab4470a352a5058419b578249cc5fb702c8cb832b68a9a07a0e209eda3a4.png" alt="Art" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Art</figcaption></figure><p>Art</p><h2 id="h-bitcoin" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Bitcoin中的数据区块</h2><p>由区块头和区块体2部分组成，如下：</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/bee419c3dac28becce72e8002341ef9ef8d4ec7819171baf99441576c4b853e9.png" alt="区块结构" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">区块结构</figcaption></figure><p>区块结构</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/fff7d2fe1df09cc840322b2293b4e0bb6b42fc9bb03d3a12b1603070e6e6ca08.png" alt="Learn Solidity Series" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Learn Solidity Series</figcaption></figure><p>Learn Solidity Series</p><h2 id="h-delete" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">delete</h2><p>它用于将变量设置为其初始值，这意味着该语句delete a的行为如下：</p><p>对于整数，它等于a = 0。 对于数组，它分配长度为零的动态数组或长度相同的静态数组，并将所有元素设置为其初始值。 delete a[x]删除数组索引x处的项目，并保持所有其他元素和数组长度不变。这尤其意味着它在数组中留有间隙。 对于结构体，它将重置结构体的所有成员。 delete对映射没有影响(因为映射的键可能是任意的，并且通常是未知的)。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c89c66949231ed1978aa157c38f8ebeb44a45b07fa00ac0e49aeb092bf9470b6.png" alt="Learn Solidity Series" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Learn Solidity Series</figcaption></figure><p>Learn Solidity Series</p><h2 id="h-struct" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Struct</h2><blockquote><p>与在C和C ++中一样，结构体允许你定义自己的类型</p></blockquote><p>定义结构体后，就可以开始将其用作状态变量或在函数中使用。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c5b855393055dde7486bb9f6dae8f17adcb798ba1d0184de400c6948143bb6d9.png" alt="Learn Solidity Series" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Learn Solidity Series</figcaption></figure><p>Learn Solidity Series</p><blockquote><p>Solidity中，有两种类型的数组：存储数组和内存数组。</p></blockquote><h2 id="h-storage-arrays" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">存储数组(Storage Arrays)</h2><blockquote><p>这些数组被声明为状态变量，并且可以具有固定长度或动态长度。动态存储数组可以调整数组的大小，它们通过访问<code>push()</code>和<code>pop()</code>方法来调节长度。</p></blockquote><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/520e605d924d553f81b21c43fa3af8a79fc8871ed1e10759c5042db4642aef84.png" alt="Learn Solidity Series" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Learn Solidity Series</figcaption></figure><p>Learn Solidity Series</p><h2 id="h-before-solidity-0422" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Before Solidity 0.4.22</h2><p>默认构造方法与Java类似，如果未指定会采用默认的构造方法。当然，也可以明确指定构造方法。通过function指定了Solidity的构造方法，同时也可以像Java一样，给构造方法指定参数，但无法像Java那样创建多个重载的构造方法。</p><pre data-type="codeBlock" text="pragma solidity ^0.4.21;

contract DemoTest{

    function DemoTest() public{

    }
}
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.4.21;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">DemoTest</span></span>{

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">DemoTest</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span></span>{

    }
}
</code></pre><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b579a47723b368f62110ca4e3442142720bd232ee9e396b07ea5ec370262301a.png" alt="Solidity Series" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Solidity Series</figcaption></figure><p>Solidity Series</p><blockquote><p>在Solidity中一个<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://so.csdn.net/so/search?q=%E5%87%BD%E6%95%B0&amp;spm=1001.2101.3001.7020">函数</a>方法是可以返回多个结果的</p></blockquote><pre data-type="codeBlock" text="pragma solidity ^0.5.10;

contract ManyReturns{

    // 基础方法：返回多个参数，用于被调用
    function getThreeNum() public returns(uint one,uint two, uint three){
        uint one = 1;
        uint two = 2;
        uint three = 3;
        return(one,two,three);
    }

    // 场景一：接收全部参数
    function call() public {
        uint one;
        uint two;
        uint three;
        // 接收结果的变量必须实现定义完成
        (one,two,three) = getThreeNum();
    }

    // 场景二：接收部分参数
    function call1() public{
        uint one;
        uint two;
        // 定义部分参数进行接收，未接收的参数，直接用逗号&quot;,&quot;分割即可。
        (one,two,) = getThreeNum();
    }
}
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.5.10;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">ManyReturns</span></span>{

    <span class="hljs-comment">// 基础方法：返回多个参数，用于被调用</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getThreeNum</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> one,<span class="hljs-keyword">uint</span> two, <span class="hljs-keyword">uint</span> three</span>)</span>{
        <span class="hljs-keyword">uint</span> one <span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
        <span class="hljs-keyword">uint</span> two <span class="hljs-operator">=</span> <span class="hljs-number">2</span>;
        <span class="hljs-keyword">uint</span> three <span class="hljs-operator">=</span> <span class="hljs-number">3</span>;
        <span class="hljs-keyword">return</span>(one,two,three);
    }

    <span class="hljs-comment">// 场景一：接收全部参数</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">call</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-keyword">uint</span> one;
        <span class="hljs-keyword">uint</span> two;
        <span class="hljs-keyword">uint</span> three;
        <span class="hljs-comment">// 接收结果的变量必须实现定义完成</span>
        (one,two,three) <span class="hljs-operator">=</span> getThreeNum();
    }

    <span class="hljs-comment">// 场景二：接收部分参数</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">call1</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span></span>{
        <span class="hljs-keyword">uint</span> one;
        <span class="hljs-keyword">uint</span> two;
        <span class="hljs-comment">// 定义部分参数进行接收，未接收的参数，直接用逗号","分割即可。</span>
        (one,two,) <span class="hljs-operator">=</span> getThreeNum();
    }
}
</code></pre><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/559fd426e1139b3499c64d1595d23e79ab17e693e06d0a8b023df9ccf3785713.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-what-is-constant" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What is constant ?</h2><blockquote><p>Functions can be declared constant in which case they <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://so.csdn.net/so/search?q=promise&amp;spm=1001.2101.3001.7020">promise</a> not to modify the state.</p></blockquote><p>也就是说当执行函数时不会去修改区块中的数据状态时，那么这个函数就可以被声明成constant的，比如说getter类的方法。</p><h2 id="h-optimism-batch" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Optimism batch提交示例</h2><p>optimistic etherscan 29307 包含<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://optimistic.etherscan.io/txs?batch=29307">72 transactions</a></p><p>etherscan txHash</p><h2 id="h-state-transfer" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">State Transfer</h2><h3 id="h-overview" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Overview</h3><p>Polygon validators continuously monitor a contract on Ethereum chain called <strong><em>StateSender</em></strong>. Each time a registered contract on Ethereum chain calls this contract, it emits an event. Using this event Polygon validators relay the data to another contract on Polygon chain. This <strong><em>StateSync</em></strong> mechanism is used to send data from Ethereum to Polygon.</p><p>Polygon validators also periodically submit a hash of all transactions on Polygon chain to Ethereum chain. This <strong><em>Checkpoint</em></strong> can be used to verify any transaction that happened on Polygon. Once a transaction is verified to have happened on Polygon chain, action can be taked accordingly on Ethereum.</p><p>近来最火的圈内“技术”事件，无疑是Arbitrum的上线。</p><p>原因无他，去年V神便已定调Rollup将会作为ETH当前的主要扩容手段，未来在2.0分片时代也将会和分片一起承担ETH“全球结算层”的历史重任。定调之后，LRC（路印协议）算是第一个实现了Rollup方案的项目，但LRC本质上只是一个应用，并非一个通用型Rollup解决方案。</p><p>刚刚主网上线的Arbitrum，严格意义来说，才是历史上第一个上线了主网的“通用性Rollup Layer2扩容方案”（OP更早上线了测试网，但主网要7、8月份了）。</p><p>这几天在不少社群里看到有人问：“Arbitrum和Matic哪个厉害啊？不都是Layer2 么？Arbitrum和后面的Optimism以及Zk-Sync哪个厉害呀？不都是Rollup吗？”</p><h2 id="h-transactions" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Transactions</h2><h2 id="h-fact-sheet" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Fact Sheet</h2><ul><li><p>Instructions are the most basic operational unit on Solana</p></li><li><p>Each instruction contains:</p><ul><li><p>The <code>program_id</code> of the intended program</p></li><li><p>An array of all <code>accounts</code> it intends to read from or write to</p></li><li><p>An <code>instruction_data</code> byte array that is specific to the intended program</p></li></ul></li><li><p>Multiple instructions can be bundled into a single transaction</p></li><li><p>Each transaction contains:</p><ul><li><p>An array of all <code>accounts</code> it intends to read from or write to</p></li><li><p>One or more <code>instructions</code></p></li><li><p>A recent <code>blockhash</code></p></li><li><p>One or more <code>signatures</code></p></li></ul></li><li><p>Instructions are processed in order and atomically</p></li><li><p>If any part of an instruction fails, the entire transaction fails.</p></li><li><p>Transactions are limited to 1232 bytes</p></li></ul><p><strong>什么是分片（Sharding）</strong></p><p>分片技术并不是什么创新的概念，早在区块链技术出现之前，就已经在传统数据库中运作了，主要用于大型商业数据库的优化。</p><p>其概念就是<strong>将数据库中的数据，切割成很多数据分片</strong>，再将这些分片分配到不同的伺服器中储存，如此一来，就不会因为短时间内出现大量数据访问请求，而出现单一伺服器压力过大的问题。</p><p>在传统的区块链网络中，交易必须有网络中的每个节点进行确认，以保证交易的安全，然而这也是导致交易速度难以提升的主因之一。</p><p><strong>DeFi 的出现凸显了区块链技术的真正能力，并展示了其在金融领域的实用性。随着 DeFi 的增长迅猛，越来越多的组织和项目利用其功能，高度安全和去中心化的信息源也大量增加。</strong></p><p>这就是预言机出现的地方——随着 DeFi 的发展，它们的用例变得比以往任何时候都更加重要和相关。</p><p><strong>究竟什么是预言机？</strong></p><p>预言机可以定义为第三方服务，它利用区块链上的智能合约从链下世界检索任何所需的信息或从外部来源检索数据。</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">前言</h2><p>匿名性一直被视为 加密货币 社区的非常有价值的特征之一。它是可替代性的前身，该特性对于广泛使用的货币形式来说也是必要的。同样，大多数加密资产持有者不希望他们的资产和交易记录被完全公开。在所有在为区块链提供隐私性的各种加密技术中，zk-SNARK 和 zk-STARK 是两个值得注意的例子。</p><p>zk-SNARK 代表了简洁化的非交互式零知识证明，而 zk-STARK 代表了简洁化的全透明零知识证明。 Zk-SNARK 已经在基于区块链的支付系统上如 Zcash，JP Morgan Chase 项目中使用，并作为一种客户端到服务器的安全验证方式。但是，虽然 zk-SNARKs 已经很成熟并被很广泛的使用，但 zk-STARK 现在也被吹捧为该协议的新版本和改进版本，旨在解决 zk-SNARKs 先前的许多缺点。</p><p>从历史角度而言，以太坊的 Gas 费用曾三次飙升至天文数字的高度：2017 年的牛市期间、2020 年的 DeFi 之夏以及 2021 年的 NFT 之夏。如下图所示：</p><p>上图：2015年至2021年11月的以太坊网络 Gas 费用上涨情况。</p><p>每次 Gas 费再次飙升时，围绕以太坊区块链可扩展性的讨论就会再次燃起，与此同时更多人则争先恐后地寻找下一个与之竞争的区块链网络。实际上，高涨的 Gas 费用只是我们必须应对的冰山一角。当前 Gas 费用如此之高的原因是因为以太坊无法扩展，也即对交易的需求仍然比以太坊区块链每次实际能够处理的更多。</p><p>在当前区块链世界中，主要有两种记录保存方式，UTXO 模式（Unspent Transaction Output) 和 Account 模式。<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://so.csdn.net/so/search?q=Bitcoin&amp;spm=1001.2101.3001.7020">Bitcoin</a> 采用的是 UTXO 模型，Ethereum 采用的 Account 模型，同样 CITA 也采用了 Account 模型。</p><p>Bitcoin 的设计初衷是点对点的电子现金系统，在比特币中，每个交易消耗之前交易生成的 UTXO 然后生成新的 UTXO，账户的余额即所有属于该地址的未花费 UTXO 集合，Bitcoin 的全局状态即当前所有未花费的 UTXO 集合。Ethereum 意图创建一个更为通用的协议，该协议支持图灵完备的编程语言，在此协议上用户可以编写智能合约，创建各种去中心化的应用。由于 UTXO 模型在状态保存以及可编程性方面的缺陷，Ethereum 引入了 Account 模型。下面我们对两种模型的优缺点做进一步展开。</p><h2 id="h-utxo" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">UTXO 模型</h2><p>UTXO 模型中，交易只是代表了 UTXO 集合的变更。而账户和余额的概念是在 UTXO 集合上更高的抽象，账号和余额的概念只存在于钱包中。</p><p>跨链通信是一个跨链的技术，它和 Plasma 不一样，两条链之间没有特别强的主次关系，其子链和侧链仍然有权利自己产生资产，自己运行，然后通过某种协议和主链或者其他链进行跨链交互，大家进行数据互通。</p><p>它严格来说不是 <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://so.csdn.net/so/search?q=Layer&amp;spm=1001.2101.3001.7020">Layer</a> 1 的 Layer 2，但是它对整个系统 Scability 的提升是很有好处的。接下来我简单介绍两个项目，方便大家来理解。</p><h3 id="h-cosmos" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Cosmos</h3><p>Cosmos 的系统架构如图所示，它中间有一个 Cosmos Hub，周围的叫做 Zone，可以认为中间是一个交换链，周围其他是子链。Zone 是用 Tendermint 来做的，采用的是 BFT 共识以及区块链框架，它也满足 Instant Finality（即时终结性），如果系统是少于三分之一的作恶节点，它一定是正确的。它引入了链间通讯协议（ Inter-Blockchain Communication ，简称 IBC） ，这个是类似 Plasma 和 State Channel 的一个协议。</p><h3 id="h-tvl" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">查看TVL工具</h3><ul><li><p>TVL 追踪工具</p><ul><li><p>ETH：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=https%3A//defipulse.com/">DeFi Pulse</a></p></li><li><p>BSC：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=https%3A//www.defistation.io/">DeFi Station</a></p></li></ul></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=https%3A//zapper.fi/dashboard">Zapper</a>：DeFi 资产追踪工具，支持 ETH、BSC、Polygon、Fantom</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=https%3A//app.zerion.io/">Zerion</a>：ETH 和 BSC 资产追踪工具，可以清晰看到 ETH 上的资产分布（自己或别人），设置交易提醒。（ V神的 <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=https%3A//bit.ly/3oGsy2l">ETH 钱包</a>）</p></li></ul><h2 id="h-off-chain-computation" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">链下计算（ Off Chain Computation ）</h2><p>以太坊声称要做计算机，EOS 要做全球操作系统，但无论是做计算机还是做操作系统都得正视计算这个问题，链上计算的开销是非常大的，链上每一个 EVM 的 Code 计算需要全球计算机都算一遍，才能得出结果，所以有人做了这么一个计算的扩展，在链外做 Computation。</p><p>这个方式大致有两种</p><h2 id="h-research-institute" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Research Institute</h2><h3 id="h-state-channel" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">状态通道 State Channel</h3><p>我们先来谈谈状态通道，举一个例子方便大家理解。</p><p>Alice 和 Bob 一起玩一个划拳游戏。Alice 赢了可以从 Bob 那里得到 1 块钱，而如果 Alice 输了需要给 Bob 1 块钱，反之亦然。</p><p>如果这个游戏是在以太坊主链上运行，我们通常的方法是 Alice 和 Bob 一起创建一个智能合约，每当划拳游戏开始的时候，他们向智能合约发起一个交易，当其中一个玩家赢了的时候，智能合约会执行规则付给赢家 1 块钱。</p><p>在上一篇文章中，我们介绍了解决扩展性问题的第一个 Layer2  解决方案，即状态通道。接下来，本篇将会为大家揭开另一个称为 Plasma 的链下交易技术，而该技术则是由 Vitalik Buterin 和 Joseph Poon 在 2017 年，含金量十足。</p><h2 id="h-plasma" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Plasma</h2><p>Plasma 是一个链下交易的技术，由 Vitalik Buterin 和 Joseph Poon 在 2017 年提出，它相当于贡献了一条子链，可以让你在主链上质押资产，然后在子链上产生资产，而且它提供一个服务器，不需要点对点的交互，在服务器上就可以进行交互。</p><p>Plasma 子链可以更快地操作，且交易费用更低，因为它的操作不需要在整个以太坊区块链存留副本</p><p>Layer2是个大的话题。是否去中心化，是否安全，资金状态确认时间是Layer2的主要的讨论话题。最近有点时间，总结一下Layer2的理解和思考。</p><h2 id="h-layer2" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Layer2交互模型</h2><p>Layer2，相对于Layer1，在Layer1的基础上提供更丰富功能，更好的用户体验。抽象一下Layer2的逻辑以及交互模型如下：</p><h2 id="h-0" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">0.账户 交易 消息</h2><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">账户</h3><p>以太坊账户与我们所知的账户概念有一定相似之处，却又有很大的区别，更不同于比特币中UTXO。 账户分两类：</p><ul><li><p>外部拥有账户(EOA)，也就是普通账户</p></li><li><p>合约账户</p></li></ul><p>unitimes.io</p><p><strong>全球视角，独到见解</strong></p><p>预计将于2019年1月16日进行的以太坊君士坦丁堡硬分叉(当区块高度到达7,080,000时)，即将对以太坊网络带来怎样的升级呢？我们一起来了解一下。</p><p>提醒一下：如果你只是一名普通的ETH持有者，你不需要对这次升级做任何准备。</p><p>imToken 服务协议</p><p>最近更新于：2021年10月14日</p><p>imToken Pte. Ltd.（“我们”、或“我们的”）是一家领先的区块链软件开发公司，专注于利用去中心化技术为像您这样的个人（“您”或“您的”）提供可信的数字资产管理服务。我们托管一个顶级域名站：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://token.im/">https://token.im</a>，该网站提供有关imToken和我们的产品的信息，以及我们产品的子域（“网站”）信息，其中包括文本、图像、音频、代码和其他材料或第三方信息。</p><p>由于越来越多的诈骗者想方设法欺骗毫无戒心的受害者的数字资产，请您在每次访问我们的域名站时验证SSL证书。本《服务协议》（定义如下）仅适用于由Encryption Everywhere DV TLS CA发布的具备有效SSL证书的域名站：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://token.im/">https://token.im</a>。在从您正在访问的网站下载、点击或以其他方式与之交互之前，请确保SSL证书的真实性。为免疑义，我们无法控制任何第三方网站或服务的内容、隐私政策或行为，也不对其承担任何责任。对于因使用或依赖任何此类网站或服务上或通过此类网站或服务提供的任何此类内容、商品或服务而造成或声称造成的任何损害或损失，我们概不负责或承担任何直接或间接责任。</p><h3 id="h-11-dao" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">1.1 DAO</h3><h4 id="h-111-dao" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">1.1.1 DAO定义</h4><blockquote><p>DAO 即 Decentralized Autonomous Corporations，中文为去中心化的自治组织，是一个以公开透明的计算机代码来体现的组织，其受控于组织成员，并不受集中控制或第三方干预，一个分布式自治组织的金融交易记录和程序规则是保存在区块链中的。</p></blockquote><p>Web3的核心是去中心化和用户拥有信息，因此所有的创业投资机会将围绕着这两点。</p><p>互联网经过40年的发展逐渐进入了一个新时代，一方面消费互联网由于巨头垄断停滞发展；另一方面，企业互联网的发展在过去10年取得突飞猛进的进展，SaaS成为最亮眼的股票。</p><p>从2010年起，消费互联网的巨头进入收割期，各大巨头的垄断利润暴涨，占据了市值前10名的90%。另一方面，在创新领域，却再也没有巨头产生。虽然在中国，由于巨头的反应迟钝，给了移动互联网的巨头字节跳动和美团机会。但是整体上，全球范围内消费互联网进入一个停滞状态毫无争议。</p><p>大家经常讲创新总是发生在边缘，正如互联网诞生于70年代，万维网诞生于90年代，最初的互联网只是由几个大学的节点组成，经过40年的发展，在没有任何人能够预测到的情况下，发展出来改变世界的各种应用。</p>]]></content:encoded>
            <author>5-3@newsletter.paragraph.com (阿5)</author>
        </item>
        <item>
            <title><![CDATA[Learn Solidity Series 2: multiple returns]]></title>
            <link>https://paragraph.com/@5-3/learn-solidity-series-2-multiple-returns</link>
            <guid>Y7EYuAP5HktPiAGoKct9</guid>
            <pubDate>Fri, 18 Mar 2022 23:40:47 GMT</pubDate>
            <description><![CDATA[Solidity SeriesSolidity Series在Solidity中一个函数方法是可以返回多个结果的pragma solidity ^0.5.10; contract ManyReturns{ // 基础方法：返回多个参数，用于被调用 function getThreeNum() public returns(uint one,uint two, uint three){ uint one = 1; uint two = 2; uint three = 3; return(one,two,three); } // 场景一：接收全部参数 function call() public { uint one; uint two; uint three; // 接收结果的变量必须实现定义完成 (one,two,three) = getThreeNum(); } // 场景二：接收部分参数 function call1() public{ uint one; uint two; // 定义部分参数进行接收，未接收的参数，直接用逗号","分割即可。 (one,two,) = ge...]]></description>
            <content:encoded><![CDATA[<figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b579a47723b368f62110ca4e3442142720bd232ee9e396b07ea5ec370262301a.png" alt="Solidity Series" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Solidity Series</figcaption></figure><p>Solidity Series</p><blockquote><p>在Solidity中一个<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://so.csdn.net/so/search?q=%E5%87%BD%E6%95%B0&amp;spm=1001.2101.3001.7020">函数</a>方法是可以返回多个结果的</p></blockquote><pre data-type="codeBlock" text="pragma solidity ^0.5.10;

contract ManyReturns{

    // 基础方法：返回多个参数，用于被调用
    function getThreeNum() public returns(uint one,uint two, uint three){
        uint one = 1;
        uint two = 2;
        uint three = 3;
        return(one,two,three);
    }

    // 场景一：接收全部参数
    function call() public {
        uint one;
        uint two;
        uint three;
        // 接收结果的变量必须实现定义完成
        (one,two,three) = getThreeNum();
    }

    // 场景二：接收部分参数
    function call1() public{
        uint one;
        uint two;
        // 定义部分参数进行接收，未接收的参数，直接用逗号&quot;,&quot;分割即可。
        (one,two,) = getThreeNum();
    }
}
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.5.10;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">ManyReturns</span></span>{

    <span class="hljs-comment">// 基础方法：返回多个参数，用于被调用</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getThreeNum</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> one,<span class="hljs-keyword">uint</span> two, <span class="hljs-keyword">uint</span> three</span>)</span>{
        <span class="hljs-keyword">uint</span> one <span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
        <span class="hljs-keyword">uint</span> two <span class="hljs-operator">=</span> <span class="hljs-number">2</span>;
        <span class="hljs-keyword">uint</span> three <span class="hljs-operator">=</span> <span class="hljs-number">3</span>;
        <span class="hljs-keyword">return</span>(one,two,three);
    }

    <span class="hljs-comment">// 场景一：接收全部参数</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">call</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-keyword">uint</span> one;
        <span class="hljs-keyword">uint</span> two;
        <span class="hljs-keyword">uint</span> three;
        <span class="hljs-comment">// 接收结果的变量必须实现定义完成</span>
        (one,two,three) <span class="hljs-operator">=</span> getThreeNum();
    }

    <span class="hljs-comment">// 场景二：接收部分参数</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">call1</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span></span>{
        <span class="hljs-keyword">uint</span> one;
        <span class="hljs-keyword">uint</span> two;
        <span class="hljs-comment">// 定义部分参数进行接收，未接收的参数，直接用逗号","分割即可。</span>
        (one,two,) <span class="hljs-operator">=</span> getThreeNum();
    }
}
</code></pre>]]></content:encoded>
            <author>5-3@newsletter.paragraph.com (阿5)</author>
        </item>
        <item>
            <title><![CDATA[UMEE测试教程]]></title>
            <link>https://paragraph.com/@5-3/umee</link>
            <guid>6e61U2etHg8yhtPf2nG8</guid>
            <pubDate>Thu, 17 Mar 2022 13:56:26 GMT</pubDate>
            <description><![CDATA[项目背景：Coinlist售卖项目。这是一个跨链借贷项目，实现从COMMOS跨到以太坊上。有空投，未来几天会开启激励测试网。现在可以先熟悉一下操作。image.pngimage.png 准备： 要有metamask钱包和Kelr钱包，二者都可以在谷歌应用商店下载。 1）打开 app.umee.cc，窗口会自动弹出，授权小狐狸钱包连接到 Goerli 测试网；Keplr 钱包连接到 Umee 测试网. 2）领测试币。 加入https://discord.com/invite/mbfaBZ388P 钱包下拉，复制相应的测试网地址，从 discord 上的#umee-faucet机器人频道请求测试网 UMEE，输入!faucet +钱包地址获得。从 discord 上的#atom-faucet机器人频道请求测试网 ATOM； 从https://faucet.goerli.mudit.blog/ 获得测试网 ETH。 在供应里，各个币授权后，有个FAUCET，可以领取各自的测试币。3）IBC跨链。 点左侧边栏的Markets，点IBC，从Cosmos测试网提币到umee测试网。注意要留点...]]></description>
            <content:encoded><![CDATA[<p>项目背景：Coinlist售卖项目。这是一个跨链借贷项目，实现从COMMOS跨到以太坊上。有空投，未来几天会开启激励测试网。现在可以先熟悉一下操作。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><figcaption HTMLAttributes="[object Object]" class="">image.png</figcaption></figure><p>image.png</p><p>准备：</p><p>要有metamask钱包和Kelr钱包，二者都可以在谷歌应用商店下载。</p><p>1）打开 <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://xn--app-282fu0m.umee.cc/">app.umee.cc</a>，窗口会自动弹出，授权小狐狸钱包连接到 Goerli 测试网；Keplr 钱包连接到 Umee 测试网.</p><p>2）领测试币。</p><p>加入<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://discord.com/invite/mbfaBZ388P">https://discord.com/invite/mbfaBZ388P</a></p><p>钱包下拉，复制相应的测试网地址，从 discord 上的#umee-faucet机器人频道请求测试网 UMEE，输入!faucet +钱包地址获得。从 discord 上的#atom-faucet机器人频道请求测试网 ATOM；</p><p>从<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://faucet.goerli.mudit.blog/">https://faucet.goerli.mudit.blog/</a> 获得测试网 ETH。</p><p>在供应里，各个币授权后，有个FAUCET，可以领取各自的测试币。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/755756cd3e2188a4bde54f5364fbdd839b9619bf5faa1e86f7e377dcd020e792.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>3）IBC跨链。</p><p>点左侧边栏的Markets，点IBC，从Cosmos测试网提币到umee测试网。注意要留点做费用，不要全提。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><figcaption HTMLAttributes="[object Object]" class="">image.png</figcaption></figure><p>image.png</p><p>4）链跨链到以太坊。点Bridge，选择数量，再点Transfer,钱包确认。注意：额度不能太少，否则会失败。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><figcaption HTMLAttributes="[object Object]" class="">image.png</figcaption></figure><p>image.png</p><p>5）供应（supply）。对ATOM授权，存入。有存入就有取出，withdraw提现。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><figcaption HTMLAttributes="[object Object]" class="">image.png</figcaption></figure><p>image.png</p><p>6）借贷（Borrow）。在有存款的情况下才能借贷，这也就是抵押借贷。页面会显示可借贷数目。选择稳定币，输入数量，借出。同时，Repay是还款。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><figcaption HTMLAttributes="[object Object]" class="">image.png</figcaption></figure><p>image.png</p><p>7）反馈。<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.google.com/forms/d/e/1FAIpQLSeDCnDprDTZhMQp5c38k4Pgmycr-FP5_jAAxc-s1scrBg1yeg/viewform">https://docs.google.com/forms/d/e/1FAIpQLSeDCnDprDTZhMQp5c38k4Pgmycr-FP5_jAAxc-s1scrBg1yeg/viewform</a></p><p>区块浏览器：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer-umee.vercel.app/">https://explorer-umee.vercel.app/</a></p>]]></content:encoded>
            <author>5-3@newsletter.paragraph.com (阿5)</author>
        </item>
        <item>
            <title><![CDATA[2022.3.17日昼夜频道优选]]></title>
            <link>https://paragraph.com/@5-3/2022-3-17</link>
            <guid>84tU4ywj4r699my9huv2</guid>
            <pubDate>Thu, 17 Mar 2022 13:55:32 GMT</pubDate>
            <description><![CDATA[1、COSMOS生态 NOMIC BITCOIN BRIDGE空投 领取： app.nomic.io ,这是测试网，真正领取在星期一。非正式消息：快照为一周前。 信息源：https://twitter.com/nomicbtc/status/1487376620008742921?s=20&t=JsiL0ZaiYrxO3oIohWSfCg 2、使用 #Avalanche C-Chain 交易超过两次，钱包中有 10 个 WGM空投。 https://chainlist.org/ ，连钱包，搜索WAGMI添加。 信息源：https://twitter.com/cgcardona/status/1486875317033582592?s=20&t=enQLAgRfXSA659P36qlVCw 3、消息：Snapshot预计会发币。此前，我说过，兔子洞概念空投，兔子洞上的任务出现过多个大空投，现在还有几个没有发行Token，Rabbithole、OpenSea、Snapshot、Superfluid、Matcha。这些都是可能空投的。 信息源：https://t.co/qO8Kjvgd...]]></description>
            <content:encoded><![CDATA[<p>1、COSMOS生态 NOMIC BITCOIN BRIDGE空投</p><p>领取： <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://app.nomic.io/">app.nomic.io</a>  ,这是测试网，真正领取在星期一。非正式消息：快照为一周前。 信息源：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/nomicbtc/status/1487376620008742921?s=20&amp;t=JsiL0ZaiYrxO3oIohWSfCg">https://twitter.com/nomicbtc/status/1487376620008742921?s=20&amp;t=JsiL0ZaiYrxO3oIohWSfCg</a></p><p>2、使用 #Avalanche   C-Chain 交易超过两次，钱包中有 10 个 WGM空投。</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chainlist.org/">https://chainlist.org/</a>  ，连钱包，搜索WAGMI添加。</p><p>信息源：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/cgcardona/status/1486875317033582592?s=20&amp;t=enQLAgRfXSA659P36qlVCw">https://twitter.com/cgcardona/status/1486875317033582592?s=20&amp;t=enQLAgRfXSA659P36qlVCw</a></p><p>3、消息：Snapshot预计会发币。此前，我说过，兔子洞概念空投，兔子洞上的任务出现过多个大空投，现在还有几个没有发行Token，Rabbithole、OpenSea、Snapshot、Superfluid、Matcha。这些都是可能空投的。</p><p>信息源：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.co/qO8KjvgdRg">https://t.co/qO8KjvgdRg</a></p><p>4、CiaraDAO 创世纪成员 NFT</p><p>CiaraDAO 是由社区发起的 DAO，由 Ciara Sun 发起，Ciara Sun 是加密领域女性的标志性人物，旨在赋予各个层面的少数群体权力，建立一个为加密空间及其他领域的所有人类/机器人/化身提供平等机会的未来。Ciara 本人也加入了 DAO 成员，因为她认为不应该有女性或黑人领导人，而应该只有领导人。</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://galaxy.eco/Crypto_Ciara/campaign/GCf8EUUY5Y">https://galaxy.eco/Crypto_Ciara/campaign/GCf8EUUY5Y</a>  以太坊领取，最多领取10个。需要消耗成本，自行决定。</p><p>信息源：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/Crypto_Ciara/status/1487427490994073601?s=20&amp;t=enQLAgRfXSA659P36qlVCw">https://twitter.com/Crypto_Ciara/status/1487427490994073601?s=20&amp;t=enQLAgRfXSA659P36qlVCw</a></p><p>5、NASDEX 与ProjectGalaxyHQ合作，为您带来 Stonk Minter NFT 活动。在<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://app.nasdex.xn--xyz-fc4j43r/">http://app.nasdex.xyz铸造</a>&gt;价值 10 美元的 SEA 股票$SE即可获得 Stonk Minter NFT。在 1 月 29 日至 3 月 31 日之间的任何时间铸造并在活动结束前领取。<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.co/vWIL7WuodZ">https://t.co/vWIL7WuodZ</a></p><p>6、Zilly是一个社交网络，用于连接 web3 中的社区和建设者。</p><p>申请加入等候名单：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zilly.social/">https://zilly.social/</a></p><p>相关说明：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/0x0D16c0308B39E9576e8812d063008b6ACFD7353b/Ifr3OzMTICvAYMMpqp20ofs2kBlGajE9i_X9Ec7fz5M">https://mirror.xyz/0x0D16c0308B39E9576e8812d063008b6ACFD7353b/Ifr3OzMTICvAYMMpqp20ofs2kBlGajE9i_X9Ec7fz5M</a></p><p>7、The Sandbox将向Polygon链全体LAND地块持有者发起SAND代币空投。 信息源：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/0xPolygon/status/1487354463409287168?s=20&amp;t=cV6zx-0zcvgHVp2Q8XRaGg">https://twitter.com/0xPolygon/status/1487354463409287168?s=20&amp;t=cV6zx-0zcvgHVp2Q8XRaGg</a></p><p>8、投票获得NFT和参加抽奖活动。可以投3票。链可以选Polygon。</p><p>信息源：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/VotingDAO/status/1486225641150169088?s=20&amp;t=9ld_Uv-UKts2dM5c78U9wA">https://twitter.com/VotingDAO/status/1486225641150169088?s=20&amp;t=9ld_Uv-UKts2dM5c78U9wA</a></p>]]></content:encoded>
            <author>5-3@newsletter.paragraph.com (阿5)</author>
        </item>
        <item>
            <title><![CDATA[在币圈使用推特，你应该知道的那些技巧--初级篇]]></title>
            <link>https://paragraph.com/@5-3/rj2dATAcE55fZqI2wU3y</link>
            <guid>rj2dATAcE55fZqI2wU3y</guid>
            <pubDate>Wed, 16 Mar 2022 08:53:38 GMT</pubDate>
            <description><![CDATA[废话不多说，直接上干货，我把我使用推特的经验总结一下分享给大家。我们使用推特的目的:收集最新的有用的信息发布有用的信息，引流，吸粉，提高影响力关于如何收集有用的信息，这里有2个小技巧1，善于使用标签，英语叫hashtags 具体请参照推特官方文档： 举个栗子，当你对NFT感兴趣想找到更多的关于NFT的信息的时候，就可以直接在搜索栏里搜索#NFT，结果预览里就能看到过于一小时有多少条推文。搜索标签预览结果搜索标签预览结果 在搜索结果中，你能方便的查看到最热门的和最新的结果。标签搜索结果标签搜索结果 有的同学问这能有啥用呢？再举个栗子，你想要免费的nft，总是遗憾错过免费mint的时机，就可以经常去搜索栏搜索#NFTGiveaway，然后点击最新标签就能第一时间发现很多新项目的赠送活动信息。#NFTGiveaway的最新搜索结果#NFTGiveaway的最新搜索结果 在这里教大家一个能得到免费nft的方法，那就是使用标签 #FREENFT 或是 #FREEMINTs，我用这两个标签可mint了好多免费的NFT，虽然很多都没有什么价值，但是偶尔也有宝贝。 需要注意的是为了安全起见，一定...]]></description>
            <content:encoded><![CDATA[<p>废话不多说，直接上干货，我把我使用推特的经验总结一下分享给大家。</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">我们使用推特的目的:</h2><ul><li><p>收集最新的有用的信息</p></li><li><p>发布有用的信息，引流，吸粉，提高影响力</p></li></ul><h3 id="h-2" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">关于如何收集有用的信息，这里有2个小技巧</h3><p>1，善于使用<strong>标签</strong>，英语叫<strong>hashtags</strong> 具体请参照推特<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://help.twitter.com/en/using-twitter/how-to-use-hashtags">官方文档</a>：</p><p>举个栗子，当你对NFT感兴趣想找到更多的关于NFT的信息的时候，就可以直接在搜索栏里搜索#NFT，结果预览里就能看到过于一小时有多少条推文。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/e9c0428d6aa3f05e50e32ff1e39ef072b900cd43ec9c5d17a8257df007e46234.png" alt="搜索标签预览结果" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">搜索标签预览结果</figcaption></figure><p>搜索标签预览结果</p><p>在搜索结果中，你能方便的查看到<strong>最热门</strong>的和<strong>最新</strong>的结果。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/aa61edc9e43ab6d10d9ff5ad1d3fcc1020c610e99bed801b4962503223c93905.png" alt="标签搜索结果" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">标签搜索结果</figcaption></figure><p>标签搜索结果</p><p>有的同学问这能有啥用呢？再举个栗子，你想要免费的nft，总是遗憾错过免费mint的时机，就可以经常去搜索栏搜索<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/search?q=%23NFTGiveaway&amp;src=typeahead_click">#NFTGiveaway</a>，然后点击最新标签就能第一时间发现很多新项目的赠送活动信息。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/348320ac187e3a1011c488ae91e67b80bb21de1e5a2304f1ded6ecf3c312f619.png" alt="#NFTGiveaway的最新搜索结果" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">#NFTGiveaway的最新搜索结果</figcaption></figure><p>#NFTGiveaway的最新搜索结果</p><p>在这里教大家一个能得到免费nft的方法，那就是使用标签 <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/search?q=%23FreeNFT&amp;src=typeahead_click&amp;f=top">#FREENFT</a> 或是 <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/search?q=%23freemints&amp;src=typeahead_click&amp;f=top">#FREEMINTs</a>，我用这两个标签可mint了好多免费的NFT，虽然很多都没有什么价值，但是偶尔也有宝贝。</p><p><strong>需要注意的是为了安全起见，一定要使用新钱包去mint！一定要使用新钱包去mint！一定要使用新钱包去mint！</strong></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8b74b5ac0a412f3183e59ff337559425a19e6154148f96b56eb42110ca563d7b.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>常用标签有：</p><p><code>#Airdrops #CryptocurrencyNews #DeFi #FREENFT #FreeNFTs #Freemint #GameFi #NFT #NFTCollection #NFTCollector #NFTCommumity #NFTCommunity #NFTGiveaway #NFTS #NFTdrop #NFTdrops #NFTrade #NFTs #nftart #opensea</code></p><p>2，第二个技巧就是善用列表，列表有<strong>2个用途</strong>，<strong>第一个</strong>是你可以把你关注的人，像微信标签一样分类，例如：空投，投资者，投资机构，各种协议，中文大V之类的等等按照自己喜欢的分类创建，以下是我的列表：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/zlexdl/lists">https://twitter.com/zlexdl/lists</a></p><p>其中包含了一些我关注其他大V的列表。如果自己没时间或是整理不好的话，可以直接关注其他人的列表。过几天打算维护一个Notion的表格收集各种大V的列表。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/bf9d38cb28a46c6be7fdc6c01a46d22b0979896f5bae0842432ff1dfbe5d41d5.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5a1e221f405058f0ba4ff73727a7d7ef75ca00c6a4669cc139ad96ef012d0dff.png" alt="推特置顶列表" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">推特置顶列表</figcaption></figure><p>推特置顶列表</p><p><strong>而列表的另一个用途</strong>是根据大V找更多的大V，推特APP上有一个功能就是<strong>他们所在的列表</strong>，随便找一个大V，在右上角点击三个点，就能找到这个选项，点进去后发现大V所在的列表里其他人也有可能是大V，就这样顺腾摸瓜，你就可以找到很多相关的大V推特号以及大V所在的列表，接下来关注他们，每天过一遍，一定受益匪浅。(顶级社区<strong>鲨鱼团队</strong>的列表我就这样找出来的)</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/72f833cc59c21ded208f76f803621b8ab2a86d77cefaf4e4c92385816602f501.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">关于如何引流和吸粉，有以下几点:</h3><p><code>一 不要刚入门就发广告，次数多了，会被拉黑。twitter 作为一种社交营销方式，还是应该先社交再营销。当下社交网络都是强调人与人、人与品牌之间的联系与沟通，大家关注的是自己感兴趣的人或事，所以已经很难接受大众媒体时代的强制性广告植入。这就需要明白社交就是交朋友.先忘掉广告、忘掉推广、忘掉营销，先以交友的心态，拢聚粉丝，建立起忠诚度高的小社群。</code></p><p><code>二 了解客户的需求；有了一定量的小社群，就需要花时间去了解他们需要什么?他们感兴趣的是什么? 自己有多少次及时回答并解决了客户的问题？ 自己有什么资源可以真诚地分享出来，让粉丝们觉得关注自己不是浪费精力，而是有用的。</code></p><p><code>三，定期发声，用心写推文，利用粉丝感兴趣的内容编写软文，精心组织，做到每一篇推文都能引起用户关注转发点赞。让用户不仅愿意专注，还会引发他的共鸣，进而转发分享，那他的粉丝就能看到卖家的消息，他的粉丝可能也是卖家的目标客户，这样卖家的传播路径就扩宽了，可以形成良性循环。</code></p><p><code>四，个人资料要完善，当用户进入卖家的主页后，个人简介是他们最先看到的。第一印象很重要，所以简历不可少。</code></p><p><code>五，利用社交的一些功能：比如评论&amp; 点赞 &amp; 转发 &amp; “@” &amp; “#” 等,话题标签“#”的功能，一个话题标签，可以贯串Twitter上的同一个话题，让本来毫无关系的人，因为同一个标签而连接起来。通过这一标签更好地定位目标群体。同时，也可以多参与Twitter上的热门话题讨论，去结识大V。最后还要利用好图片或视频功能。Twitter的一条发言最多的只能有140个字符，添加图片或者视频，可以弥文字的不足的缺陷，更直观更贴切的给用户留下印象。</code></p><p><em>当然最快的方法其实是买粉，买粉除了数据好看，还能带动别人关注。</em></p><p>而你在发出一个特别热议的推文之后，你可以查看各种统计数据，点击推文的右下角图标就可以查看到推文分析数据</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/217b663b444ec1780956446b6c7befd3a558f2ba28388185f84d76357657d0dd.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1042804188b798186cf062ac384af0704b470ea0b03217a7e4d592163e5e8eb0.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>最后说一下，推特的标签【#】是非常好用的功能，很多网站都是用这个功能收集数据，然后做出APP去赚钱呢，所以大家可以深挖掘一下。</p><hr><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">推特的痛点：</h3><p><strong>痛点一：翻译功能</strong></p><p>虽然推特已经自带了谷歌翻译，但是麻烦的是要进入推文后才能点击翻译连接，而一些大V之间的互动要是一个一个点的话，就要累死了。</p><p>这里提供一个解决办法，虽然不是最优，但是不用一个一个点击去翻译，当然最优解决办法是提高英语水平。</p><p>首先去安装谷歌浏览器的著名插件：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?utm_source=chrome-ntp-icon">油猴</a>，英文叫<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?utm_source=chrome-ntp-icon">Tampermonkey</a></p><p>然后去安装一个叫【<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://greasyfork.org/zh-CN/scripts/378277-%E7%BF%BB%E8%AF%91%E6%9C%BA">翻译机</a>】的脚本</p><p>这个脚本还支持油管，电报，discord等常用的网页版APP。</p><p>效果如下：</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b541d47cf28b09e6494cc523733d686920be99e76f32fe8a3d9d69caa1a521fc.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><strong>痛点二：没有好用的收藏功能</strong></p><p>推特上信息实在是太多了，每天我都看不完，而有用的信息你可以点击like和rt，但当有一些大V分享一个有用的Link时，例如一篇mirror文章，不及时收藏的话，就再也找不到了，这里推荐大家一个好用的APP：Instapaper.com，其实就是稍后阅读。</p><p>先注册Instapaper用户，然后让推特和Instapaper关联起来就可以用了，点击推文下面的那个大【I】就可以了。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/22aa8f2d2b8be1a466eae2d094358bf1952ef2a951dee0330b2876e6bbd6eaa6.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>然后在Instapaper上就能收到这个link的内容</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/95ab65ba6046fa0aaf0912b211f33553af50e6a7969b17d09074c3d0a9e323ef.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Instapaper不仅支持推特还支持其他社交APP。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/0b2b558c56b1385204a2afed07f556bcb62ee0b8a974ff1bf3e4b6727a5fd15b.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>这个只是保存link及link中的内容的功能，有的同学可能需要保存推文内容，再推荐一个工具：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://heyslideit.com/">Heyslideit.com</a></p><p>他的功能就是保存推文到Notion，英文叫Save Tweets to Notion</p><p>但是需要熟悉Notion，做个数据库，然后按照一定规则保存就好了。这里就不写具体方法了。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1e00b1a00e5850968cde17f4467840c849d01885b80d306279d5822f1d180934.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>来自<strong>DFarm Club</strong></p>]]></content:encoded>
            <author>5-3@newsletter.paragraph.com (阿5)</author>
        </item>
        <item>
            <title><![CDATA[Pegasus测试网操作教程]]></title>
            <link>https://paragraph.com/@5-3/pegasus</link>
            <guid>k7XioQHa6W4UVinYFlM5</guid>
            <pubDate>Tue, 15 Mar 2022 23:57:36 GMT</pubDate>
            <description><![CDATA[Pegasus Finance 是一个 AMM 风格的利率永续平台。交易者可以为 Aave 和 Compound 等借贷平台借贷 APY 的多头和空头头寸。于 3 月 9 日启动了测试网。官方推特账号：https://twitter.com/0xPegasusFi官方Discord: discord.gg/BtuHTWUBAV测试网： trade.pegasusfinance.xyz 规则您可以在 Optimism Mainnet上的https://dashboard.pegasusfinance.xyz/上找到 Pegasus 的奖励计划“The Great Race” 。（如果您没有网络，请在https://chainlist.org/添加 Optimism Mainnet 。）您需要每天完成测试网任务或社交任务才能获得 $Sealed Pega 代币。目标是积累 120 $Seal Pega Token 以免费铸造 PegaPal NFT。以下是该计划的一些关键信息。一天4个任务每个任务获得 1 个 $Sealed Pega 代币$Sealed Pega 不可在地址之间转移...]]></description>
            <content:encoded><![CDATA[<p>Pegasus Finance 是一个 AMM 风格的利率永续平台。交易者可以为 Aave 和 Compound 等借贷平台借贷 APY 的多头和空头头寸。于 3 月 9 日启动了测试网。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/7e76140994e501e81681ec70895dcb991cabb05face4f80fa42976a4f68dc026.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>官方推特账号：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/0xPegasusFi">https://twitter.com/0xPegasusFi</a></p></li><li><p>官方Discord: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.co/DZbGunaE8O">discord.gg/BtuHTWUBAV</a></p></li><li><p>测试网： <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.co/lYTL9UgPI1">trade.pegasusfinance.xyz</a></p></li><li><p> 规则</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ba46414e631b49e7b49832589cb1a6a86d76c2f4f42ce19f9eb862e1f6179cf5.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>您可以在 Optimism Mainnet上的<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://dashboard.pegasusfinance.xyz/">https://dashboard.pegasusfinance.xyz/</a>上找到 Pegasus 的奖励计划“The Great Race” 。</p></li><li><p>（如果您没有网络，请在<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chainlist.org/">https://chainlist.org/</a>添加 Optimism Mainnet 。）</p></li><li><p>您需要每天完成测试网任务或社交任务才能获得 $Sealed Pega 代币。目标是积累 120 $Seal Pega Token 以免费铸造 PegaPal NFT。以下是该计划的一些关键信息。</p></li><li><p>一天4个任务</p></li><li><p>每个任务获得 1 个 $Sealed Pega 代币</p></li><li><p>$Sealed Pega 不可在地址之间转移</p></li><li><p>PegaPal 铸币厂价格为 120 美元密封 Pega 代币</p></li><li><p>先到先得</p></li><li><p>铸造 PegaPal 后，您可以将其质押以赚取可交易的 $PEGA 或出售（价值约 0.5 ETH）。</p></li><li><p>有关“伟大种族”的详细信息，请阅读<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://pegasusfinance.medium.com/pegapals-part-1-task-contributors-d1bca0a986ff">此处</a>。</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/90f8f17f3d4fba321b9463cf74dfca00ec7c58f66ca8ed17b884542d45cfc684.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>添加Optimism Kovan网络</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4a24e12e7655f2d6b8072c3f9b0595d78a7691e124cb3cf9a1a95a60c1e765f2.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>复制钱包地址跳转到<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://faucet.paradigm.xyz/">https://faucet.paradigm.xyz/</a>领取测试币</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b3d4227bac95059df0b540d2d7616c8974fed8a62b32539a11813ca890fc6bfe.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>登入推特账号（帐户必须至少有 1 条推文、15 位关注者，并且必须超过 1 个月）\</p><p> 1 进入[https://trade.pegasusfinance.xyz/连接钱包。](https://trade.pegasusfinance.xyz/%E8%BF%9E%E6%8E%A5%E9%92%B1%E5%8C%85%E3%80%82)\ 2 做合约\ 首先做多 AAVE USDC 利率市场。选择Long 使用 50 倍杠杆，大小为 1 WETH。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/490d7a31951250ec91f316e7dbbccb8cdddf730a09e65426fe73c4e091f0d8ff.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>点击右边的x（Close Position）</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/7cd003980214f7452e8e132503f969255603e6eb66a0b43aec830aadc1d0b8ba.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1d2bc42ae8b715e545596d92ffcf69af644f6fa9b72a3c6723e09f4ba7bd0c63.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>2 添加流动性</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ce9bba29fde2c262ef6c190ad51247bfc5d1cc624cad842f0bc5b01f279e1ecc.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c9694ff476ad3d1c34cad0fa393b2227001cf08223e2f6bffe40212bc5c86546.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>3 完成 <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://dashboard.pegasusfinance.xyz/#/home">Pegasus</a>上的日常任务</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/6ab53466856b758feb78f670423e828f733abeab943d99bf1742792086100444.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>任务1：将 Pega🦄 添加到您的 Twitter 名称</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/aee2310bb7d88fe4203914ba26e01991a9a32193269e3c98f2672eb6407d789f.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>任务2：在 Perp 测试网中查找错误</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5b30c07bb608047e1b6bdd84a7f784df9cfdc3044062d69c0e29c8aa93e1472f.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>任务3：转发和喜欢</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/fd8204c201141f9e1cf3f7cd2feb49198bd05b811b92ed89ebcd7be350edcdb6.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>任务4：关注</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/d136d1aad164e5542881e82960b0a25eb70471534f8b734ba28e9118dd4385cf.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>以上为Pegasus测试网教程</p></li><li><p>欢迎大家关注<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/DaKuan_">@DaKuan</a>，了解更多空投讯息，保姆级空投教程，互相交流进步！</p></li><li><p>推特账号：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/DaKuan_">https://twitter.com/DaKuan_</a></p></li><li><p>油管账号：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.youtube.com/channel/UCSBB-psRcFfybzC-YoeAySQ">https://www.youtube.com/channel/UCSBB-psRcFfybzC-YoeAySQ</a></p></li></ul>]]></content:encoded>
            <author>5-3@newsletter.paragraph.com (阿5)</author>
        </item>
    </channel>
</rss>