📜 [專欄新文章] EIP2929, EIP2930 簡介
✍️ Anton Cheng
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Opcode 加油Proposal,會不會讓以太坊變更貴呢
昨天在同事的推薦下發現了這個YouTube系列:Peep an EIP,也聽了Vitalik和Martin介紹EIP2929 + 2930的這一期。這兩個EIP都已經被列入下一次的硬分岔(Berlin Hardfork),所以我就來寫個學習筆記。先打個預防針,本人對EVM可以說是非常不熟,但也希望藉著這個機會逼自己學習,如果有錯誤的話也希望懂的更多的各路大神可以不吝賜教。
Berlin without hardfork. (By Claudio Schwarz on Unsplash)
EIP2929: Gas cost increases for state access opcodes
乍看之下這是一個極為恐怖的Proposal。在Gas已經高到爆炸的2021年,理論上不應該再通過這種「加油」類的方案。不過不用緊張,其實這個EIP真正改變的是第一次access的價格,如果一筆交易內要執行一樣Opcode動作輛次,那麼gas cost 將降低為100。
Increases gas cost for SLOAD, *CALL, BALANCE, EXT* and SELFEDESTRUCT when used for the first time in a transaction.
大家都知道,合約最終會被Compile成一堆Opcode,這些Opcode也是用來計算最終交易手續費的依據:理論上越是花時間的的Opcode,應該要收越高的手續費。
但是一直以來,state access opcode 太便宜都是一個已知的問題:在2016年的上海DOS攻擊中,其中幾個攻擊的手法就是透過惡意交易大量讀取帳戶資訊、大量的創造合約再銷毀,或是不斷用 EXTCODESIZE 來讀合約大小等等,讓Client必須花大量的IO資源處理交易(需要讀寫disk的動作特別慢),最終使Client程式Crash或是延長出塊時間。儘管大部分的弱點已經透過EIP150中大量提升gas cost獲得改善(還有其後的EIP1884),但在EIP2929中,也引用的這篇Paper的數據:現在replay所有以太坊上的交易,當時那些惡意交易中的worst case還會需要~80秒才能完成。這跟以太坊所定義的13秒出塊時間有著很大的差距,也代表這個潛在的攻擊是可行的。
透過增加這些opcode所需要的gas cost,可以降低每個區塊最大可能的讀取數。以下是偷抄Vitalik PPT 的數據:(12,500,000 為gas limit上限)
Pre-EIP 2929:
BALANCE spam: 12,500,000 / (400 cost + 320 address size + 50 boilerplate) = 16,233 accesses per block
CALL spam: 12,500,000 / (700 + 320 + 50) = 11,682 accesses per block
SLOAD spam: 12,500,000 gas / (800 + 25 boilerplate) = 15,151 accesses per block (but of a smaller tree)
Post-EIP 2929:
BALANCE spam: 12,500,000 / (2,600 + 320 + 50) = 4,280 accesses per block
CALL spam: 12,500,000 / (2,600 + 320 + 50) = 4,280 accesses per block
SLOAD spam: 12,500,000 / (2,100 + 25) = 5,882 accesses per block
說實在的這個數據的解釋也很廢話,就是把Opcode變得用貴,能Spam的數量越少。平均來說Gas cost 變高3倍,所以之前worst case的80秒執行時間可以被下降到大概 ~27秒。
SSTORE changes
在實作層,EVM會維繫一個本筆交易讀取過所有交易的 Set。每次有尚未讀取過的slot時,就會先收取一筆 CLOD_SLOAD_COST (2100) ,然後把這個slot加入這個set中,下次讀寫就會比較便宜。
對於已經讀取過的Slot,再次寫入的Opcode SSTORE 之gas cost為會降低為
5000 — COLD_SLOAD_COST (2100) = 2900
簡單的說,單純只操作一次 SSTORE 的總gas 會維持一樣在 5000 。但如果這個slot是之前有讀過的,則寫入的gas cost就會降低。近一步來說,一個 x += 100 ,其實會變得更便宜:
Pre-EIP-2929: 800 SLOAD + 5000 SSTORE = 5800
Post-EIP-2929: 2100 SLOAD + 2900 warm SSTORE = 5000
其他Side effects
這個改動除了降低了最高能夠spam的次數以外,也降低了以太坊想要做到stateless client,理論上最大的witness 大小。其實這裡的原理跟前面很類似,下圖的表格比較的是目前使用hexary tree所需要的witness大小:若12.5M的區塊全部塞滿該Opcode的witness,理論上最大會佔多少空間。在EIP2929之後由於gas cost增加,就壓縮了最大可能的witness size.
這裡單純只比較增加gas cost後,對於max witness size的影響。影片中有提到其他許多方法旨在減少Witness bytes,包括使用binary tree而不是hexary tree,以及用Code Merklization等等。這些其他方法也能夠降低最後的Max Witness size,但跟這個EIP沒有直接相關。不過可以注意的一點是,這些其他在witness size上面的優化跟 gas cost 所帶來的優化的效果是可以相乘的,例如 SLOAD,更改gas price已經能夠讓max size 縮小2.6倍,若是改用Binary tree可以將 Witness bytes降低到 288 bytes,就會是再3~倍的優化。
對用戶的影響
依照Martin Swende 給出的數據,這個EIP對於一般交易的影響僅有提高0.3~0.4%。理由很簡單,雖然第一次access storage變貴了,但是後面幾次讀寫就會變得便宜。大部分應用的程式邏輯都是類似的幾個變數進行讀寫,因此可能有不少的動作反而會變得更便宜。一個最簡單的例子就是ERC20 Transfer,兩個餘額的 +=和 -= 都會變便宜,所以總共的花費也是變便宜的。
這其中也會對於Solidity的開發pattern有著一定程度的影響,我目前想到的影響可能有兩個:
由於多次的storage access變便宜,永遠cache state variables不再是一個最佳策略。以前我們會盡量想辦法減少寫入state storage的次數,現在可能會基於coding style考量減少一些的memory cache。
之前寫合約都會盡量避免external call,甚至會寫一些一次把所有 variable都回傳回來的笨函示,來避免多次的external calls。這有一部分原因是因為每次external call都會需要使用到 EXTCODESIZE 這個Opcode所以很貴。但如果 EXT 系列的Opcode也變得越call越便宜,那麼這個一次全部call 回來cache 住的pattern也可能改變。
以上兩個想法都還沒有經過實證,如果之後看到更有證據的分析的話,也會來這裡分享。
EIP2930: Optional access lists
EIP2929可能會影響一些鏈上的合約,因為有些合約有hardcode external call的gas 上限。對於這方面的問題,EIP2930提出一個新的交易類型,讓交易中多帶一個access list,即所有這筆交易即將讀寫的storage slot,並且先幫忙付掉第一次讀寫的gas,而真正交易讀寫該storage時,只會被要求付100 gas。
這不但可以避免這次EIP2929帶來的副作用,也可以被使用在其他因為gas price 改變的硬分岔升級而壞掉的合約,例如在EIP1184 增加 SLOAD gas price 時影響到的 Aragon 和Kyber 等等。儘管當時升級前各大專案都有幫助用戶提出migration 方案,但如果有人曾經卡錢在裡面,也可以Follow一下這次柏林Hardfork。
小結
新的一年就用一篇簡單的文章來開頭。最近發現自己以前的學習習慣有點亂無章法,所以新年整理了reading list,逼自己做筆記,順便發想一些想要寫的主題。今年的期許就是學更多Ethereum底層一點的知識,當然還有上層一點Defi的知識。也歡迎大家分享一下自己都是怎麼follow這麼多東西的><
EIP2929, EIP2930 簡介 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
「slot 轉 數 表 怎麼 看」的推薦目錄:
- 關於slot 轉 數 表 怎麼 看 在 Taipei Ethereum Meetup Facebook 的最佳貼文
- 關於slot 轉 數 表 怎麼 看 在 Taipei Ethereum Meetup Facebook 的最佳貼文
- 關於slot 轉 數 表 怎麼 看 在 Taipei Ethereum Meetup Facebook 的最佳貼文
- 關於slot 轉 數 表 怎麼 看 在 Re: [問題] 關西糖果店及柏青哥推薦- 看板Japan_Travel 的評價
- 關於slot 轉 數 表 怎麼 看 在 新手必看-SLOT相關名詞解說 - Facebook 的評價
- 關於slot 轉 數 表 怎麼 看 在 心靈判官SLOT設定變更步驟(1)關機(2)插設定鑰匙轉到on ... 的評價
- 關於slot 轉 數 表 怎麼 看 在 slot討論區的分享,FACEBOOK、PTT和網紅們有這些文章 的評價
- 關於slot 轉 數 表 怎麼 看 在 slot討論區的分享,FACEBOOK、PTT和網紅們有這些文章 的評價
slot 轉 數 表 怎麼 看 在 Taipei Ethereum Meetup Facebook 的最佳貼文
📜 [專欄新文章] 可升級合約介紹 - 鑽石合約(EIP-2535 Diamond standard)
✍️ Kimi Wu
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Photo by Evie S. on Unsplash
前言
可升級合約簡單來說是透過 proxy contract(代理合約)來達成,藉由代理合約去呼叫欲執行的合約,若要升級,則把代理合約中的指向的地址換為新的合約地址即可。而執行的方式則是透過 delegateCall,但 delegateCall 不會更動目標合約的狀態。所以要怎麼處理變數,就是一門學問了。
舉例來說,contract B 有個變數 uint256 x,初始值為 0, 而 function setX(uint256),可以改變 x 的值。proxy contract A 使用 delegatecall 呼叫 contract B 的 setX(10),交易結束後,contract B中的 x 依然還是 0。
OpenZeppelin 提出了三種實作方式,可以做到可升級合約,細節可參考 Proxy Patterns,而最終的實作選用了 Unstructured Storage的這個方式,這種方式對於開發較友善,開發時不需特別處理 state variables(不過升級時就需要特別注意了)。而這篇主要是介紹 Diamond standard,OpenZeppelin 的可升級合約就不多做介紹。
USDC V2 : Upgrading a multi-billion dollar ERC-20 token 詳細地介紹代理合約跟變數儲存之間的關係,不了解升級合約的原理,建議先看看。
鑽石合約
名詞介紹
diamond:合約本體,是一個代理合約,無商業邏輯
facet:延伸的合約(實際商業邏輯實作的合約)
loupe:也是一個 facet,負責查詢的功能。可查詢此 diamond所提供的 facet與facet所提供的函式
diamondCut:一組函式,用來管理(增加/取代/減少)此 diamond合約所支援的功能
Loupe
直接來看 loupe的介面,從宣告就能很清楚暸解 diamond合約的實作方式,loupe宣告了一個結構 Facet,Facet結構包含一個地址及 function selector 陣列,所以我們只需要記錄一個 Facet陣列就可以得知這個 diamond 合約有多少個延伸合約及所支援的功能(loupe只定義結構,而實際變數是存在diamon合約中的)。也就是 diamond合約中只記錄延伸合約的地址及其支援的 function selectors,及少數 diamond合約的管理邏輯,並無商業邏輯,因此可以外掛非常非常多的合約上去(就像一個Hub),也就可以突破一個合約只有24K的限制。
// A loupe is a small magnifying glass used to look at diamonds.interface IDiamondLoupe { struct Facet { address facetAddress; bytes4[] functionSelectors; } function facets() external view returns (Facet[] memory facets_); function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_); function facetAddresses() external view returns (address[] memory facetAddresses_); function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_);}
DiamondCut
至於 facet在 diamond合約上的註冊或是修改,就由 diamondCut負責,從以下程式碼可以清楚瞭解其功能(EIP中有規範,每次改變都需要發送DiamondCut事件)
interface IDiamondCut { enum FacetCutAction {Add, Replace, Remove} // Add=0, Replace=1, Remove=2 struct FacetCut { address facetAddress; FacetCutAction action; bytes4[] functionSelectors; } function diamondCut( FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata ) external; event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);}
Diamond合約
接下來就是最核心的部分 — diamond本體合約。以下是官方的範例,方法上跟 OpenZeppelin 一樣使用 fallback 函式跟 delegateCall 。
呼叫合約所不支援的函式,就會去執行 fallback 函式,fallback 函式中再透過 delegateCall 呼叫 facet 合約相對應的函式
fallback() external payable { address facet = selectorTofacet[msg.sig]; require(facet != address(0)); // Execute external function from facet using delegatecall and return any value. assembly { calldatacopy(0, 0, calldatasize()) let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) returndatacopy(0, 0, returndatasize()) switch result case 0 {revert(0, returndatasize())} default {return (0, returndatasize())} }}
主要的差異在於變數的處理,OpenZepplin 是針對單一合約設計的代理合約(也就是每個合約都有自己的代理合約),所以無法處理單一代理合約儲存多個合約的變數(state variables)的狀況(後有圖例)。先由官方的範例程式來了解是怎麼處理變數的
在官方的範例中,都是以更改合約 owner 為例子
首先看到 DimaondStorage這個結構,結構中的前面三個變數都是在維持 diamond合約的運作(同上面loupe的範例),最後一個變數 contractOwner就是我們商業邏輯中所需的變數。
接著看到 function diamondStorage(),取變數的方式就跟OpenZeppelin 儲存特定變數方式一樣(EIP-1967),是把變數存到一個遠方不會跟其他變數碰撞到的位置,在這裡就是從 DIMOND_STORAGE_POSITION 這個 storage slot 讀取。
在實作上就可以有 LibDiamond1 ,宣告DIMOND_STORAGE_POSITION1=keccak256("diamond.standard.diamond.storage1") ,負責處理另一組的變數。藉由這種方式讓每個 facet合約有屬於自己合約的變數, facet合約間就不會互相影響。而最下方的 setContractOwner 是實際使用的範例。
library LibDiamond {
bytes32 constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage");
struct FacetAddressAndSelectorPosition { address facetAddress; uint16 selectorPosition; }
struct DiamondStorage { mapping(bytes4 => FacetAddressAndSelectorPosition) facetAddressAndSelectorPosition; bytes4[] selectors; mapping(bytes4 => bool) supportedInterfaces; // owner of the contract address contractOwner; }
function diamondStorage() internal pure returns (DiamondStorage storage ds) { bytes32 position = DIAMOND_STORAGE_POSITION; assembly { ds.slot := position } }
function setContractOwner(address _newOwner) internal { DiamondStorage storage ds = diamondStorage(); address previousOwner = ds.contractOwner; ds.contractOwner = _newOwner; emit OwnershipTransferred(previousOwner, _newOwner); }
每個 library 處理了一組或多組變數的存取, facet 合約透過 library 對變數做操作。也就是把變數存在diamond主體合約,延伸的 facet合約只處理邏輯,是透過 library 去操作變數。
下面圖中清楚地解釋了 facet合約,function selectors 與變數之間的關係,從最左上這邊有個 facets 的 map,紀錄了哪個 selector 在哪個合約中,例如func1, func2是 FacetA的函式。左下角宣告了變數,每組變數的存取如同上述 library 的方式處理。
https://eips.ethereum.org/EIPS/eip-2535#diagrams
在 diamond的設計中,每個 facet合約都是獨立的,因此可以重複使用(跟library 的概念一樣)
https://eips.ethereum.org/EIPS/eip-2535#diagrams
小結
diamond合約使用不同的設計來達成合約的可升級性,藉由這種Hub方式可隨時擴充/移除功能,讓合約不再受限於24KB的限制,此外充分的模組化,讓每次升級的範圍可以很小。最後,因為跟library一樣只處理邏輯,並無狀態儲存,所以可以重複被不同的diamond合約所使用。
雖然又不少好處,也是有些缺點。首先,術語名詞太多,facet, diamondCut, loupe等等(其實還有好幾個,不過沒有介紹到那些部分,所以沒有寫出來)。開發上不直覺,把變數跟邏輯拆開,若要再加上合約之間的繼承關係,容易搞混,不易維護。最後,gas的花費,在函式的讀取、呼叫,變數的存取、傳遞都會有不少的額外支出。Trail of Bits 專欄中有點出更多的缺陷 Good idea, bad design: How the Diamond standard falls short,不過作者也有反擊 Addressing Josselin Feist’s Concern’s of EIP-2535 Diamond Standard,有興趣的讀者可以自行看看、比較。
為了模組化及彈性,diamond合約在設計上有點太複雜(over engineering),會造成可讀性越差(這點也是Vyper誕生的原因之一),而可讀性越差就越容易產生bug、也越不容易抓到bug,而在defi專案中,一個小小的bug通常代表著大筆金額的損失 😱😱😱。
雖然如此,筆者還是覺得很酷,有些設計的思維仍然可以使用在自己的專案
ref:
EIP 2535
Diamond 實作
Addressing Josselin Feist’s Concern’s of EIP-2535 Diamond Standard
OpenZeppelin upgradeable contract
可升級合約介紹 - 鑽石合約(EIP-2535 Diamond standard) was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
slot 轉 數 表 怎麼 看 在 Taipei Ethereum Meetup Facebook 的最佳貼文
📜 [專欄新文章] 2019 台北以太坊社群回顧
✍️ Juin Chiu
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
很快地,2019 年過去了,台北以太坊社群(TEM)也滿 3 歲了,過去一年,TEM 完成了許多重大的里程碑:
舉辦台灣最大的區塊鏈技術研討會 Crosslink
主持台灣開源界最大的研討會 COSCUP 的區塊鏈議程
參加世界最大的區塊鏈技術研討會 DEVCON
Medium 專欄累積 30+ 篇優質文章
Youtube 頻道累積 50+ 個技術演講
在這篇文章中,我們首先來審視 2019 年以太坊取得重大進展的技術:以太坊2.0與零知識證明,接著再回顧 TEM 於 2019 的優質專欄文章。
*本文由 Juin Chiu 與 Chih-Cheng Liang 共同整理
以太坊重大進展
以太坊2.0的信標鏈
對一般大眾最重要最能吸收的事情大概是 Eth2.0 的信標鏈有測試網路了。透過儀表板網站 www.beaconcha.in 可以看見 Prysmatic Labs 團隊的測試網路的動態。細節很多,但本文就只談這張圖最上面有出現的東西。
在 Eth2.0 沒有挖礦和礦工了,取而代之的是抵押以太幣的驗證者(Validator)來成為資料的寫入者。因此也沒有「區塊時間」這個詞了,新協定以 12 秒為一個「時段」(Slot),信標鏈隨機分配驗證者在指定的時間點產出區塊。在 32 個時段的時間,稱為一個「時期」(Epoch),約 6.4 分鐘,信標鏈會處理驗證者的賞、罰、進、出。在儀表板的左上角可以看到 Epoch 與 Slot 的數字,代表距離最早最古老的區塊多久了。
要怎麼成為驗證者呢?首先要在以太坊 1.0 主網路的抵押合約上,送出一筆交易(在信標鏈測試網路則是送到 Goerli 測試網路)。這筆交易會註冊驗證者的公鑰,並且存入押金(在正式網路是 32 ETH ,測試網路則是 3.2 ETH)。送完之後就排隊等待信標鏈激活驗證者,驗證者就需要開始執行信標鏈分配的任務了。在畫面中間可以看到左邊是 27539 個活躍的驗證者,右邊則是有 4623 個排隊進入的。
在這種基於押金的網路,系統的威脅來自於攻擊者買通大量驗證者,送出矛盾訊息,致使於系統不同節點無法取得共識,鏈資料不可挽回的分叉為兩條。因此系統累積的總押金越多,代表攻擊者成本越高。畫面最右上角左邊即為總押金,右邊為平均一個驗證者的餘額。
假期間和親朋好友一起跑一個驗證者節點,是個活絡氣氛的好活動。要做到這件事,目前 Prysm 客戶端有最友善的介面,請點 連結。程式也用 Docker 包好了,免煩惱安裝。
也記得 Eth2.0 協定有 9 個團隊 用不同程式語言實作。例如:有 Python 語言的客戶端 Trinity ,以及 Rust 語言客戶端 Lighthouse。基本上不用擔心找不到自己喜歡的程式語言的實作。
零知識證明
2019 年,零知識證明的理論與應用也突飛猛進,Kimi Wu 剛好寫了一篇很棒的文獻調查。
前年底提出的 zk rollup,目前由 Matter Labs 在開發,Matter Labs更在上個月(2019/12)發表了 ZK Sync,解決了因為產生證明(proof)而延伸的延遲問題。
此外 Iden3 跟 ConsenSys 也有 zk rollup 的專案。在以太坊研究論壇有基於 zk rollup 的一個提案,是可以達到 匿名性的 zk rollup。
Semaphore是一個基於零知識證明的一個訊號系統,發送者可以不揭露身份的狀況下廣播任何訊息(an arbitrary string)。 Semaphorejs 延續 Semaphore 的核心概念,並將整個概念更加完整化,從前端網頁到後端服務。
這兩年才發表的 zk-STARKs,也在去年年初跟 0x 合作,推出基於 zk-STARKs 的 去中心化交易所。
在技術上,去年下半年有新的論文,使用 DARK compiler 可以讓 SNARKs 達到公開性(Transparent)。還有 MARLIN, SONIC, PLONK 等可通用且可更新的可信設定(trusted setup)。STARKs 的 FRI 驗證方式也默默地跟 SNARKs 做結合。(東西越來越多,根本看不完 QQ)
零知識證明在區塊鏈的重要用途就是「擴展」和「隱私」。技術上的進展,一般可以觀察證明方產出證明的時間、證明的資料大小、驗證方驗證的時間、需不需要可信設定、可信設定有什麼限制、以及抵抗量子電腦的能力。
社群專欄優質文章
Crossslink 2019
Crosslink 2019 Taiwan|以太坊 2.0 的未來藍圖及挑戰
Crosslink Recap: Design pattern: build your first profitable DApp and smart contract
Private key security and protection / 私錀的安全與保護 — Tim Hsu
Crosslink 2019 Taiwan|LibraBridge: 橋接 Libra 與 Ethereum
Aragon Fundraising:下一代的去中心化募資平台
The next generation Ethereum Virtual Machine — Ewasm VM
libp2p — 模組化的點對點網路協議
教學(Tutorial)
一分鐘做出自己的代幣購買App
Web3 Java 開發:用 Geth、Ganache 及 Infura 測試和 Smart Contract 互動
Let’s Capture The Flag! Etheruem CTF Tutorial 從零開始破解智能合約漏洞!
Your First Transaction on Facebook Libra — 動手玩 Libra
ELI5! 區塊鏈到底在幹嘛?
共識協定(Consensus)
Casper FFG:以實現權益證明為目標的共識協定
Casper FFG 與 Casper CBC 的瑜亮情結
若想搞懂區塊鏈就不能忽視的經典:PBFT
密碼學(Cryptography)
Ethereum RNG (RANDAO & VDF)
深入瞭解 zk-SNARKs
瞭解神秘的 ZK-STARKs
隱私性與匿名性(Privacy and Anonymity)
新一代加密貨幣Grin和MimbleWimble區塊鏈解析
Monero.門羅幣 隱匿交易的基礎介紹
隱私、區塊鏈與洋蔥路由
資料可得性(Data Availability)
Data Availability on Ethereum 2.0 Light Node
Fraud and Data Availability Proofs
點對點網路(p2p Network)
連Ethereum都在用!用一個例子徹底理解DHT
針對DHT的花式攻擊與精簡對策
智能合約(Smart Contract)
深入解析Solidity合約
Upgradable Smart Contracts using zos
Reason Why You Should Use EIP1167 Proxy Contract. (With Tutorial)
去中心化金融(DeFi)
DeFi 項目《Uniswap》完整解析(一)Uniswap 是什麼?
解析 DeFi 項目《Uniswap》(二)Uniswap 如何使用?
去中心化身份(DID)
我們與「身份自主」的距離
其他(Miscellaneous)
論言論自由
作為負債的控制
0x 黑客松 — 獲獎作品回顧與分析
技術解析台灣交易所BitoPro駭客攻擊
總結
2019 是個樸實無華但充實的一年,除了在底層技術方面有所進展,在應用方面,例如去中心化金融(DeFi)與去中心化身份(DID),也逐漸獲得大眾的興趣,期待 2020 年區塊鏈能為這世界帶來更多驚奇!
2019 台北以太坊社群回顧 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
slot 轉 數 表 怎麼 看 在 新手必看-SLOT相關名詞解說 - Facebook 的推薦與評價
純增指在開牌中或RT、ART、AT中的平均每轉獲得枚數,例如純增1.3機台,則該機台在ART中跑100轉則存增約130枚. DDT殺蟲劑的一種,也意味著在遊戲的過程中出現的全部小役都抓到 ... ... <看更多>
slot 轉 數 表 怎麼 看 在 心靈判官SLOT設定變更步驟(1)關機(2)插設定鑰匙轉到on ... 的推薦與評價
快來我的「toy885325」賣場 看看 吧! https://shopee.tw/toy885325 個人收藏 ... 按設定按鈕調段 數 1-6皆可(5)機台外面搖桿往下打三下(6)設定鑰匙 轉 ... ... <看更多>
slot 轉 數 表 怎麼 看 在 Re: [問題] 關西糖果店及柏青哥推薦- 看板Japan_Travel 的推薦與評價
剛好看到問柏青哥的文 就來回一篇吧
在下三歲玩柏青哥 四歲玩斯洛(類似拉霸機) 五歲玩到變成精 怎料六歲就輸到亮晶晶
抄一下賭聖梗 倒是沒輸到亮晶晶 不過長期玩我的收益是賺錢的,日本專業打的也都會
計算自己的收益,我的收益一年打下來大概是正一百多萬日圓,贏單次最高是扣手續費約
26萬日圓,輸最多是單次約5萬圓
主要都在大阪玩,不過全日本的我都玩過,通常就是邊旅遊邊玩,賺旅費跟生活費
所以簡單分享一下柏青哥的攻略心得,以後有機會再分享輸贏更大的斯洛心得
我在日本工作的空閒時間都會打柏青哥,所以在柏青哥店看了很多人生百態
有日本人輸到拿小鋼珠狂丟機台玻璃的,有日本人氣到使出佛山無影腳的
有日本人打到崩潰痛哭的
大概啥都看過了,所以你想看真實的日本人又耐的住噪音的話去柏青哥店可以看到
最真實的日本人
柏青哥店通常上班時間都是老人在打居多,到下班時間就換成上班族拿著公事包走進來
打的居多
而其實很多日本人是賭性堅強,會一直屯錢下去打,這時就是看機台的眼光跟時機了
打柏青哥重點是眼光跟對的時機,不知道亂打開獎通常稱為新人獎,但是長期下來一定
輸不會贏
計價單位:
柏青哥的小鋼珠一顆為一個單位通常分為
4圓、2圓、1圓、0.5圓、0.25圓
這五種單位,越高的單位你一千圓能換的珠子就越少,反之就越多
但是贏的話就反過來
機台分別:
日本機台資訊都是很透明的,所以你在機台上方會看到各種開獎機率
以前常見有399.6(平均400轉會開一次獎)、319.6、然後跟以下的299的199的或更低的99
那個就是平均開獎轉數,目前日本政府規定不能再作400以上的台子了,怕輸贏太大很
多人會輸到脫褲子,所以目前機台都以319或299了,比較容易開獎但連莊就相對機率低
通常平均轉數越高的開的獎會越好,進特殊開獎機會(稱為確變)的機會越高
進確變的話比較容易連莊一直開獎,沒進確變機率就比較低了
不過也是看機器,通常是確變型大家比較喜歡玩,就是開獎後會進幾十轉到一兩百轉
的高連莊機器比較受歡迎
店的差別:
日本的柏青哥店,高人氣跟低人氣的店非常明顯,高人氣的店就是說你經過看都是滿滿
的人在打,低人氣可能就小貓兩三隻甚至整家店空盪盪
要打的話,千萬記得要選高人氣人多的店
為何?
打柏青哥通常是看在機台正上方的轉速表,會顯示今天大當(開獎)了幾支,在上次開獎
後的轉速表,然後也會有前面開獎是在幾百轉開獎的,通常一根是一百轉
柏青哥機台是沒有一定的,但有的很軟(好打)有的很硬(難打)
好打的我有一轉就開獎過,然後一直連莊的
難打的我有打過兩三千轉不開獎,一開獎沒進確變繼續咬
因為機台的狀況不一,建議小資想拼先開獎的要打的要選今天在三百轉內一直開不停的
像我跟一些日本職業玩家會看機台的,通常會先選狀況不錯的
大約先打個一兩千圓,大概在二三十轉的區間內就能大概看出這台的狀況
如果在短區間內一直有強力對獎演出的台子,請一定要打,代表機台可能在容易開獎的
狀態或潛伏確變,打大概一百轉左右都沒抽到開獎再棄台
如果打短區間連對獎都沒有,轉數又在三百以上的話就請棄台,代表在通常模式要開獎
很難,除非塞到剛好開獎,也是有可能 不過機率很低
開打時機:
不要急著打,有剛開獎轉速在200轉以內的優先試打,都沒有的話就去旁邊買個飲料等
很多日本人都這樣,等有好台子再出手打,觀察在一兩千圓內至少要打到三十轉為目標
看三十轉內有沒有特別大高期待的演出,通常台子旁都會有一張說明的護貝紙寫高期待
的演出,有出現的話就要再打,如果沒啥演出就棄台,但是如果對獎頻頻也要再打一些
轉數看看喔
棄台時機:
以一開打的預算去看,比如我今天預算是打一萬日圓,大概可以試4~5台狀況好的台子,
比較有機會先贏一些當作賭本,像我如果贏了一些,假設三萬圓,我會再用五到一萬圓
當賭本再去試其他台,運氣好的話就會一直累加,萬一不好也沒差不會輸有賺就好
當發現台子很安靜啥對獎演出都不演的時候,果斷棄台就對了
通常知識:
原裝的柏青哥機台都是有設定一定的轉數上限要吐對應的鋼珠數,所以有些台子當天被打
了幾千轉都開的不好或沒開獎,這些台子很可能在接下來的短轉數內開獎,可以打一下
試看看,但如果還是沒開不要勉強,因為這種台子沒固定的,要再繼續咬多久才會開沒
人會知道
我個人比較喜歡打300以上的機台,最少也要299的,因為少轉數的開獎率高可是連莊率
很低,打起來很浪費生命,通常就是打休閒無聊的,贏也不會贏多少,但有時雖可以輸
不少XD
與其要輸不如去打高轉數的連莊起來爽多了
以大阪市來說,難波的店我比較不愛打,那邊治安什麼的也比較不好,也很多觀光客會
在那亂打,老人也頗多很多都會拿香菸盒佔台子不打,很討厭
我比較喜歡在梅田打,那邊打的一定都是日本人,而且老人很多上班族也很多,熱門的店
也多,我比較喜歡打禁菸店,比較不臭,抽菸的店有時會燻到打不久或者是暈了亂打
我打的店通常在梅田ROUND1地下二樓 或天神橋6號出口那間,一開始是都在難波 龍打,
可是後來倒了
有時比較遠有時會去吹田市打,都是我喜歡的人氣熱門店,贏錢都是在這幾家
入幣方式:
柏青哥與斯洛一樣,通常有兩種換鋼珠方式,一種是機台上有鈔票投入孔,投入千圓以
上日幣紙鈔後就會自動換成對應數量的鋼珠可以打,打出來的鋼珠有兩種方式換景品(獎
品)
一種是開獎後珠子開始吐的時候,累積珠子快滿一盒時就按呼叫鈕叫店員來換盒子,換好
的盒子他會幫你疊在你座位後面,等你不打時,就按呼叫鈕叫店員來,手勢跟他比個X
他就會幫你把那些珠子推去鋼珠的結算機結算,完成後再拿一張紙給你上面會有鋼珠數
你再去櫃檯那邊排隊換景品
另一種是循環式,這種就不用叫店員過來,鋼珠數會自然往下面的洞進去,然後在旁邊
的液晶螢幕會有累積的鋼珠數,想打就不用投錢,直接用剩餘的鋼珠數打就好
這台不打時,可以按結算,會跑出一張卡片給你,你可以憑卡片去櫃檯換景品,或者插入
卡片換一台繼續打都可以
如何換錢:
這就是重點啦,贏錢就是要換錢,如果你是卡片式的,你可能投了一萬日圓紙鈔打,結果
幸運一千就開獎,那剩下的九千日圓會在你卡片當中,通常在店中會擺好幾台精算機,先
拿卡片去把剩下的錢換成現金,但卡片要記得拿,再拿卡片去櫃檯那邊換成景品
景品的話通常會問你幾個問題,你沒需要的話就一直搖頭就好
一:店裡有特別東西你有要換嗎?有時是名店蛋糕,或餅乾有的沒的
二:你剩餘的鋼珠數要換成什麼?因為鋼珠數都是扣手續費後整數,所以你可能贏了一萬顆
鋼珠(約四萬圓日圓)扣掉手續費後大概是三萬六千四百日圓,那剩下的四百日圓你可以換
飲料餅乾那些有的沒的,當然也可以跟他說不用換就送店裡也可以,不過有些餅乾很好吃
我是建議都換
兩個問題結束後他就會把單子讓機器感應,機器就會吐出對應的景品數,他同時會給你一
張紙條跟可以換餅乾的對應號碼
比如餅乾有ABCDEFG區,從很大包的到很小包的,你可能剩下400圓,他單子會寫C x 2
你就可以拿單子自己去餅乾區拿2包C區的餅乾,你想換飲料的話也可以,指飲料他就會
拿給你了
最後你再拿景品跟上面的結算紙條,結算紙條上會有鋼珠數跟對應的景品數
你再上去或在那樓層外面找可以換成錢的窗口,像有些店會共用,可能就會在路面上的
一個小窗口,北海道比較冷的地方多數都在店裡比較多XD
你把景品放進去他就會顯示錢的數量換錢給你
最簡單你怕找不到的話,因為有些店真的很隱密尤其有些東京的店,你就在那等一下,
然後跟一個剛換完景品的日本人走,通常他也是去窗口換錢,你就跟他離有點距離去那
個窗口換錢就好,不要跟太近就好不然人家可能會以為你要搶劫之類的XD
知道那個窗口後就去那換回錢就好
這樣就結束你的柏青哥之旅了
提醒:
打柏青哥是高度運氣的台子,你會看台子也不保證每戰必勝,只是能提高勝率而已
有時當天就是雖,怎麼打就是不會開,那種時候就千萬不要再打了,你今天就是雖到不
會開
但有時就是隨便打隨便開,一開就開很好,打每一台都贏,常常都會有那樣的狀況
有時在這家打不好時,就不要再硬打輸錢,改天再打或換一家店打就好
通常我都會先贏一筆錢後用那些當賭本去打,盡量不要輸太多本金
所以挑好台子就很重要,有些坐下來打沒多久就開獎,有些死就是不開獎你也拿他沒辦
法
日本人打到自殺的很多,就知道是種輸贏大高度賭博性的東西,你認清本質就好
輸到一定程度要停一陣子,但贏到一定程度也要適當休息
因為贏的時候有時要打到閉店(晚上十一點)都還在贏,其實蠻累的
隔天就要適度休息不要打到身體變差
輸的時候也是,你預計的預算輸到就不要打,之後有預算再打
不要用透支的方式在打,通常就是雖到底XD
有錢才有膽,沒錢有膽是有勇無謀,輸光就要走路回家了
你每家熱門店都打看看,有時就是在那幾家打會贏,在那幾家打會輸,很明顯
那就盡量去手風順的店打,常輸的店就不要去代表磁場不合
玩賭博的東西要信邪,有時就是很邪門
以目前日本政府提高柏青哥跟柏青斯洛的稅金來說,在還沒打前其實就先輸稅金跟手續費
了
未來的柏青哥不至於消失,畢竟還是日本人很重要的生活一部份
你全關掉社會會變得很動蕩,光老人沒地方跑你就很頭大
而柏青哥能回收的稅金又多,是日本政府很重要的稅金來源
未來賭博性會降低,休閒的成分會提高,很多機台的聲光效果都很棒打來很好玩
有時候只是想聽歌打機台也是有XD
像牙狼系列我就很喜歡玩,其次就北斗神拳、花之慶次
海物語那些老人機我比較不愛
年輕人都打牙狼那些比較多,通常也是日本店裡的主力機台,聲光效果棒敢咬也敢吐
大概是這樣 簡單分享 有機會體驗打一下柏青哥也是很有趣的喔
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.133.249.41
※ 文章網址: https://www.ptt.cc/bbs/Japan_Travel/M.1502870009.A.D96.html
※ 編輯: NowQmmmmmmmm (220.133.249.41), 08/16/2017 16:43:32
因為我不抽煙所以都在梅田混比較多 梅田都上班族 下班打比較方便
東京人打都超嚴肅 不像大阪打常常可以跟旁邊的人聊天XD
京都我也常打 不過只打京都車站前的店 店都好小 還是大阪好~
北海道我只在札幌車站前跟貍小路還有小樽打過 有些店真的大不過打的人好少
還是關西比較好 輸贏比較爽
※ 編輯: NowQmmmmmmmm (220.133.249.41), 08/16/2017 16:45:48
※ 編輯: NowQmmmmmmmm (220.133.249.41), 08/16/2017 16:53:06
平面一樓到三樓是唐吉柯德 以上才是ROUND1~我幾乎天天去很熟
※ 編輯: NowQmmmmmmmm (220.133.249.41), 08/16/2017 16:55:26
試~常打就會看到了
... <看更多>