<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>web3 on 黑猫说</title>
    
    
    
    <link>https://zhaowang.me/categories/web3/</link>
    <description>Recent content in web3 on 黑猫说</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 04 Jul 2022 15:20:00 +0000</lastBuildDate>
    
	<atom:link href="https://zhaowang.me/categories/web3/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>学习web3的第三天-感受ether的心跳</title>
      <link>https://zhaowang.me/archives/web3-third-day/</link>
      <pubDate>Mon, 04 Jul 2022 15:20:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/web3-third-day/</guid>
      <description>
        
          
          
          
        
        
        &lt;h1 id=&#34;学习web3的第三天&#34;&gt;学习web3的第三天&lt;/h1&gt;
&lt;p&gt;前两天主要学习了solidity的语言语法，以及合约的知识，并且部署到一个测试环境。&lt;/p&gt;
&lt;p&gt;今天呢，我们来操作线上的环境:),哈哈哈，不是真正的写，仅仅读取一些线上的交易消息，感受下ether的律动。&lt;/p&gt;
&lt;h1 id=&#34;预备&#34;&gt;预备&lt;/h1&gt;
&lt;h2 id=&#34;1-申请一个infura的账号&#34;&gt;1 申请一个infura的账号&lt;/h2&gt;
&lt;p&gt;直接官网申请即可，他是一个web2的服务，提供的api服务，把ether的信息转换成一个api和消息投递出来。你也可以本地启动一个ether的node，来接入node也可以。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.infura.io/infura/getting-started&#34;&gt;infura&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;主要作用：提供一个proxy，把ether的信息转换成一个api和消息投递出来。&lt;/p&gt;
&lt;p&gt;这里需要注册一个账户，并且拿到一个project-id,有足够的的免费额度，供你使用&lt;/p&gt;
&lt;h2 id=&#34;2-打开etherscan来进行一个信息的比对和查询确保后续测试正常&#34;&gt;2 打开etherscan，来进行一个信息的比对和查询，确保后续测试正常&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://etherscan.io/&#34;&gt;etherscan&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;3-打开vscode准备写代码&#34;&gt;3 打开vscode，准备写代码&lt;/h2&gt;
&lt;p&gt;do by yourself&lt;/p&gt;
&lt;h1 id=&#34;读ether和监听ether的交易消息&#34;&gt;读ether和监听ether的交易消息&lt;/h1&gt;
&lt;h2 id=&#34;1-先来读取一个ether的最高交易区块&#34;&gt;1 先来读取一个ether的最高交易区块&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 获取最高交易区块，使用infura的api
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;client&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;rpc&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Dial&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://mainnet.infura.io/v3/&amp;lt;YOUR-PROJECT-ID&amp;gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Fatalf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Could not connect to Infura: %v&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lastBlock&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Block&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;client&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Call&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;lastBlock&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;eth_getBlockByNumber&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;latest&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Cannot get the latest block:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 获取最高区块的高度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Latest block: %v\n&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;lastBlock&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Number&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;2-监听newblock事件&#34;&gt;2 监听NewBlock事件&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 获取最高交易区块，使用infura的websocket
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ws&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ethclient&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Dial&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;wss://mainnet.infura.io/ws/v3/&amp;lt;YOUR-PROJECT-ID&amp;gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Fatal&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 设置监听事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; make(&lt;span style=&#34;color:#66d9ef&#34;&gt;chan&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;types&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Header&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;sub&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ws&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;SubscribeNewHead&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;context&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Background&lt;/span&gt;(), &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Fatal&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 监听事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;select&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;sub&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Err&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Fatal&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;header&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;header&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Hash&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;Hex&lt;/span&gt;()) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;block&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ws&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;BlockByHash&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;context&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Background&lt;/span&gt;(), &lt;span style=&#34;color:#a6e22e&#34;&gt;header&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Hash&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Fatal&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;block&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Hash&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;Hex&lt;/span&gt;())        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;block&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Number&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;Uint64&lt;/span&gt;())  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;block&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Time&lt;/span&gt;())           
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;block&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Nonce&lt;/span&gt;())            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(len(&lt;span style=&#34;color:#a6e22e&#34;&gt;block&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Transactions&lt;/span&gt;()))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;3-other-things&#34;&gt;3 other things&lt;/h2&gt;
&lt;h1 id=&#34;结语&#34;&gt;结语&lt;/h1&gt;
&lt;p&gt;现在有一个go的代码环境，可以来进行web3的交互，交易等，也是操作过线上环境了。来吧，感受下ether的律动。那一笔笔的交易消息，就是这个时代的心跳。&lt;/p&gt;
&lt;h1 id=&#34;参考文章&#34;&gt;参考文章&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://kay-is.github.io/web3-from-zero/&#34;&gt;web3-from-zero&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.infura.io/infura/getting-started&#34;&gt;infura&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://etherscan.io/&#34;&gt;etherscan&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://goethereumbook.org/&#34;&gt;goethereumbook&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;本文源代码&#34;&gt;本文源代码&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/nullsimon/contract-go-demo&#34;&gt;solidity-contract-go-demo&lt;/a&gt;&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>学习web3的第二天</title>
      <link>https://zhaowang.me/archives/web3-second-day/</link>
      <pubDate>Sun, 03 Jul 2022 17:10:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/web3-second-day/</guid>
      <description>
        
          
          
          
        
        
        &lt;h1 id=&#34;学习web3的第二天&#34;&gt;学习web3的第二天&lt;/h1&gt;
&lt;p&gt;今天就学习下写以太坊合约，并且部署到以太坊网络上，再创建一个读合约的go版本的api server。&lt;/p&gt;
&lt;p&gt;使用到的技术如下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;go&lt;/li&gt;
&lt;li&gt;ethereum&lt;/li&gt;
&lt;li&gt;solidity&lt;/li&gt;
&lt;li&gt;ganache-cli&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;预备软件安装&#34;&gt;预备：软件安装&lt;/h1&gt;
&lt;h2 id=&#34;1-安装golang&#34;&gt;1 安装golang&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install golang
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;2-安装ethereum&#34;&gt;2 安装ethereum&lt;/h2&gt;
&lt;p&gt;follow official site &lt;a href=&#34;https://geth.ethereum.org/docs/install-and-build/installing-geth#macos-via-homebrew&#34;&gt;geth&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;主要作用，提供一些命令行，如 apigen ，生成合约的go代码&lt;/p&gt;
&lt;h2 id=&#34;3-安装solidity&#34;&gt;3 安装solidity&lt;/h2&gt;
&lt;p&gt;follow official site &lt;a href=&#34;https://docs.soliditylang.org/en/v0.8.2/installing-solidity.html&#34;&gt;soliditylang&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;主要作用，提供solidity 的命令行，如 solc&lt;/p&gt;
&lt;h2 id=&#34;4-安装ganache-cli&#34;&gt;4 安装ganache-cli&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install ganache-cli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;主要作用，提供一个本地的节点，用来测试合约的功能&lt;/p&gt;
&lt;h1 id=&#34;写合约主要源代码-solidity-代码&#34;&gt;写合约主要源代码-solidity 代码&lt;/h1&gt;
&lt;h2 id=&#34;1-写合约的solidity代码&#34;&gt;1 写合约的solidity代码&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// SPDX-License-Identifier: MIT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;pragma&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;solidity&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8&lt;/span&gt;.&lt;span style=&#34;color:#ae81ff&#34;&gt;15&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MySmartContract&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Hello&lt;/span&gt;() &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;returns&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;memory&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Greet&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;memory&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;returns&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;memory&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解释：首先是一个无参数的方法，Hello，一个是有参数的方法，Greet。&lt;/p&gt;
&lt;h2 id=&#34;2-根据合约生成go代码&#34;&gt;2 根据合约生成go代码&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;solc --optimize --abi ./contracts/MySmartContract.sol -o build
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;solc --optimize --bin ./contracts/MySmartContract.sol -o build
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;abigen --bin&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;./build/MySmartContract.bin --abi&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;./build/MySmartContract.abi --pkg&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;api --out&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;./api/MySmartContract.go
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解释：solc 命令，将solidity代码转换成二进制文件，并且生成abi文件，apigen 生成go相关的代码，并且生成到api目录下。供后续deploy和client使用&lt;/p&gt;
&lt;h2 id=&#34;3-写go的部署合约代码&#34;&gt;3 写go的部署合约代码&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 此处连接的是你本地的节点，也就是ganache-cli提供的，需要注意换成你自己的
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;client&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ethclient&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Dial&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://127.0.0.1:8545&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 此处的私钥，换成ganache-cli 提供的，并且去掉开头的 0x 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;privateKey&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;crypto&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;HexToECDSA&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;be1b85896f93f5d18fe2cf28b81daecbf790e33bdd96fb52a056d669b0c93cde&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 部署代码到本地的以太坊网络上
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;address&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;tx&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;instance&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;DeployApi&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;auth&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;client&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;4-写go的读合约代码&#34;&gt;4 写go的读合约代码&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 这里的address是你部署的合约地址，也就是部署完成后，会提供你一个合约地址
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;conn&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;NewApi&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;common&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;HexToAddress&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;351dd6679c502b41c221ab749666d4ca6c6b8f5d&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#a6e22e&#34;&gt;client&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 调用合约的方法使用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;GET&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/greet/:message&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;echo&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Context&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;error&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Param&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;reply&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;conn&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Greet&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;bind&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;CallOpts&lt;/span&gt;{}, &lt;span style=&#34;color:#a6e22e&#34;&gt;message&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;JSON&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;http&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;StatusOK&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;reply&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;部署合约与之进行交互&#34;&gt;部署合约，与之进行交互&lt;/h1&gt;
&lt;h2 id=&#34;1-开启一个ganache-cli节点&#34;&gt;1 开启一个ganache-cli节点&lt;/h2&gt;
&lt;p&gt;一行命令即可&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ganache-cli 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;会给你自动生成一些账户，私钥公钥。&lt;/p&gt;
&lt;h2 id=&#34;2-部署合约&#34;&gt;2 部署合约&lt;/h2&gt;
&lt;p&gt;成功之后，会给你一个合约地址，可以用来调用合约的方法，也就是client所需要用到的&lt;/p&gt;
&lt;p&gt;0x351DD6679C502xxxxx21aB749666d4Ca6C6b8f5D&lt;/p&gt;
&lt;h2 id=&#34;3-调用合约的方法&#34;&gt;3 调用合约的方法&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl http://localhost:1323/greet/hello
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl http://localhost:1323/hello
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;成功！！！&lt;/p&gt;
&lt;h1 id=&#34;参考文章&#34;&gt;参考文章&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://towardsdev.com/creating-a-simple-ethereum-smart-contract-in-golang-138b9439f64e&#34;&gt;Creating a simple Ethereum Smart Contract in Golang&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;本文源代码&#34;&gt;本文源代码&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/nullsimon/contract-go-demo&#34;&gt;solidity-contract-go-demo&lt;/a&gt;&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>学习web3的第一天</title>
      <link>https://zhaowang.me/archives/web3-first-day/</link>
      <pubDate>Sat, 02 Jul 2022 15:40:00 +0000</pubDate>
      
      <guid>https://zhaowang.me/archives/web3-first-day/</guid>
      <description>
        
          
          
          
        
        
        &lt;h1 id=&#34;学习web3的第一天&#34;&gt;学习web3的第一天&lt;/h1&gt;
&lt;p&gt;闲着无事，虽然自己对web3热情满满，但实际并没有去参与，仅仅是买点币作为一个对行业的贡献。&lt;/p&gt;
&lt;p&gt;前几天看到一个twitter话题，说一周学会web3开发，来吧，说干就干，开始学习。&lt;/p&gt;
&lt;p&gt;此篇文章仅做记录使用，记录自己的收获和学习过程。&lt;/p&gt;
&lt;h1 id=&#34;学习过程&#34;&gt;学习过程&lt;/h1&gt;
&lt;h2 id=&#34;1-打开google-docs看了下描述&#34;&gt;1 打开google docs，看了下描述&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.google.com/spreadsheets/u/0/d/1xn3lofvsVf4Zc2iaudZ1VRIXSnkXysdUi75DYKRlw-I/htmlview#&#34;&gt;一周学会 Web 3 开发 - 建议收集&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;从中发觉到几个网站，开始进行遍历和递归查找。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/AmazingAng/WTFSolidity&#34;&gt;solidity极简入门&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kay-is/web3-from-zero&#34;&gt;web3-from-zero&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-先遍历solidity极简入门&#34;&gt;2 先遍历solidity极简入门&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;看了solidity的变量、函数、类等概念，在remix操作一番，结束,结果发现了一个uint256，这个感觉是从go中来的，翻看起来go-ethereum的代码，发现了一个uint256类型。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;发现新的点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;uint256 &lt;a href=&#34;https://github.com/holiman/uint256&#34;&gt;uint256&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;go-ethereum &lt;a href=&#34;https://github.com/go-ethereum/go-ethereum&#34;&gt;go-ethereum&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3-uint256-类型&#34;&gt;3 uint256 类型&lt;/h2&gt;
&lt;p&gt;一看这个就是大数，go中最大是uint64, 256的话，就是四个uint64，是一个slice。打开uint256的github，一看才100多个star，这个是一个经典的类型，可以看出实际没有人关心这个类型，只关心它的操作。没有业务上的意义，不好展开。&lt;/p&gt;
&lt;p&gt;github首页重点讲了他和标准库的对比，就是比标准库的bigint 强悍多少多少。自己没跑过benchmark，怀着好奇，用github的codespace打开一个实例，然后跑了下benchmark，哇，比bigint快好多。&lt;/p&gt;
&lt;h2 id=&#34;4-go-ethereum-的依赖库分析&#34;&gt;4 go-ethereum 的依赖库分析&lt;/h2&gt;
&lt;p&gt;本来是去找下uint256在go-ethereum中的依赖和使用的，意外打开了go.mod,所以顺藤摸瓜的看了看go-ethereum的依赖库，发现了很多有名的go library。&lt;/p&gt;
&lt;p&gt;首先是依赖的云服务，可以看出是aws和azure,cloudflare 具体要看怎么用的&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;azure-storage-blob-go &lt;a href=&#34;https://github.com/Azure/azure-sdk-for-go&#34;&gt;azure-storage-blob-go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;aws-sdk-go &lt;a href=&#34;https://github.com/aws/aws-sdk-go-v2&#34;&gt;aws-sdk-go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;cloudflare-go &lt;a href=&#34;https://github.com/cloudflare/cloudflare-go&#34;&gt;cloudflare-go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;docker &lt;a href=&#34;https://github.com/docker/docker&#34;&gt;docker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;数据结构，用到了lru&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hashicorp/golang-lru &lt;a href=&#34;https://github.com/hashicorp/golang-lru&#34;&gt;golang-lru&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;fastcache &lt;a href=&#34;https://github.com/VictoriaMetrics/fastcache&#34;&gt;fastcache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;golang-set &lt;a href=&#34;https://github.com/deckarep/golang-set&#34;&gt;golang-set&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;mmap &lt;a href=&#34;https://github.com/edsrzf/mmap-go&#34;&gt;mmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;stack &lt;a href=&#34;https://github.com/go-stack/stack&#34;&gt;go-stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;uint256 &lt;a href=&#34;https://github.com/holiman/uint256&#34;&gt;uint256&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;bloomfilter &lt;a href=&#34;https://github.com/holiman/bloomfilter/v2&#34;&gt;bloomfilter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;数据传输&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;protobuf &lt;a href=&#34;https://github.com/golang/protobuf&#34;&gt;protobuf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;websocket &lt;a href=&#34;https://github.com/gorilla/websocket&#34;&gt;websocket&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;id生成器&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;google/uuid &lt;a href=&#34;https://github.com/google/uuid&#34;&gt;uuid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;数据库&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;influxdb &lt;a href=&#34;https://github.com/influxdata/influxdb&#34;&gt;influxdb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;leveldb &lt;a href=&#34;https://github.com/syndtr/goleveldb&#34;&gt;leveldb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;tsdb &lt;a href=&#34;https://github.com/prometheus/tsdb&#34;&gt;tsdb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;yml解析&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;toml &lt;a href=&#34;https://github.com/naoina/toml&#34;&gt;toml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;加解密&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;x-crypto &lt;a href=&#34;https://golang.org/x/crypto&#34;&gt;x-crypto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;gnark-crypto &lt;a href=&#34;https://github.com/consensys/gnark-crypto&#34;&gt;gnark-crypto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;消息&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;notify &lt;a href=&#34;https://github.com/rjeczalik/notify&#34;&gt;notify&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;btc&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;btc &lt;a href=&#34;https://github.com/btcsuite/btcd/btcec/v2&#34;&gt;btcsuite&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;测试&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;testify &lt;a href=&#34;https://github.com/stretchr/testify&#34;&gt;testify&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;5-再遍历下-web3-from-zero&#34;&gt;5 再遍历下 web3-from-zero&lt;/h2&gt;
&lt;p&gt;又跑题了，首先看到一个前端学习网站&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.freecodecamp.org/&#34;&gt;freecodecamp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;回到正题，从这个网站看，就两个主题，使用js读和写ethereum的web3。后续看看，应该不难&lt;/p&gt;
&lt;h1 id=&#34;结果&#34;&gt;结果&lt;/h1&gt;
&lt;p&gt;把solidity看完了，给自己加个任务，下个系列，去阅读分析go-ethereum的依赖库。&lt;/p&gt;

        
        </description>
    </item>
    
  </channel>
</rss>