<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Block Chain | Chia-An Lee</title><link>https://calee0219.github.io/tag/block-chain/</link><atom:link href="https://calee0219.github.io/tag/block-chain/index.xml" rel="self" type="application/rss+xml"/><description>Block Chain</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><copyright>©</copyright><lastBuildDate>Mon, 09 Aug 2021 07:48:37 +0800</lastBuildDate><image><url>https://calee0219.github.io/media/icon_hu_da05098ef60dc2e7.png</url><title>Block Chain</title><link>https://calee0219.github.io/tag/block-chain/</link></image><item><title>Docker 實作 PoW</title><link>https://calee0219.github.io/blog/cryptocurrency_ethereum_pow_w_docker/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/cryptocurrency_ethereum_pow_w_docker/</guid><description>&lt;h2 id="安裝"&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker pull calee0219/ca_geth&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;更好的版本 XD
&lt;code&gt;docker pull blakeberg/geth-node&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="快速安裝"&gt;快速安裝&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;使用
&lt;/li&gt;
&lt;li&gt;這樣就可以開始挖 CACoin 啦~&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker run ca_geth -t /root/init_start.sh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="叢集版本"&gt;叢集版本&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="安裝-1"&gt;安裝&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;docker
詳情請看
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;執行 &amp;amp; 進入 ubuntu docker&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --name first_node -i -t ubuntu /bin/bash &lt;span class="c1"&gt;# 這個 docker 是用來跑私鏈的&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;docker 內安裝 geth&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;升級 ubuntu apt-get&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;安裝 geth&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get install software-properties-common
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add-apt-repository -y ppa:ethereum/ethereum
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get install ethereum
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="以上動作"&gt;以上動作&lt;/h3&gt;
&lt;p&gt;你也可以考慮直接使用
，裡面的功能更完備 XD&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull blakeberg/geth-node
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d -h geth --name geth -p 20022:22 -p 8545:8545 blakeberg/geth-node
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh geth@localhost -p &lt;span class="m"&gt;20022&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="撰寫創世區塊-genesis"&gt;撰寫創世區塊 (Genesis)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;利用 &lt;code&gt;puppeth&lt;/code&gt; 幫助撰寫&lt;/li&gt;
&lt;li&gt;照著互動式指令即可
&lt;ol&gt;
&lt;li&gt;下 &lt;code&gt;puppeth&lt;/code&gt; 指令&lt;/li&gt;
&lt;li&gt;對此創世區塊命名&lt;/li&gt;
&lt;li&gt;選擇 2 新增設定檔&lt;/li&gt;
&lt;li&gt;選擇 1 PoW&lt;/li&gt;
&lt;li&gt;若希望有一開始就存在的節點，將其節點地址複製到此，最後保留一個 0x 結束&lt;/li&gt;
&lt;li&gt;設定 network id (留白則會預設 random)&lt;/li&gt;
&lt;li&gt;其他想要設定的資訊&lt;/li&gt;
&lt;li&gt;選擇 2 儲存設定檔&lt;/li&gt;
&lt;li&gt;Ctrl-C 結束設定&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="架設節點"&gt;架設節點&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;初始化節點
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;geth --datadir &amp;quot;./[資料存放資料夾]&amp;quot; --networkid [剛剛設定的 networdid] --rpc init [創世區塊.json]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;出現 &amp;ldquo;successfully wrote genesis block and/or chain rule set:&amp;hellip;&amp;rdquo; 字樣則成功開啟&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--maxpeers&lt;/code&gt;: 最多可連結點數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--nodiscover&lt;/code&gt;: 不可讓一般人找到 (需要手動加入節點)
&lt;ul&gt;
&lt;li&gt;在 geth 指令加入 &lt;code&gt;--bootnodes&lt;/code&gt; 參數&lt;/li&gt;
&lt;li&gt;進到 console 裡使用 &lt;code&gt;admin.addPeer()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;存成 static-nodes.json 檔，讓geth自動連線&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--netrestrict&lt;/code&gt;: 讓節點只會接受在指定IP子網域內的連線&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--rpc&lt;/code&gt;: 启动 rpc 通信，可以进行智能合约的部署和调试&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;新增帳戶(account)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;geth account new&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;也可以在 js console 裡下 &lt;code&gt;personal.newAccount(&amp;quot;passphrase&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;預設位置是放在 &lt;code&gt;./ethereum/keystorm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--datadir&lt;/code&gt;: 設定檔放置位置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;啟動並進入節點 console
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;geth --datadir &amp;quot;./[資料存放資料夾]&amp;quot; --networkid [剛剛設定的 networdid] console --mine&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;最後面也可以不用加 console&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--rpc&lt;/code&gt;: 啟動 rpc 通信，可以进行智能合約的部署和調適&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--rpcaddr&lt;/code&gt;: default rpc ip 是 0.0.0.0，只有內部網路才能連，加 &lt;code&gt;--rpcaddr {ip}&lt;/code&gt; 後，rpc 的 port 才會是外部也可以連，只是可能會不安全&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--rpcport&lt;/code&gt;: 指定 rpc port&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="啟動其他節點"&gt;啟動其他節點&lt;/h2&gt;
&lt;p&gt;其實就是 架設節點&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;節點初始化
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;geth --datadir &amp;quot;./[資料存放資料夾]&amp;quot; --networkid [剛剛設定的 networdid] --bootnodes enode://[主鏈 id]@[主鏈 ip]:30303 console --mine&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;30303: 預設 port&lt;/li&gt;
&lt;li&gt;主機 ip: docker 了話，可以使用 &lt;code&gt;docker inspect [container name] | grep IPAddress&lt;/code&gt; 來查找 container 被配置的區域 ip&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--mine&lt;/code&gt;: 直接開始 mining&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--bootnodes&lt;/code&gt;: 若不加入這個參數，節點可能會需要在網路上找其他節點找很久&lt;/li&gt;
&lt;li&gt;主鏈 id: 可以用 &lt;code&gt;admin.nodeInfo&lt;/code&gt; 查找&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;新增帳戶(account)
&lt;ul&gt;
&lt;li&gt;一定要有帳戶才能收到挖礦的 $$ 啊～～～&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;啟動節點
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;geth --datadir &amp;quot;./[資料存放資料夾]&amp;quot; --networkid [剛剛設定的 networdid] console --mine&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="確認節點同步"&gt;確認節點同步&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;net.listening&lt;/code&gt;: 確認是否有在監聽其他節點&lt;/li&gt;
&lt;li&gt;&lt;code&gt;net.peerCount&lt;/code&gt;: 監聽其他節點數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;admin.peers&lt;/code&gt;: 查看節點資訊&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="檢查錢包"&gt;檢查錢包&lt;/h2&gt;
&lt;p&gt;這是最重要的 XD
&lt;code&gt;web3.fromWei(eth.getBalance(eth.coinbase), &amp;quot;ether&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="交易"&gt;交易&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;參數版
&lt;code&gt;eth.sendTransaction({from: eth.coinbase, to: &amp;quot;0x154230ed91d1e711e56b9c0f88b5ba5fd2b0503f&amp;quot;, value: web3.toWei(1, &amp;quot;ether&amp;quot;),gas:22000,gasPrice:web3.toWei(45,&amp;quot;Shannon&amp;quot;),data: web3.toHex('ZeroCool')})&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;簡單版
&lt;code&gt;eth.sendTransaction({from: eth.coinbase, to: &amp;quot;0x154230ed91d1e711e56b9c0f88b5ba5fd2b0503f&amp;quot;, value: web3.toWei(1, &amp;quot;ether&amp;quot;)})&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ether Explorer 架設</title><link>https://calee0219.github.io/blog/cryptocurrency_ethereum_explorer/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/cryptocurrency_ethereum_explorer/</guid><description>&lt;h2 id="explorer"&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;提供類似 EtherScan 的功能&lt;/li&gt;
&lt;li&gt;用 pulling 的方式更新，效能較差&lt;/li&gt;
&lt;li&gt;UI 好看&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="安裝"&gt;安裝&lt;/h3&gt;
&lt;h4 id="前處理"&gt;前處理&lt;/h4&gt;
&lt;p&gt;需要先有 npm, bower&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install nodejs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install npm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install bower
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;geth 需要開 rpc&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;geth --rpc --rpcaddr localhost --rpcport 8545 --rpcapi &amp;#34;web3,eth&amp;#34; --rpccorsdomain &amp;#34;http://localhost:8000&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--rpc&lt;/code&gt;: 把 rpc 開出來&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--rpcaddr&lt;/code&gt;: 指定 rpc 可以吃得 address，不寫 default 是 localhost&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--rpcport&lt;/code&gt;: 指定 rpc port，不寫 default 是 8545&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--rpcapi&lt;/code&gt;: 指定 rpc 提供的服務&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--rpccorsdomain&lt;/code&gt;: CORS domain，詳見
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="軟題"&gt;軟題&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/carsenk/explorer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd explorer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bower install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="啟動"&gt;啟動&lt;/h4&gt;
&lt;p&gt;建議先開個 tmux 或 screen&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install tmux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd explorer # 如果沒有在專案資料夾內，需要記得進去
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;到這裡，基本上就能在自己的電腦上的 http://localhost:8000 上看到 explorer 了&lt;/p&gt;
&lt;h4 id="如果還想讓別人看到了話"&gt;如果還想讓別人看到了話：&lt;/h4&gt;
&lt;h5 id="geth-部分"&gt;geth 部分&lt;/h5&gt;
&lt;p&gt;要把 loopback 的 localhost 改掉&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;geth --rpc --rpcaddr 你的對外 ip&lt;span class="o"&gt;(&lt;/span&gt;或者 0.0.0.0&lt;span class="o"&gt;)&lt;/span&gt; --rpcport &lt;span class="m"&gt;8545&lt;/span&gt; --rpcapi &lt;span class="s2"&gt;&amp;#34;web3,eth&amp;#34;&lt;/span&gt; --rpccorsdomain &lt;span class="s2"&gt;&amp;#34;你的 domain (或者 *)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你都看不懂，可以考慮直接寫&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;geth --rpc --rpcaddr 0.0.0.0 --rpcport &lt;span class="m"&gt;8545&lt;/span&gt; --rpcapi &lt;span class="s2"&gt;&amp;#34;web3,eth&amp;#34;&lt;/span&gt; --rpccorsdomain &lt;span class="s2"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="explorer-部分"&gt;explorer 部分&lt;/h5&gt;
&lt;p&gt;修改 &lt;code&gt;app/app.js&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;GETH_HOSTNAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;your-domain/ip&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// put your IP address!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="其他"&gt;其他&lt;/h5&gt;
&lt;p&gt;如果有開防火牆，記得把規則加進去&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ufw allow 8545/tcp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ufw allow 8000/tcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;可以考慮直接把 8000 port 開出去給別人&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果是用 private ip，記得確認上層 NAT port forwarding 是否有把 port 開起來&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;也可以考慮用 nginx proxy 出去
nginx 設定 &lt;code&gt;/etc/nginx/sites-enabled/etherexplorer.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 80;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_name your-domain;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location / {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass http://localhost:8000;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_http_version 1.1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Upgrade $http_upgrade;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Connection &amp;#34;upgrade&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="etherchain-light"&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;比 explorer 更多功能&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ethstats 佈署</title><link>https://calee0219.github.io/blog/cryptocurrency_ethereum_ethstats/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/cryptocurrency_ethereum_ethstats/</guid><description>&lt;p&gt;分別需要兩個 repo&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;api 的:
&lt;/li&gt;
&lt;li&gt;前端的:
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="什麼是-netstats"&gt;什麼是 netstats&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ethereum 監控網路節點狀態的視覺化網頁呈現&lt;/li&gt;
&lt;li&gt;任何人都可以在EthStats仪表板上添加他们的节点&lt;/li&gt;
&lt;li&gt;展示重要信息，诸如现在的区块，散表难度，gas价格和gas花费等&lt;/li&gt;
&lt;li&gt;架構: 後端在每一台 node 上，主動利用 instance-api 以 WebSocket 提供資訊給前端，前端統一在一台 server 接受推播&lt;/li&gt;
&lt;li&gt;後端可自己自由架設&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="api-部份架設"&gt;api 部份架設&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;需求&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;節點必須是 rpc 開啟的
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;geth --rpc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;需要連得到指定節點的 rpc port (default 8545)
&lt;ul&gt;
&lt;li&gt;可用 &lt;code&gt;nc -v [ip] [port]&lt;/code&gt; 測試&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;需要有 pm2
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo npm install -g pm2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下載&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/cubedro/eth-net-intelligence-api
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; eth-net-intelligence-api
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改設定檔
在 app.json&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;env&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; “RPC_HOST” : “localhost”,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; “RPC_PORT” : “8545”,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; “LISTENING_PORT” : “30303”,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; “INSTANCE_NAME” : “”,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; “CONTACT_DETAILS” : “”,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; “WS_SERVER” : “ http://localhost:3000”,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; “WS_SECRET” : “lalaland”,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; “VERBOSITY” : 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;RPC_HOST:&lt;/li&gt;
&lt;li&gt;RPC_PORT: 給出資訊的節點的 port&lt;/li&gt;
&lt;li&gt;LISTENING_PORT: ethereum 將會監聽的 port&lt;/li&gt;
&lt;li&gt;INSTANCE_NAME: 對節點的命名，可隨便填，&lt;font style="color:red;"&gt;但是一定要填&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;CONTACT_DETAILS: 若要分享合約資訊，則需要填寫此欄位&lt;/li&gt;
&lt;li&gt;WS_SERVER: 網頁伺服器會使用的 ip / hostname : port
(這裡填入的是前端 ethstats WebSocket 所在的位置(可以在不同的主機上))&lt;/li&gt;
&lt;li&gt;WS_SECRET: 指定一個密鑰，和網頁伺服器建立連線時使用&lt;/li&gt;
&lt;li&gt;VERBOSITY:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;啟動
&lt;code&gt;pm2 start app.json&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果出現 &lt;code&gt;/usr/bin/env: 'node': No such file or directory&lt;/code&gt;
下 &lt;code&gt;apt-get install nodejs-legacy&lt;/code&gt; 指令&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="前端架設"&gt;前端架設&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;需求
&lt;ul&gt;
&lt;li&gt;需要有 grunt
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo npm install -g grunt-cli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下載
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/cubedro/eth-netstats
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; eth-netstats
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grunt all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;啟動
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;要在 bash 下&lt;/strong&gt; (至少 fish 的變數不是這樣下的 XD)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WS_SECRET=&amp;quot;{密鑰}&amp;quot; npm start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;密鑰 要與上面的 WS_SECRET 在相同的地方&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nginx-proxy-設定"&gt;NGINX proxy 設定&lt;/h2&gt;
&lt;p&gt;只需要對前端做 proxy 就可以了~&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 80;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_name ethstats.calee.com.tw;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location / {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass http://localhost:3000;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_http_version 1.1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Upgrade $http_upgrade;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Connection &amp;#34;upgrade&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="參考"&gt;參考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mastering in Bitcoin 讀書筆記</title><link>https://calee0219.github.io/blog/cryptocurrency_mastering_in_bitcoin/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/cryptocurrency_mastering_in_bitcoin/</guid><description>&lt;p&gt;
&lt;/p&gt;
&lt;h2 id="ch1--ch2"&gt;Ch1 / Ch2&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ch3-比特幣客戶端"&gt;Ch3 比特幣客戶端&lt;/h2&gt;
&lt;p&gt;以
為主&lt;/p&gt;
&lt;p&gt;也可以到
直接選擇 binary file 執行&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;下載並切換版本&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Download&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/bitcoin/bitcoin.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; bitcoin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 檢查版本 &amp;amp; 切換&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git tag
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git checkout &lt;span class="o"&gt;{&lt;/span&gt;tag&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;自動產生相關檔案
&lt;code&gt;./autogen.sh&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;參數設定&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./configure --help
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./configure &lt;span class="o"&gt;{&lt;/span&gt;需要的參數&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;之後軟體會檢查所需要的相關軟體，若沒有，會中途中止，安裝完後重跑即可
過程中可能會遇到一些 bug，可以先到
參考需要安裝的東西&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;編譯與安裝&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="開啟"&gt;開啟&lt;/h3&gt;
&lt;p&gt;安裝完後，應該會有 &lt;code&gt;bitcoind&lt;/code&gt;, &lt;code&gt;bitcoin-cli&lt;/code&gt; 等指令可以用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用 &lt;code&gt;which bitcoind&lt;/code&gt; 可以查看安裝位置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitcoind&lt;/code&gt;: 開啟服務&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;~/.bitcoin/bitcoin.conf&lt;/code&gt; 修改設定檔
&lt;ul&gt;
&lt;li&gt;用戶名 &amp;amp; 密碼
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;rpcuser&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bitcoinrpc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;rpcpassword&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2XA4DuKNCbtZXsBQRRNDEwEY2nM6M4H9Tx5dFjoAVVbK
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;其他設定參數
&lt;code&gt;bitcoind --help&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitcoind --daemon&lt;/code&gt;: 在後台執行&lt;/li&gt;
&lt;li&gt;第一次運行時，會同步區塊，至少會有 122GB 以上，可能需要 2 天的時間下載區塊&amp;hellip;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/Lz3S2OR.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="json-rpc-api"&gt;JSON-RPC API&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;bitcoin 提供 json-rpc api&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitcoin-cli help&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitcoin-cli getinfo&lt;/code&gt;: 獲得基本資訊 (網路節點，錢包，區塊數據&amp;hellip;)
&lt;ul&gt;
&lt;li&gt;version, protocolversion, walletversion: 版本&lt;/li&gt;
&lt;li&gt;balance: 錢包餘額&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="錢包設定及加密"&gt;錢包設定及加密&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在生成密鑰或其他指令前，需要先對錢包加密
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bitcoin-cli encryptwallet {密碼}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;解鎖錢包
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bitcoin-cli walletpassp {密碼} {時間/秒}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="備份"&gt;備份&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bitcoin-cli backupwallet {檔名}&lt;/code&gt;: 匯出成可以匯入的檔案&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitcoin-cli importwallet {檔名}&lt;/code&gt; (需要是錢包解鎖的狀態)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitcoin-cli dumpwallet {檔名}&lt;/code&gt;: 將錢包匯出成人看得懂的明文&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="地址--交易"&gt;地址 &amp;amp; 交易&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bitcoin-cli getnewaddress&lt;/code&gt;: 產生新的 address&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitcoin-cli getreceivedbyaddress {地址} 0&lt;/code&gt;: 若有匯錢進來，可以檢查匯入的錢&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitcoin-cli listtransactions&lt;/code&gt;: 列出所有交易&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitcoin-cli listaddressbyaccount &amp;quot;&amp;quot;&lt;/code&gt;: 列出所有地址&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitcoin-cli getbalence&lt;/code&gt;: 列出錢包總額&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitcoin-cli gettransaction {txid}&lt;/code&gt;: 列出 txid 的交易明細&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="區塊"&gt;區塊&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bitcoin-cli getblock {區塊的 hash}&lt;/code&gt;: 查看這個 block 的內容&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ch4-密鑰-地址-錢包"&gt;Ch4 密鑰-地址-錢包&lt;/h2&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/zeXOX07.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="密鑰"&gt;密鑰&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;$1$ ~ $2^{256}$&lt;/li&gt;
&lt;li&gt;生成方法：密碼學安全隨機源取出一串隨機字串 -&amp;gt; sha256 -&amp;gt; 檢查是否小於 $n-1$&lt;/li&gt;
&lt;li&gt;256 bit，但可以用不同的表示法
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/8gjTSqB.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;base58check-&amp;gt;hex: &lt;code&gt;sx base58check-decode ...&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;hex-&amp;gt;base58check: &lt;code&gt;sx base58check-encode {hex} {prefix}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="公鑰"&gt;公鑰&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用 ECC (橢圓曲線) 從私鑰生成&lt;/li&gt;
&lt;li&gt;公鑰 = 私鑰 * G&lt;/li&gt;
&lt;li&gt;G: 生成點，bitcoin 的生成點是固定的&lt;/li&gt;
&lt;li&gt;secp256k1 標準的橢圓曲線&lt;/li&gt;
&lt;li&gt;$y^2=(x^3+7)$ over $F_p$&lt;/li&gt;
&lt;li&gt;$y^2\mod p = (x^3+7)\mod p$&lt;/li&gt;
&lt;li&gt;$p = 2^{256}-2^{32}-2^9-2^8-2^7-2^6-2^4-1$&lt;/li&gt;
&lt;li&gt;無窮點對 (0)&lt;/li&gt;
&lt;li&gt;加法定義$P_1=P_2+P_3$&lt;/li&gt;
&lt;li&gt;$K=k*G$
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/nT8sxsu.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;格式
&lt;ul&gt;
&lt;li&gt;非壓縮型
&lt;ul&gt;
&lt;li&gt;prefix: 04&lt;/li&gt;
&lt;li&gt;K = 04xy&lt;/li&gt;
&lt;li&gt;520bit: 8 + 256 + 256&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;壓縮型
&lt;ul&gt;
&lt;li&gt;prefix: 02 / 03&lt;/li&gt;
&lt;li&gt;有 x，有曲線方程式，可算出 y&lt;/li&gt;
&lt;li&gt;解方程式時，y 有平方 =&amp;gt; 有兩解 =&amp;gt; 用 02 / 03 區別奇偶&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;壓縮格式公鑰產生的地址會與非壓縮的不一樣&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;=&amp;gt; 現在的協定多以非壓縮為主&lt;/li&gt;
&lt;li&gt;but 應該還是要能支援非壓縮&lt;/li&gt;
&lt;li&gt;WIF (錢包導入格式) 應該要標示出私鑰產生的公鑰是否為壓縮格式 (基本上就是要說明這把私鑰最終產生的地址應該要是哪一個)&lt;/li&gt;
&lt;li&gt;壓縮格式私鑰:
&lt;ul&gt;
&lt;li&gt;私鑰 + &amp;lsquo;01&amp;rsquo;&lt;/li&gt;
&lt;li&gt;用來表示這個私鑰的 address 是用壓縮格式公鑰產生的&lt;/li&gt;
&lt;li&gt;事實上會比私鑰長 XD&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WIF
&lt;ul&gt;
&lt;li&gt;使用壓縮格式導出私鑰時，永遠只用 WIF 壓縮格式 (K or L 前綴 (因為經過 Base58Check 格式作為最終輸出格式))&lt;/li&gt;
&lt;li&gt;使用非壓縮，導出時使用 WIF 格式 (5 前綴)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="地址"&gt;地址&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;hash160 / double hash&lt;/li&gt;
&lt;li&gt;address = RIPEMD160(SHA256(K))&lt;/li&gt;
&lt;li&gt;經過 base58check 編碼呈現&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/lc2hEYS.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Base58: base64 去掉易混淆單字 ex. O, 0, I, l&amp;hellip;&lt;/li&gt;
&lt;li&gt;Base58Check: Base58 + error check&lt;/li&gt;
&lt;li&gt;$checksum = sha256(sha256(prefix+data))$ (data 是公鑰哈希，而不是純公鑰)&lt;/li&gt;
&lt;li&gt;只取前四個 bit
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/7xU5Ory.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;prefix
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/lIX7xIr.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="比特幣錢包"&gt;比特幣錢包&lt;/h3&gt;
&lt;p&gt;錢包是私鑰的容器&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;非確定性錢包：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;隨機生成 n 個私鑰，每個只使用一次&lt;/li&gt;
&lt;li&gt;需要整份備份&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;確定性種子錢包&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;單向離像方程式&lt;/li&gt;
&lt;li&gt;公共種子&lt;/li&gt;
&lt;li&gt;種子可以產生所有錢包裡的私鑰，因此只要備份種子就好了&lt;/li&gt;
&lt;li&gt;輔助記憶詞彙
&lt;ul&gt;
&lt;li&gt;易於記憶&lt;/li&gt;
&lt;li&gt;種子對應確定性錢包的隨機數&lt;/li&gt;
&lt;li&gt;BIP0039
&lt;ol&gt;
&lt;li&gt;生成 128~256 位 (2^&amp;hellip;) 的隨機數&lt;/li&gt;
&lt;li&gt;用 sha256 hash，取前幾位，生成 check bit&lt;/li&gt;
&lt;li&gt;num + check bit&lt;/li&gt;
&lt;li&gt;把數字分解成 11 位不同的集合 (11 bit 切一組，切成 n 組)，與預先定義好的字典做對應&lt;/li&gt;
&lt;li&gt;生成 12 ~ 24 個 word 的助記碼
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/KoQcb3F.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;分層性錢包 (HD 錢包)
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/bz9ljMP.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BIP0032 標準&lt;/li&gt;
&lt;li&gt;母鑰匙生成子鑰匙&lt;/li&gt;
&lt;li&gt;樹狀結構&lt;/li&gt;
&lt;li&gt;建立公共密鑰的序列而不需要訪問相對的私鑰&lt;/li&gt;
&lt;li&gt;每筆交易發行不同的公鑰&lt;/li&gt;
&lt;li&gt;從種子產生 HD
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/FE5SOSD.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
![](
=150x)&lt;/li&gt;
&lt;li&gt;CKD (child key derivation)&lt;/li&gt;
&lt;li&gt;三個主要元素：
&lt;ul&gt;
&lt;li&gt;母私鑰&lt;/li&gt;
&lt;li&gt;鏈碼 (256bit)&lt;/li&gt;
&lt;li&gt;索引號 (index, 32bit)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;母公鑰 + 鏈碼 + 索引號 =&amp;gt; HMAC-sha512 =&amp;gt; 分成兩個 256 bit
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/K9fqChd.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;子密鑰無法 trace back 母密鑰&lt;/li&gt;
&lt;li&gt;子密鑰在沒有鏈碼下，也無法 trace 兄弟密鑰&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="擴展鑰匙-extending-key"&gt;擴展鑰匙 (extending key)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;鑰匙 + 鏈碼&lt;/li&gt;
&lt;li&gt;兩種
&lt;ul&gt;
&lt;li&gt;密鑰 + 鏈碼
&lt;ul&gt;
&lt;li&gt;可以衍生出子密鑰&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;公鑰 + 鏈碼
&lt;ul&gt;
&lt;li&gt;可以衍生出子公鑰&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;也是用 Base58Check 表示
&lt;ul&gt;
&lt;li&gt;512 or 513 bit&lt;/li&gt;
&lt;li&gt;前綴 &amp;lsquo;xprv&amp;rsquo; or &amp;lsquo;xpub&amp;rsquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="硬化子密鑰"&gt;硬化子密鑰&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;擴展公鑰可以衍生出所有鏈碼，只要有某一個子私鑰洩漏，就會從被洩露的子私鑰開始，得到所有私鑰 =&amp;gt; 不夠安全&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;子私鑰 &amp;amp; 母鏈碼 可以推測母私鑰！！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;hardened derivation
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/eFRP2OW.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;索引號&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;32 bit&lt;/li&gt;
&lt;li&gt;正常衍生: $0$ ~ $2^{31-1}$&lt;/li&gt;
&lt;li&gt;強化衍生: $2^{31}$ ~ $2^{32-1}$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="高級私鑰--地址"&gt;高級私鑰 &amp;amp; 地址&lt;/h3&gt;
&lt;p&gt;BIP0038: 使用另一個 key + AES 對私鑰加密&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前綴: 6P&lt;/li&gt;
&lt;li&gt;用 AES + key 轉換回前綴為 5 的 base58check 格式&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="p2sh--多重簽名地址"&gt;P2SH &amp;amp; 多重簽名地址&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;P2SH: Pay-to-Script Hash&lt;/li&gt;
&lt;li&gt;P2SH 地址: 前綴 3&lt;/li&gt;
&lt;li&gt;收益者不是地址所有人，而會是交易雙方&lt;/li&gt;
&lt;li&gt;目前常用在 多重簽名地址 script
&lt;ul&gt;
&lt;li&gt;script 需要多個簽名來證明所有權&lt;/li&gt;
&lt;li&gt;N 個密碼中，至少需要 M 個來簽，才能證明所有權&lt;/li&gt;
&lt;li&gt;詳細放在 ch5&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="靚號地址"&gt;靚號地址&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;地址中有指定的 pattern
&lt;ul&gt;
&lt;li&gt;ex. iloveyou&amp;hellip;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;用不斷的 hash 密鑰，直到找到符合 pattern 的密鑰&lt;/li&gt;
&lt;li&gt;如果特定 pattern 夠長，可以增加地址比對時的安全性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="紙錢包"&gt;紙錢包&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;將地址印在紙上，通常會配合 BIP0038 地址加密&lt;/li&gt;
&lt;li&gt;可多次存入，但最好一次性提取，避免產生找零地址 (?)&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/1XjdFPz.jpg" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ch5-交易"&gt;Ch5 交易&lt;/h2&gt;
&lt;h3 id="交易生命週期"&gt;交易生命週期&lt;/h3&gt;
&lt;h2 id="ch6-比特幣網路"&gt;Ch6 比特幣網路&lt;/h2&gt;
&lt;h2 id="ch7-區塊鏈"&gt;Ch7 區塊鏈&lt;/h2&gt;
&lt;h3 id="簡介"&gt;簡介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;包含交易訊息由後向前有序連接
&lt;ul&gt;
&lt;li&gt;flat file&lt;/li&gt;
&lt;li&gt;LevelDB (Google)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;每一塊都指向前一塊
&lt;ul&gt;
&lt;li&gt;垂直的 stack&lt;/li&gt;
&lt;li&gt;創世區塊為最底塊&lt;/li&gt;
&lt;li&gt;高度代表該區塊與創世區塊之間的距離&lt;/li&gt;
&lt;li&gt;頂端添加新區塊&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;區塊識別
&lt;ul&gt;
&lt;li&gt;區塊頭做 SHA256 兩次&lt;/li&gt;
&lt;li&gt;利用區塊頭的父區塊 hash 值識別父區塊&lt;/li&gt;
&lt;li&gt;可以從最新的區塊一路往回追溯至創世區塊，形成區塊鏈&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;分岔
&lt;ul&gt;
&lt;li&gt;每個區塊僅有一父區塊，但可能暫時擁有多個子區塊&lt;/li&gt;
&lt;li&gt;多個區塊幾乎同時被礦工挖出時發生&lt;/li&gt;
&lt;li&gt;解決方法後面會詳細說明&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;安全性
&lt;ul&gt;
&lt;li&gt;若要竄改一區塊內容則必須重新計算該區塊 hash 值，接著更新子區塊頭的父區塊 hash 值，一直更新到最新的區塊為止，如此的計算資源龐大不易成功&lt;/li&gt;
&lt;li&gt;差不多六個區塊後可被竄改的機會非常低&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="區塊結構"&gt;區塊結構&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;包含交易訊息的資料結構
&lt;ul&gt;
&lt;li&gt;區塊頭
&lt;ul&gt;
&lt;li&gt;80 bytes&lt;/li&gt;
&lt;li&gt;區塊識別&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;區塊主體
&lt;ul&gt;
&lt;li&gt;大小可變&lt;/li&gt;
&lt;li&gt;紀錄交易&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;平均每筆交易至少 250 bytes&lt;/li&gt;
&lt;li&gt;平均每個區塊至少 500 個交易
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/CjidmkR.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="區塊頭"&gt;區塊頭&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;父區塊 hash 值
&lt;ul&gt;
&lt;li&gt;用於指向父區塊&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Merkle root
&lt;ul&gt;
&lt;li&gt;可有效總結區塊中所有交易的資料結構&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Nonce、難度目標、時間戳記與挖礦相關，會在之後說明
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/0FLk3tN.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="區塊識別"&gt;區塊識別&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;區塊頭 hash 值
&lt;ul&gt;
&lt;li&gt;32 bytes&lt;/li&gt;
&lt;li&gt;SHA256 兩次區塊頭所得的數位指紋&lt;/li&gt;
&lt;li&gt;唯一明確的識別一個區塊&lt;/li&gt;
&lt;li&gt;第一個比特幣區塊頭 hash 值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;區塊高度
&lt;ul&gt;
&lt;li&gt;創世區塊高度為零&lt;/li&gt;
&lt;li&gt;每增加一個區塊高度加一&lt;/li&gt;
&lt;li&gt;並不一定是唯一識別，在區塊鏈分岔時同一高度有多個區塊&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;兩者並不包含在區塊中，在節點接收區塊時計算並儲存，便於查詢檢索&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="創世區塊"&gt;創世區塊&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2009 年創建&lt;/li&gt;
&lt;li&gt;所有區塊的祖先&lt;/li&gt;
&lt;li&gt;編入比特幣客戶端程式中，確保創世區塊不會改變，並從此建構區塊鏈&lt;/li&gt;
&lt;li&gt;
中可以看到創世區塊詳細內容&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="區塊的連接"&gt;區塊的連接&lt;/h3&gt;
&lt;p&gt;比特幣的完整節點是從創世節點到最新節點的一個本地副本，當接收到一個新區塊時，需驗證然後接到現有區塊上&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;檢查傳入的區塊頭並尋找父區塊
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/YTpywFx.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="merkle-tree"&gt;Merkle tree&lt;/h3&gt;
&lt;p&gt;區塊中包含的所有交易以 Merkle tree 形式呈現&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hash 二元平衡樹&lt;/li&gt;
&lt;li&gt;用於快速歸納和檢驗大規模數據完整性&lt;/li&gt;
&lt;li&gt;快速驗證區塊中的交易是否存在&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="建立方法"&gt;建立方法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;hash 方法採用 double-SHA256&lt;/li&gt;
&lt;li&gt;由葉節點建立到根節點&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;將所有元素做 double-SHA256 後放入葉節點&lt;/li&gt;
&lt;li&gt;串聯兩節點的 hash 值做 double-SHA256 生成父節點&lt;/li&gt;
&lt;li&gt;重複步驟 2 直到剩下一個節點為止，此點即為 Merkle root&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/uaRcghh.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;若葉節點個數為奇數則將最後一筆交易重複一次，以維持偶數個葉節點&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/JpKEPLm.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id="驗證交易存在"&gt;驗證交易存在&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;綠色為要驗證的交易對應的節點&lt;/li&gt;
&lt;li&gt;藍色為 Merkle 路徑&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/7Lis8PB.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;若要驗證交易是否存在可以參考 Merkle tree 建立方法，將 Merkle 路徑與該交易依序做 hash 生成藍色虛線的節點，最終比較 Merkle root 是否相同，即可得知該交易是否存在於區塊中&lt;/p&gt;
&lt;h4 id="效率"&gt;效率&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;時間複雜度 ${O(log\ n)}$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/UUb0RXT.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="簡單支付驗證-spv"&gt;簡單支付驗證 (SPV)&lt;/h3&gt;
&lt;p&gt;利用 Merkel tree 驗證交易，SPV 不下載交易紀錄和區塊，僅保存區塊頭，利用 Merkle 路徑驗證交易存在&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Merkel 區塊
&lt;ul&gt;
&lt;li&gt;區塊頭&lt;/li&gt;
&lt;li&gt;Merkel 路徑&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ch8-挖礦與共識"&gt;Ch8 挖礦與共識&lt;/h2&gt;
&lt;h3 id="簡介-1"&gt;簡介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;挖礦
&lt;ul&gt;
&lt;li&gt;增加比特幣&lt;/li&gt;
&lt;li&gt;保護比特幣系統安全&lt;/li&gt;
&lt;li&gt;提供算力獲取比特幣&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;礦工
&lt;ul&gt;
&lt;li&gt;驗證每筆交易並記錄到區塊鏈中&lt;/li&gt;
&lt;li&gt;平均 10 分鐘挖出一個新的區塊&lt;/li&gt;
&lt;li&gt;得到新幣獎勵和手續費&lt;/li&gt;
&lt;li&gt;工作量證明&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;發行
&lt;ul&gt;
&lt;li&gt;預計發行到 2140 年，上限為 2100 萬個&lt;/li&gt;
&lt;li&gt;每隔 210000 塊 (大約 4 年)，新區塊挖出獎勵減半&lt;/li&gt;
&lt;li&gt;2009 / 01 獎勵 50 比特幣&lt;/li&gt;
&lt;li&gt;2012 / 11 獎勵 25 比特幣&lt;/li&gt;
&lt;li&gt;2016 / 07 獎勵 12.5 比特幣&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="比特幣經濟學和貨幣創造"&gt;比特幣經濟學和貨幣創造&lt;/h4&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/dEiBmbL.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;抗通膨
&lt;ul&gt;
&lt;li&gt;總量有限&lt;/li&gt;
&lt;li&gt;發行速度遞減&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;通縮貨幣
&lt;ul&gt;
&lt;li&gt;貨幣供需不平衡所導致增值&lt;/li&gt;
&lt;li&gt;隨時間增長有愈來愈強的購買力&lt;/li&gt;
&lt;li&gt;是否會有隱藏未知的經濟風險&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="去中心化共識"&gt;去中心化共識&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;沒有經過明確的投票或固定達成共識的時間&lt;/li&gt;
&lt;li&gt;異步互動更新&lt;/li&gt;
&lt;li&gt;每個全節點依據綜合標準對每個交易進行獨立驗證&lt;/li&gt;
&lt;li&gt;通過完成工作量證明演算法的驗算，礦工將交易紀錄獨立打包進新區塊&lt;/li&gt;
&lt;li&gt;每個節點獨立的對新區塊進行檢驗並加入區塊鏈&lt;/li&gt;
&lt;li&gt;每個節點對區塊鏈進行獨立選擇，在工作量證明機制下選擇累計工作量較大的區塊&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="交易的獨立檢驗"&gt;交易的獨立檢驗&lt;/h3&gt;
&lt;p&gt;收到一個交易時先驗證交易，有效交易繼續傳播，無效則丟棄&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/qZJY7Ez.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;詳細可參考
、
、
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;隨時間可能會有所改變，為處理惡意攻擊或要使交易更多樣化而放寬&lt;/li&gt;
&lt;li&gt;收到交易後對全網廣播前先驗證，並以接收順序建立交易池&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="挖礦節點"&gt;挖礦節點&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;接收驗證交易並在新區塊中整合&lt;/li&gt;
&lt;li&gt;隨時監聽新區塊，若有人已經打包出新區塊則放棄，繼續打包下一個區塊&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="整合交易至區塊"&gt;整合交易至區塊&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在接收到新節點時，將交易池中已打包的交易移除&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="交易塊齡礦工費和優先級"&gt;交易塊齡、礦工費和優先級&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;塊齡為 UTXO 被記錄到區塊前所經過的區塊數&lt;/li&gt;
&lt;li&gt;按照礦工費排序，優先將高礦工費的交易打包&lt;/li&gt;
&lt;li&gt;優先級
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Priority = Sum (Value of input * Input Age) / Transaction Size&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果區塊有足夠空間，則高優先級的交易將不需礦工費&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="鑄幣交易-coinbase"&gt;鑄幣交易 (coinbase)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;打包出新區塊的獎勵&lt;/li&gt;
&lt;li&gt;沒有輸入，不消耗 UTXO&lt;/li&gt;
&lt;li&gt;輸出到礦工地址&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="coinbase-獎勵與礦工費"&gt;coinbase 獎勵與礦工費&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;GetBlockValue&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int64_t&lt;/span&gt; &lt;span class="nf"&gt;GetBlockValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;nHeight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int64_t&lt;/span&gt; &lt;span class="n"&gt;nFees&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int64_t&lt;/span&gt; &lt;span class="n"&gt;nSubsidy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;COIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;halvings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nHeight&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;SubsidyHalvingInterval&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//210000 blocks
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;halvings&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;nFees&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;nSubsidy&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;halvings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;nSubsidy&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;nFees&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;礦工費
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Total Fees = Sum(Inputs) Sum(Outputs)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="鑄幣交易結構"&gt;鑄幣交易結構&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;普通交易
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/uvLAOYc.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;鑄幣交易
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/symOzly.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="coinbase-數據"&gt;coinbase 數據&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;不包含 scriptSig 以 coinbase 取代，最小 2 bytes 最大 100 bytes&lt;/li&gt;
&lt;li&gt;除了開始的幾個 bytes 外，礦工可以任意填充其他部分&lt;/li&gt;
&lt;li&gt;創世區塊中的 coinbase&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;The Times 03/Jan/2009 Chancellor on brink of second bailout for banks&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;利用 coinbase 實現 extra nonce 功能，標示挖出的礦池&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="構造區塊頭"&gt;構造區塊頭&lt;/h3&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/rL9fO9l.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="建構區塊"&gt;建構區塊&lt;/h3&gt;
&lt;p&gt;藉由修改 nonce 值重複計算區塊頭 hash 值，直到符合難度條件&lt;/p&gt;
&lt;h4 id="工作量證明算法"&gt;工作量證明算法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;hash 輸入長度任意，輸出長度固定且對於不同字串輸出幾乎不會相同，可作為數位指紋&lt;/li&gt;
&lt;li&gt;有意選擇輸入並生成一個特定 hash 值幾乎不可能&lt;/li&gt;
&lt;li&gt;礦工藉由修改 nonce 直到區塊頭 hash 值足夠小&lt;/li&gt;
&lt;li&gt;可藉由統計估算礦工工作量&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="難度表示"&gt;難度表示&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;難度位、bits&lt;/li&gt;
&lt;li&gt;前 1 byte 為冪次後為係數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;target = coefficient * 2^(8 * (exponent – 3))&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;範例：難度位的值為 0x1903a30c&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;target = 0x03a30c * 2^(0x08 * (0x19 0x03))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;=&amp;gt; target = 0x03a30c * 2^(0x08 * 0x16)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;=&amp;gt; target = 0x03a30c * 2^0xB0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;=&amp;gt; target = 0x0000000000000003A30C00000000000000000000000000000000000000000000
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="難度目標與難度調整"&gt;難度目標與難度調整&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;維持 10 分鐘生成一個區塊&lt;/li&gt;
&lt;li&gt;每個完整節點自動調整
&lt;ul&gt;
&lt;li&gt;每 2016 個區塊的時間與 20160 分鐘比較來調整難度&lt;/li&gt;
&lt;li&gt;&lt;code&gt;New Difficulty = Old Difficulty * (Actual Time of Last 2016 Blocks / 20160 minutes)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;每次調整幅度最高為 4 倍，平衡算力和難度巨大差異&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;難度與交易量和金額無關&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="成功建構區塊"&gt;成功建構區塊&lt;/h3&gt;
&lt;p&gt;算出符合條件的特定 nonce 值後立即發給相鄰節點，其他節點驗證通過後在發送出去，同時放棄打包同高度的區塊立即開始打包下一塊&lt;/p&gt;
&lt;h3 id="檢驗新區塊"&gt;檢驗新區塊&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;每個節點獨立驗證
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/ayJn4gL.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h3 id="區塊鏈的組裝與選擇"&gt;區塊鏈的組裝與選擇&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;將區塊集合至最大工作量證明的鏈上&lt;/li&gt;
&lt;li&gt;節點維護的區塊
&lt;ul&gt;
&lt;li&gt;連接到主鏈&lt;/li&gt;
&lt;li&gt;分支或備用鏈&lt;/li&gt;
&lt;li&gt;孤兒區塊&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;兩區塊在短時間內被挖出，節點可能會以相反的順序接收接收，造成孤兒區塊&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="區塊練的分岔"&gt;區塊練的分岔&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;區塊不同時間抵達節點導致不同副本不一致&lt;/li&gt;
&lt;li&gt;每個節點延長最大工作量的鏈&lt;/li&gt;
&lt;li&gt;最終可以收斂到一致的狀態&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;礦工幾乎同時挖到區塊，各自廣播出去形成分支&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/sNF9v5t.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;其中一條鏈先挖到下一區塊&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/g9cOp4R.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;重新共識收斂為同一主鏈&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/wvgC3DQ.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="挖礦與算力競賽"&gt;挖礦與算力競賽&lt;/h3&gt;
&lt;p&gt;極富競爭性並且算力以指數及成長
CPU ${\rightarrow}$ GPU ${\rightarrow}$ FPGA ${\rightarrow}$ ASIC&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/tOpvaLA.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/14WoJbH.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id="隨機值升位方案"&gt;隨機值升位方案&lt;/h4&gt;
&lt;p&gt;算力增加使得難度增加，所需的隨機值不足&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;早期可以透過修改時間戳解決，但移動太多會變成無效區塊&lt;/li&gt;
&lt;li&gt;利用 coinbase 交易可以在 coinbase script 裡寫入任意值，進而改變 Merkel root 作為額外隨機值來源&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="礦池"&gt;礦池&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;礦工合作組成
&lt;ul&gt;
&lt;li&gt;集合算力&lt;/li&gt;
&lt;li&gt;分享獎勵&lt;/li&gt;
&lt;li&gt;減少不確定性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;設定較低的難度
&lt;ul&gt;
&lt;li&gt;評估各礦工算力&lt;/li&gt;
&lt;li&gt;算出來的解並不一定滿足新區塊要求&lt;/li&gt;
&lt;li&gt;有時產出符合的區塊可以一起分潤&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="共識攻擊"&gt;共識攻擊&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;51% 攻擊
&lt;ul&gt;
&lt;li&gt;算力過大，30% 以上就有威脅&lt;/li&gt;
&lt;li&gt;至多可影響最近 10 個區塊&lt;/li&gt;
&lt;li&gt;實現雙花或拒絕他人交易&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;防禦
&lt;ul&gt;
&lt;li&gt;等待 6 個以上區塊確認&lt;/li&gt;
&lt;li&gt;第三方等多方認證簽名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在算力以指數及增加的現今要達成攻擊難上加難&lt;/p&gt;</description></item><item><title>以太坊 相關資源連結</title><link>https://calee0219.github.io/blog/cryptocurrency_ethereum_intro/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/cryptocurrency_ethereum_intro/</guid><description>&lt;h2 id="名詞介紹"&gt;名詞介紹&lt;/h2&gt;
&lt;h3 id="geth"&gt;Geth&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;啟動 geth
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;geth --datadir &amp;quot;/root/chain&amp;quot; console&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;其中 datadir用於指定數據目錄。這個目錄不能夠預先創建，否則命令會失敗&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="帳戶-地址"&gt;帳戶 (地址)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;產生私鑰 (32 Byte)&lt;/li&gt;
&lt;li&gt;由私鑰推導出公鑰，ECDSA 算法 (64 Byte)&lt;/li&gt;
&lt;li&gt;公鑰推導出地址 (20 Byte)
&lt;ul&gt;
&lt;li&gt;公鑰 (64 Byte)&lt;/li&gt;
&lt;li&gt;公鑰進行 Keccak-256 hash，變成 32 Byte&lt;/li&gt;
&lt;li&gt;32 Byte 前的 12 Byte 移除，剩下的 20 Byte 就是地址&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;帳戶地址&lt;/li&gt;
&lt;li&gt;合約地址&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="genesis-file"&gt;(Genesis File)&lt;/h3&gt;
&lt;h3 id="gas"&gt;GAS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;BitCoin 是發行自己的數字貨幣&lt;/li&gt;
&lt;li&gt;Eth 希望是用相同的規範(protocal)，創造自己的利用(ex 貨幣, 合約)&lt;/li&gt;
&lt;li&gt;可是你在使用他的服務產生自己的利用時，是需要礦工的支援&lt;/li&gt;
&lt;li&gt;Gas 就是你付費給礦工的單位(手續費)&lt;/li&gt;
&lt;li&gt;=&amp;gt; 運行一個合約要付出一定的 Gas&lt;/li&gt;
&lt;li&gt;Gas 同時也要能夠確保合約能夠停止&lt;/li&gt;
&lt;li&gt;BitCoin 的手續費是以交易大小作計算&lt;/li&gt;
&lt;li&gt;Eth 是以礦工運算的複雜度做計算&lt;/li&gt;
&lt;li&gt;Gas 是隨市場波動而改變&lt;/li&gt;
&lt;li&gt;如何計算 Gas: &amp;hellip;&lt;/li&gt;
&lt;li&gt;wei 1e-18&lt;/li&gt;
&lt;li&gt;Gwei 1e-9&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="token"&gt;Token&lt;/h3&gt;
&lt;h3 id="pos"&gt;PoS&lt;/h3&gt;
&lt;p&gt;Proof-of-Stack&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工作量證明&lt;/li&gt;
&lt;li&gt;PoW 在資源的浪費太高了&lt;/li&gt;
&lt;li&gt;當你在鍊上擁有的 Eth 越多，時間越長，你就應該擁有較高的寫帳權力&lt;/li&gt;
&lt;li&gt;sharping algo
&lt;ul&gt;
&lt;li&gt;想解決運算太慢而無法 handle 以後更高的交易量&lt;/li&gt;
&lt;li&gt;資料庫的概念&lt;/li&gt;
&lt;li&gt;礦工分組 =&amp;gt; 效能提升&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PoS 難點:
&lt;ul&gt;
&lt;li&gt;需計算擁有多少 Eth &amp;amp; 擁有多久&lt;/li&gt;
&lt;li&gt;統計擁有 Eth 量是需要不被外界影響的 =&amp;gt; 不能寫在 client (可以騙你我有)&lt;/li&gt;
&lt;li&gt;可能需要用 sandbox&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pow-poa-pos"&gt;PoW, PoA, PoS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="與-bitcoin-的差別"&gt;與 Bitcoin 的差別&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h3 id="evm"&gt;EVM&lt;/h3&gt;
&lt;h3 id="memory"&gt;Memory&lt;/h3&gt;
&lt;h3 id="圖靈完備語言"&gt;圖靈完備語言&lt;/h3&gt;
&lt;h3 id="hash-speed"&gt;Hash Speed&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bitcoin 平均交易需要 10 分鐘，而 Ethereum 只要 15 秒&lt;/li&gt;
&lt;li&gt;在 Bitcoin 中，若 A 區塊尚未擴散，B 區塊就已經產生了話，可能會只有一個區塊進入主鏈，被放棄的區塊內的交易就不會發生&lt;/li&gt;
&lt;li&gt;為了避免這個狀況，Eth 獎勵礦工納入上一輪被丟失的區塊&lt;/li&gt;
&lt;li&gt;被丟失的區塊稱作孤塊 (Orphaned block)，這些被納入的孤塊稱作叔塊 (Uncle block) ，這套獎勵機制名為 GHOST 演算法&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ether-錢包"&gt;Ether 錢包&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="線上錢包"&gt;線上錢包&lt;/h3&gt;
&lt;h3 id="mist"&gt;Mist&lt;/h3&gt;
&lt;h3 id="parity"&gt;Parity&lt;/h3&gt;
&lt;h2 id="智能合約"&gt;智能合約&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;clock century regret direct flip match erase core arrange baby about horse
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可支援繼承
要可以被查詢的記得記 public&lt;/p&gt;
&lt;h3 id="主要內容"&gt;主要內容&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;address (地址 / 帳號)
&lt;ul&gt;
&lt;li&gt;使用者&lt;/li&gt;
&lt;li&gt;合約&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;stats(狀態)
&lt;ul&gt;
&lt;li&gt;會進入 hash 運算裡&lt;/li&gt;
&lt;li&gt;可永久保留，使用者用來記錄合約的相關資訊&lt;/li&gt;
&lt;li&gt;Ethereum的設計機制是不鼓勵儲存state的，用到state耗費的gas特別高&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;function(動作)
&lt;ul&gt;
&lt;li&gt;對這合約狀態產生影響的動作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;gas(手續費)
&lt;ul&gt;
&lt;li&gt;每執行一次 函式都要付出相對應該付的費用&lt;/li&gt;
&lt;li&gt;合約提供越多 gas，礦工會越想優先做這個合約的 pow，導致此合約越快被寫入區塊&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;event
&lt;ul&gt;
&lt;li&gt;可以與外部 oricalization 連接&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="交易"&gt;交易&lt;/h3&gt;
&lt;p&gt;都是先把錢給網路(合約)，保證你有著麼多錢&lt;/p&gt;
&lt;h3 id="event"&gt;event&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;比較便宜 (GAS)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="valuable"&gt;valuable&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;比 event 貴很多 (GAS)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="solidity"&gt;Solidity&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="合約步驟"&gt;合約步驟&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;合約宣告
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;contract ContractName {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; address public owner;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; address public receiver;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="參考"&gt;參考&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="應用"&gt;應用&lt;/h2&gt;
&lt;h3 id="geth-應用"&gt;geth 應用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;testrpc&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dapp-應用"&gt;DApp 應用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ethereum-oraclization"&gt;Ethereum Oraclization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>以太坊 相關資源連結</title><link>https://calee0219.github.io/blog/cryptocurrency_ethereum_resources/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/cryptocurrency_ethereum_resources/</guid><description>&lt;h2 id="英文"&gt;英文&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="中文"&gt;中文&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="影片"&gt;影片&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="學習路線"&gt;學習路線&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;了解用途與意義
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;看懂名詞
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;geth 架設
&lt;ol&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;如何讓資訊透過網路擴散&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>以太坊建置與實作</title><link>https://calee0219.github.io/blog/cryptocurrency_ethereum_practice/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/cryptocurrency_ethereum_practice/</guid><description>&lt;h2 id="利用-geth"&gt;利用 Geth&lt;/h2&gt;
&lt;h3 id="創世區塊-genesis-block"&gt;創世區塊 (Genesis block)&lt;/h3&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/30qdtJ6.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;config&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;chainId&amp;#34;: 46723,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;homesteadBlock&amp;#34;: 1,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;eip150Block&amp;#34;: 2,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;eip150Hash&amp;#34;: &amp;#34;0x0000000000000000000000000000000000000000000000000000000000000000&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;eip155Block&amp;#34;: 3,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;eip158Block&amp;#34;: 3,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;clique&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;period&amp;#34;: 10,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;epoch&amp;#34;: 30000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;nonce&amp;#34;: &amp;#34;0x0&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;timestamp&amp;#34;: &amp;#34;0x594561a5&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;parentHash&amp;#34;: &amp;#34;0x0000000000000000000000000000000000000000000000000000000000000000&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;extraData&amp;#34;: &amp;#34;0x0000000000000000000000000000000000000000000000000000000000000000255eb6d4d37bfc66b565e6159948f829b67674f50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;gasLimit&amp;#34;: &amp;#34;0x47b760&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;difficulty&amp;#34;: &amp;#34;0x1&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;mixHash&amp;#34;: &amp;#34;0x0000000000000000000000000000000000000000000000000000000000000000&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;coinbase&amp;#34;: &amp;#34;0x0000000000000000000000000000000000000000&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;alloc&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;0000000000000000000000000000000000000000&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;balance&amp;#34;: &amp;#34;0x1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;0000000000000000000000000000000000000001&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;balance&amp;#34;: &amp;#34;0x1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;config
設定檔
&lt;ul&gt;
&lt;li&gt;chainId
這個 private net 的 ID&lt;/li&gt;
&lt;li&gt;homesteadBlock&lt;/li&gt;
&lt;li&gt;eip150Block&lt;/li&gt;
&lt;li&gt;eip150Hash&lt;/li&gt;
&lt;li&gt;eip155Block&lt;/li&gt;
&lt;li&gt;eip158Block&lt;/li&gt;
&lt;li&gt;clique
&lt;ul&gt;
&lt;li&gt;period&lt;/li&gt;
&lt;li&gt;epoch&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;nonce
是一個64位隨機數，這次 hash 為了完成 difficulties 所要加的鹽
注意他和mixhash的設置需要滿足以太坊的 Yellow paper&lt;/li&gt;
&lt;li&gt;timestamp
設置創世塊的時間戳&lt;/li&gt;
&lt;li&gt;parentHash
上一個區塊的hash值，因為是創世塊，所以這個值是0&lt;/li&gt;
&lt;li&gt;extraData
附加信息&lt;/li&gt;
&lt;li&gt;gasLimit
該值設置對 GAS 的消耗總量限制，用來限制區塊能包含的交易信息總和&lt;/li&gt;
&lt;li&gt;difficulty
困難度，主要是 hash 的規範，到底要 hash 到多少數字以下才成立&lt;/li&gt;
&lt;li&gt;mixHash
與 nonce 配合用於挖礦，由上一個區塊的一部分生成的 hash&lt;/li&gt;
&lt;li&gt;coinbase
礦工的帳號&lt;/li&gt;
&lt;li&gt;alloc
用來預置帳號以及帳號的以太幣數量&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="如何產生-genesis-block"&gt;如何產生 Genesis block&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;手寫 XD&lt;/li&gt;
&lt;li&gt;利用 puppeth 互動 console
&lt;ul&gt;
&lt;li&gt;下 &lt;code&gt;puppeth&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;對你的創世塊命名&lt;/li&gt;
&lt;li&gt;選擇操作 2 來設定創世塊&lt;/li&gt;
&lt;li&gt;PoA 選擇 2 / PoW 選擇 1&lt;/li&gt;
&lt;li&gt;設定多久可以挖到一塊 block (difficulties)&lt;/li&gt;
&lt;li&gt;指定一個 Account address 作為創世區塊的授權打包角色&lt;/li&gt;
&lt;li&gt;指定要不要事先給一些 ether&lt;/li&gt;
&lt;li&gt;Network Id (Chain Id)，直接用 default(random)&lt;/li&gt;
&lt;li&gt;沒什麼需要特別加入 genesis 的&lt;/li&gt;
&lt;li&gt;選 2 存檔&lt;/li&gt;
&lt;li&gt;ctrl+c 離開 =&amp;gt; 產生 .json 檔&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="啟動-genesis-block"&gt;啟動 Genesis block&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;初始化
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;geth --datadir &amp;quot;/root/chain&amp;quot; init genesis.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;將 node 連到 Genesis block&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;啟動私鍊
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;geth --identity &amp;quot;phoenix&amp;quot; --rpc --rpccorsdomain &amp;quot;*&amp;quot; --datadir &amp;quot;/root/chain&amp;quot; --port &amp;quot;30303&amp;quot; --rpcapi &amp;quot;db,eth,net,web3&amp;quot; --networkid 98888 console&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;identity：區塊鏈的標示，隨便填寫，用於標示目前網絡的名字&lt;/li&gt;
&lt;li&gt;init：指定創世塊文件的位置，並創建初始塊&lt;/li&gt;
&lt;li&gt;datadir：設置當前區塊鏈網絡數據存放的位置&lt;/li&gt;
&lt;li&gt;port：網絡監聽埠,默認是8080&lt;/li&gt;
&lt;li&gt;rpc：啟動rpc通信，可以進行智能合約的部署和調試。它在geth中通常被默認激活。&lt;/li&gt;
&lt;li&gt;rpcapi： 設置允許連接的rpc的客戶端，一般為db,eth,net,web3&lt;/li&gt;
&lt;li&gt;networkid： 設置當前區塊鏈的網絡ID，用於區分不同的網絡，是一個數字&lt;/li&gt;
&lt;li&gt;console：啟動命令行模式，可以在Geth中執行命令&lt;/li&gt;
&lt;li&gt;nodiscover: 使用這個命令可以確保你的節點不會被非手動添加你的人發現。否則，你的節點可能被陌生人的區塊鏈無意添加，如果他和你有相同的初始文件和網絡ID。&lt;/li&gt;
&lt;li&gt;maxpeers: 如果你不希望其他人連接到你的測試鏈，可以使用maxpeers 0。反之，如果你確切知道希望多少人連接到你的節點，你也可以通過調整數字來實現。&lt;/li&gt;
&lt;li&gt;rpcapi: 這個命令可以決定允許什麼API通過RPC進入。在默認情況下，geth可以在RPC激活web3介面。請注意在RPC/IPC介面提供API，會使每個可以進入這個介面（例如dapp’s）的人都有權限訪問這個API。注意你激活的是哪個API。Geth會默認激活IPC介面上所有的API，以及RPC介面上的db,eth,net和web3 API。&lt;/li&gt;
&lt;li&gt;rpccorsdomain: 這個可以指示什麼URL能連接到你的節點來執行RPC定製端任務。務必謹慎，輸入一個特定的URL而不是wildcard ( * )，後者會使所有的URL都能連接到你的RPC實例。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果想將Ubuntu作為永久區塊鏈節點使用，當使用nohup命令時，Geth啟動參數console必須去掉，否則Geth會自動停止&lt;/li&gt;
&lt;li&gt;geth command
&lt;ul&gt;
&lt;li&gt;net.listening：查看網絡是否在監聽；&lt;/li&gt;
&lt;li&gt;admin.peers: 查看當前連接的節點。 目前還是空的。&lt;/li&gt;
&lt;li&gt;admin.nodeInfo：查看當前節點的信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="參考"&gt;參考&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ethereum-如何交易"&gt;Ethereum 如何交易&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="gas"&gt;GAS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;手續費&lt;/li&gt;
&lt;li&gt;區塊技術需要礦工幫忙做交易驗證，因此需要付費給驗證工人&lt;/li&gt;
&lt;li&gt;gasLimit&lt;/li&gt;
&lt;li&gt;即時監控資訊：https://ethstats.net/&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="傳送交易"&gt;傳送交易&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;web3.eth.sendTransaction({
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; from: acct1,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; to: acct2,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; value: web3.toWei(1, &amp;#34;ether&amp;#34;),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gasLimit: 21000,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gasPrice: 2000000000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;from: 傳送者的 account&lt;/li&gt;
&lt;li&gt;to: 接受者的 account&lt;/li&gt;
&lt;li&gt;value: 交易金額&lt;/li&gt;
&lt;li&gt;gasLimit:&lt;/li&gt;
&lt;li&gt;gasPrice: 礦工獲得的手續費
&lt;ul&gt;
&lt;li&gt;gasPrice 越低，就有機會越晚被拿來驗證&lt;/li&gt;
&lt;li&gt;手續費太低，沒人想驗證&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="web3js"&gt;Web3JS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="module-介紹"&gt;module 介紹&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ethereumjs-accounts
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;簡報&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ethereum-swarm"&gt;Ethereum Swarm&lt;/h2&gt;
&lt;h3 id="什麼事-swarm"&gt;什麼事 Swarm&lt;/h3&gt;
&lt;p&gt;Swarm 是基於區塊鏈上分散式的點對點儲存空間，將檔案以 P2P 的方式切割分散儲存在每個節點上，可提供上傳、下載的功能&lt;/p&gt;
&lt;h3 id="安裝"&gt;安裝&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;安裝 golang
&lt;ul&gt;
&lt;li&gt;sudo add-apt-repository ppa:evarlast/golang-1.8&lt;/li&gt;
&lt;li&gt;sudo apt update&lt;/li&gt;
&lt;li&gt;sudo apt install golang&lt;/li&gt;
&lt;li&gt;mkdir -p ~/go # GOPATH&lt;/li&gt;
&lt;li&gt;mkdir -p ~/go/bin&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;安裝 geth, swarm
&lt;ul&gt;
&lt;li&gt;mkdir -p $GOPATH/src/github.com/ethereum&lt;/li&gt;
&lt;li&gt;cd $GOPATH/src/github.com/ethereum&lt;/li&gt;
&lt;li&gt;git clone
&lt;/li&gt;
&lt;li&gt;cd go-ethereum&lt;/li&gt;
&lt;li&gt;git checkout master&lt;/li&gt;
&lt;li&gt;go get github.com/ethereum/go-ethereum&lt;/li&gt;
&lt;li&gt;make geth&lt;/li&gt;
&lt;li&gt;make swarm&lt;/li&gt;
&lt;li&gt;之後在 ~/go/src/github.com/ethereum/go-ethereum/build/bin/swarm 就可以直接用了，可以考慮放到 PATH 或把這個資料夾放進 PATH&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="啟動"&gt;啟動&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;要有一個 ethereum account
&lt;ul&gt;
&lt;li&gt;geth account new&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="閃電網路支付通道"&gt;閃電網路/支付通道&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2 id="ghost-演算法"&gt;GHOST 演算法&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;</description></item><item><title>加密貨幣 相關資源連結</title><link>https://calee0219.github.io/blog/cryptocurrency_resources/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/cryptocurrency_resources/</guid><description>&lt;h2 id="影片"&gt;影片&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&amp;lt;- 比較偏寫程式的&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="書"&gt;書&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="網站"&gt;網站&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="論壇--blog"&gt;論壇 &amp;amp; Blog&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="交易所"&gt;交易所&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="線上錢包"&gt;線上錢包&lt;/h2&gt;
&lt;p&gt;私鑰還是存在自己的機器上比較安全吧 XDD&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="簡報"&gt;簡報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>區塊鏈簡述</title><link>https://calee0219.github.io/blog/cryptocurrency_blockchain_intro/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/cryptocurrency_blockchain_intro/</guid><description>&lt;p&gt;
&lt;/p&gt;
&lt;h2 id="緣起"&gt;緣起&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;想要有一個去中心化的制度&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="特徵"&gt;特徵&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;分散式架構&lt;/li&gt;
&lt;li&gt;寫帳
&lt;ul&gt;
&lt;li&gt;以前的交易是以物易物&lt;/li&gt;
&lt;li&gt;=&amp;gt; 金錢作為有公信力的價值衡量&lt;/li&gt;
&lt;li&gt;=&amp;gt; 電子金融時代，變成紀錄交易資訊 (寫帳)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;分散式需要解決的問題
&lt;ul&gt;
&lt;li&gt;雙花
&lt;ul&gt;
&lt;li&gt;同一筆錢被同時拿來買兩樣東西&lt;/li&gt;
&lt;li&gt;第三方驗證的方式，會先確認這筆錢沒有被花過才能拿來作交易&lt;/li&gt;
&lt;li&gt;分散式架構較難做這個驗證&lt;/li&gt;
&lt;li&gt;解決方法：
&lt;ul&gt;
&lt;li&gt;用 voting 的方式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;覆寫
&lt;ul&gt;
&lt;li&gt;解決方式：
&lt;ul&gt;
&lt;li&gt;要改變帳本資訊時，需要找到 hash 的衝突 =&amp;gt; 困難&lt;/li&gt;
&lt;li&gt;就算找到一個衝突，還需要把之後的 chain 的衝突 =&amp;gt; 超困難&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Crypto currency (密碼貨幣)
&lt;ul&gt;
&lt;li&gt;用 hash function 串接資料&lt;/li&gt;
&lt;li&gt;Avalanche Effect 雪崩效應&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;應用
&lt;ul&gt;
&lt;li&gt;FinTech&lt;/li&gt;
&lt;li&gt;智能合約&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="名詞"&gt;名詞&lt;/h2&gt;
&lt;h3 id="pow"&gt;PoW&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用來解決雙花，覆寫問題&lt;/li&gt;
&lt;li&gt;雙花
&lt;ul&gt;
&lt;li&gt;讓寫帳需要花到一些算力 =&amp;gt; 花一些時間&lt;/li&gt;
&lt;li&gt;寫帳時間 &amp;raquo; 資訊擴散時間&lt;/li&gt;
&lt;li&gt;=&amp;gt; 雙花時，還沒可以寫帳時，就已經收到這筆錢被雙花的資訊了&lt;/li&gt;
&lt;li&gt;(理論上還是沒辦法完全解決)&lt;/li&gt;
&lt;li&gt;如果有人可以掌控一部分的網域，是可能可以控制資訊的擴散&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;覆寫
&lt;ul&gt;
&lt;li&gt;每個人手上都會有一個差不多的大帳本 =&amp;gt; 某人想要複寫帳本時，會發現 99% 人的帳本都跟他的不一樣&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="區塊鏈的架構"&gt;區塊鏈的架構&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2 id="區塊鏈的應用"&gt;區塊鏈的應用&lt;/h2&gt;
&lt;h3 id="金融交易"&gt;金融交易&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;交易驗證
再做交易驗證時，需要做基本兩件事情
&lt;ul&gt;
&lt;li&gt;用公鑰確認交易資訊確實為交易發出者提出的&lt;/li&gt;
&lt;li&gt;確認交易未被雙花&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;加入 panding pool&lt;/li&gt;
&lt;li&gt;選擇有利的 chain 做連結&lt;/li&gt;
&lt;li&gt;PoW&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="智能合約"&gt;智能合約&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;由程式碼控制與理解的合約&lt;/li&gt;
&lt;li&gt;可用在 資產 or 業務流程 or &amp;hellip;&lt;/li&gt;
&lt;li&gt;程式碼對合約會有相同的理解
&lt;ul&gt;
&lt;li&gt;不會誤解&lt;/li&gt;
&lt;li&gt;不會產生&lt;strong&gt;一中各表&lt;/strong&gt;的狀況&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;對外部資料的看法一致&lt;/li&gt;
&lt;li&gt;部會因為合約的多次更迭而有所混淆
&lt;ul&gt;
&lt;li&gt;人類可能記憶遺忘&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;嚴格執行共同協定&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="自動化--去中心化"&gt;自動化 &amp;amp; 去中心化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;沒有第三方 (銀行) 控制權
&lt;ul&gt;
&lt;li&gt;e.g. 我們根本不知道銀行的黃金夠不夠支援他的貸款 -&amp;gt; 泡沫化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;用戶可以從外部檢驗&lt;/li&gt;
&lt;li&gt;透明度高
&lt;ul&gt;
&lt;li&gt;利益雙方資訊對等&lt;/li&gt;
&lt;li&gt;失去隱私&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;彈性
&lt;ul&gt;
&lt;li&gt;可客製化合約&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="其他資源"&gt;其他資源&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="各-crypto-currency-差別"&gt;各 crypto currency 差別&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;感謝台大前輩們的贊助
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="z-cash"&gt;
&lt;/h3&gt;
&lt;h3 id="g-coin"&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;跟 Bitcoin 一樣是 UTFO 架構&lt;/li&gt;
&lt;li&gt;G-Coin 比 Bitcoin 較不去中心化&lt;/li&gt;
&lt;li&gt;比 Bitcoin 更好寫智能合約&lt;/li&gt;
&lt;li&gt;用可信任的單位作為 Oracle&lt;/li&gt;
&lt;li&gt;n 個 Oracle 要有 m 個人同意： n of m&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="區塊鏈的瓶頸與未來"&gt;區塊鏈的瓶頸與未來&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;加密技術的優化
Bitcoin 的設計之初，並沒有想要特別去隱藏什麼，但是當區塊鏈的技術越用越廣的今天，是否會有應用希望能在上面做到 MAC then hash，又或者可以將 private key 放在上面卻能讓人僅將它拿來做驗證，而無法存取到&lt;/li&gt;
&lt;li&gt;隱私性
雖然說目前無法從 public key (address) trace 到賬戶擁有者，但似乎還是可以由一層層的轉帳過程中，找到最後獲利的人，是否可以增加隱私性，完全無法讓人 trace 到賬戶擁有者呢？&lt;/li&gt;
&lt;li&gt;IO query
我們知道，系統的整體性能，主要取決於網絡或數據存儲的I/O性能，網絡I/O優化空間不大，但是本地數據存儲的I/O是可以優化的。比如，比特幣選擇的是谷歌的LevelDB，據說這個資料庫讀寫性能很好，但是很多功能需要開發者自己實現。目前，困擾業界的一個重大問題是，加密貨幣交易處理量遠不如現在中心化的支付系統（銀行等），除了I/O，需要全方位的突破&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="block-chain-security"&gt;Block Chain Security&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;隱私不完善問題&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;Prevent sybil attack (女巫攻擊)&lt;/li&gt;
&lt;li&gt;歷史案例
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;竄改挖礦協定&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="相關論文"&gt;相關論文&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>單機多節點 POA 實作</title><link>https://calee0219.github.io/blog/cryptocurrency_ethereum_poa/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/cryptocurrency_ethereum_poa/</guid><description>&lt;ul&gt;
&lt;li&gt;
Proof of Authority(POA)
&lt;ul&gt;
&lt;li&gt;PoW，Miner 必須靠使用算力去解決密碼學問題來取得寫帳&lt;/li&gt;
&lt;li&gt;PoA 思維是直接指定哪些節點有寫帳權，其他節點透過演算法如果是被授權的節點打包 Block 則判定 Block 有效&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="geth-clique-private-chain-poa-版本"&gt;geth Clique Private chain (PoA 版本)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="在同一個-machine-下建立-node"&gt;在同一個 machine 下建立 node&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;install
&lt;/li&gt;
&lt;li&gt;4 node (建立四個資料夾)
&lt;ul&gt;
&lt;li&gt;node 是一般的 ethereum client (做 POW)&lt;/li&gt;
&lt;li&gt;signer 在接下來的情境中當成打包 block 的角色&lt;/li&gt;
&lt;li&gt;node1&lt;/li&gt;
&lt;li&gt;node2&lt;/li&gt;
&lt;li&gt;signer1&lt;/li&gt;
&lt;li&gt;signer2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;為 node 建立 account
&lt;ul&gt;
&lt;li&gt;分別到四個資料夾下做&lt;/li&gt;
&lt;li&gt;&lt;code&gt;geth --datadir ./data account new&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;設定密碼&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="開始建立-private-chain"&gt;開始建立 Private chain&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;創世塊
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;puppeth&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;對你的創世塊命名&lt;/li&gt;
&lt;li&gt;選擇操作 2 來設定創世塊&lt;/li&gt;
&lt;li&gt;用 PoA，所以選擇 2&lt;/li&gt;
&lt;li&gt;設定多久可以挖到一塊 block (difficulties)&lt;/li&gt;
&lt;li&gt;指定一個 Account address 作為授權打包的角色。這裡使用上面產出的 Signer1 的 address (0x 結束輸入)&lt;/li&gt;
&lt;li&gt;指定要不要事先給一些 ether。這裡選 node1 和 signer1 的 address(0x 結束輸入)&lt;/li&gt;
&lt;li&gt;Network Id，直接用 default(random)&lt;/li&gt;
&lt;li&gt;沒什麼需要特別加入 genesis 的，留空&lt;/li&gt;
&lt;li&gt;選 2 存檔&lt;/li&gt;
&lt;li&gt;ctrl+c 離開 =&amp;gt; 產生 .json 檔&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;替 4 個節點初始化 Private chain
&lt;ul&gt;
&lt;li&gt;geth &amp;ndash;datadir node1/data init 創世塊.json&lt;/li&gt;
&lt;li&gt;geth &amp;ndash;datadir node2/data init 創世塊.json&lt;/li&gt;
&lt;li&gt;geth &amp;ndash;datadir signer1/data init 創世塊.json&lt;/li&gt;
&lt;li&gt;geth &amp;ndash;datadir signer2/data init 創世塊.json&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;啟動 geth client 並設定 peers 間的連線
&lt;ul&gt;
&lt;li&gt;在 node1, node2 目錄使用指令啟動 geth
&lt;ul&gt;
&lt;li&gt;geth &amp;ndash;datadir ./data &amp;ndash;networkid 55661 &amp;ndash;port 2000 console&lt;/li&gt;
&lt;li&gt;確認:
&lt;ul&gt;
&lt;li&gt;datadir 參數沒問題，先前的步驟已經在每個節點各自的目錄都建立了 data 目錄&lt;/li&gt;
&lt;li&gt;networkid 大家一定都要用同一個值才可以互相連線&lt;/li&gt;
&lt;li&gt;port 用來讓 geth 跟其他 geth 連線所 listen 的一個 port，由於四個節點都在本機，所以這裡必須都指定不同的值，以下使用 node1 2000, node2 2001, signer1 2002, signer2 2003 當範例&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;節點是授權打包 block 的節點，那你啟動時要先 unlock 你的 account，這樣才可以進行交易的打包&lt;/li&gt;
&lt;li&gt;啟動 signer1 和 signer2 時都要用 unlock 參數帶入他們各自的 address 解鎖
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;geth --datadir ./data --networkid 55661 --port 2002 --unlock 5cc640ae524f70c39081d65bc699b3b61a67bd3f console&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="交易"&gt;交易&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;注意: PoS 沒有挖礦的動作，所以放著給他跑是不會生出新的 Eth 的&lt;/li&gt;
&lt;li&gt;解鎖帳號:
&lt;ul&gt;
&lt;li&gt;使這個帳號可以轉出金錢&lt;/li&gt;
&lt;li&gt;&lt;code&gt;personal.unlockAccount(&amp;quot;&amp;lt;A address&amp;gt;&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;轉帳
&lt;ul&gt;
&lt;li&gt;從 A 到 B&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;eth.sendTransaction({
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; from:&amp;#34;&amp;lt;A address&amp;gt;&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; to:&amp;#34;&amp;lt;B address&amp;gt;&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; value: web3.toWei(0.05, &amp;#34;ether&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>比特幣簡介</title><link>https://calee0219.github.io/blog/cryptocurrency_bitcoin_intro/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/cryptocurrency_bitcoin_intro/</guid><description>&lt;h2 id="技術資源"&gt;技術資源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="簡介"&gt;簡介&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Satoshi Nakamoto (中本聰)&lt;/li&gt;
&lt;li&gt;確認交易發動者
&lt;ul&gt;
&lt;li&gt;PKC&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;POW&lt;/li&gt;
&lt;li&gt;Ｄifficulity + hashing
&lt;ol&gt;
&lt;li&gt;把前面的 Block hash 放入&lt;/li&gt;
&lt;li&gt;執行交易&lt;/li&gt;
&lt;li&gt;寫帳: 做 POW 的人把前面的 Block + 寫帳資訊 做 hash&lt;/li&gt;
&lt;li&gt;若其中有人 hash 到協定，產生一個 BLock (並獲得獎勵)，做出 bloadcase 給其他人我的 hash value&lt;/li&gt;
&lt;li&gt;產生很多 Block 的同時，也可能會有多筆分枝，當 Block 後面連到 6 個 Chain 時，就代表成功了 (其它支鏈應該要被捨棄)&lt;/li&gt;
&lt;li&gt;每兩個禮拜更新一次 hashing 困難度&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;使用技術
&lt;ul&gt;
&lt;li&gt;RSA&lt;/li&gt;
&lt;li&gt;ECC&lt;/li&gt;
&lt;li&gt;Digital Signature
&lt;ul&gt;
&lt;li&gt;資料完整性 (Integrity)&lt;/li&gt;
&lt;li&gt;身份鑑別性 (Authentication)&lt;/li&gt;
&lt;li&gt;不可否認性 (Non-Repudiation)I&amp;rsquo;m&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ECDSA Signing 簽章 / 驗章&lt;/li&gt;
&lt;li&gt;SHA256&lt;/li&gt;
&lt;li&gt;Merkle Tree / Hash Tree&lt;/li&gt;
&lt;li&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/LPRRQgB.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;尋找 nounce 就是挖礦的動作&lt;/li&gt;
&lt;li&gt;double hash256&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;挖到：
&lt;ul&gt;
&lt;li&gt;最長鍊&lt;/li&gt;
&lt;li&gt;後面最少跟五個 block&lt;/li&gt;
&lt;li&gt;=&amp;gt; 6 confirmations&lt;/li&gt;
&lt;li&gt;10 分鐘一個 block&lt;/li&gt;
&lt;li&gt;-&amp;gt; 最少需要 60 分鐘才能知道有沒有 pay (挖到)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="密碼學部分"&gt;密碼學部分&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="merkle-tree"&gt;Merkle Tree&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bitcoin-and-cryptocurrency-technologies"&gt;Bitcoin and Cryptocurrency Technologies&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;</description></item></channel></rss>