Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
dapp 開発における big number の落とし穴 / Pitfalls of the ...
Search
blue planet
November 10, 2018
Technology
0
120
dapp 開発における big number の落とし穴 / Pitfalls of the big number in dapp development
イーサリアムと web3.js で dapp 開発する際の落とし穴と対応策
blue planet
November 10, 2018
Tweet
Share
More Decks by blue planet
See All by blue planet
join.me使用方法
blueplanet
0
120
rails cn
blueplanet
0
210
Sublime Text 2 プラグイン開発 - ゼロからPackageControlへ登録まで
blueplanet
5
2k
Other Decks in Technology
See All in Technology
Creative Pair
kawaguti
PRO
1
140
Power BI は、レポート テーマにこだわろう!テーマのティア表付き
ohata_ds
0
130
アンチパターンのアーキテクチャと組織 / Anti-Pattern Software Architecture and Organization
oztick139
0
120
ゆもつよがこの30年間自ら経験してきたQA、テストの歴史と未来
ymty
2
230
20250130_『SUUMO』の裏側!第2弾 ~機械学習エンジニアリング編
recruitengineers
PRO
0
370
AWSでRAGを実現する上で感じた3つの大事なこと
ymae
3
690
EDRからERM: PFN-SIRTが関わるセキュリティとリスクへの取り組み
pfn
PRO
0
130
君はPostScriptなウィンドウシステム 「NeWS」をご存知か?/sunnews
koyhoge
0
520
CNAPPから考えるAWSガバナンスの実践と最適化
nrinetcom
PRO
1
380
日経電子版 x AIエージェントの可能性とAgentic RAGによって提案書生成を行う技術
masahiro_nishimi
1
110
Kubernetesでメールの大量配信をしている話/k8sjp-20250205
hfukamachi
0
190
生成AIの利活用を加速させるための取り組み「prAIrie-dog」/ Shibuya_AI_1
visional_engineering_and_design
1
110
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Adopting Sorbet at Scale
ufuk
74
9.2k
Making the Leap to Tech Lead
cromwellryan
133
9.1k
What's in a price? How to price your products and services
michaelherold
244
12k
YesSQL, Process and Tooling at Scale
rocio
171
14k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Writing Fast Ruby
sferik
628
61k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
990
Into the Great Unknown - MozCon
thekraken
34
1.6k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
Transcript
DAPP 開発における BIG NUMBER の落とし⽳穴 Hi-CON 2018
⽬目次 0. ⾃自⼰己紹介 1. イーサリアムの数値 2. BigNumber ライブラリ 3. まとめ
⾃自⼰己紹介 0
4 { name: “⿂振江”, kana: “ギョシンコウ”, role: “CTO”, company: “chainbow.io”,
}
5
イーサリアムの数値 1
7 Solidity のデータ型には、⼩数型はないですよね const transaction = … const testCoin =
new web3.eth.Contract(abi, tokenAddress) const decimals = await testCoin.methods.decimals().call() const tokenValue = transaction.value / 10 ** tokenInfo.decimals console.log(tokenValue)
8 ERC20 の decimals は普通に 18 ですよね @bob: 10 TTC
送⾦金金してみたぜ! @alice: 10 TTC 来てます! @bob: 0.01 TTC 送⾦金金してみたぜ! @alice: 0.01 TTC 来てます!
9 ERC20 の decimals は普通に 18 ですよね @bob: 10 TTC
送⾦金金してみたぜ! @alice: 10 TTC 来てます! @bob: 0.01 TTC 送⾦金金してみたぜ! @alice: 1.0000000000000001e-20 TTC 来てます!
BigNumber ライブラリ 2
11 web3.utils.fromWei 使いたい Ver 0.20.7 var fromWei = function(number, unit)
{ var returnValue = toBigNumber(number).dividedBy(getValueOfUnit(unit)); return isBigNumber(number) ? returnValue : returnValue.toString(10); }; https://github.com/ethereum/web3.js/blob/develop/lib/utils/utils.js#L329-L333
12 web3.utils.fromWei 使いたい Ver 0.20.7 "dependencies": { "bignumber.js": "github:frozeman/bignumber.js-nolookahead", "crypto-js":
"^3.1.4", "utf8": "^2.1.1", "xhr2-cookies": "^1.1.0", "xmlhttprequest": "*" },
13 web3.utils.fromWei 使いたい Ver 1.0.0-beta.36 var fromWei = function(number, unit)
{ unit = getUnitValue(unit); if(!utils.isBN(number) && !_.isString(number)) { throw new Error('Please pass numbers as strings or BigNumber objects to avoid precision errors.'); } return utils.isBN(number) ? ethjsUnit.fromWei(number, unit) : ethjsUnit.fromWei(number, unit).toString(10); }; https://github.com/ethereum/web3.js/blob/1.0/packages/web3-utils/src/index.js#L231-L239
14 web3.utils.fromWei 使いたい Ver 1.0.0-beta.36 "dependencies": { "bn.js": "4.11.6", "eth-lib":
"0.1.27", "ethjs-unit": "0.1.6", "number-to-bn": "1.7.0", "randomhex": "0.1.5", "underscore": "1.8.3", "utf8": "2.1.1" }
15 web3.utils.fromWei 使いたい Ver 1.0.0-beta.36 function fromWei(weiInput, unit, optionsInput) {
var wei = numberToBN(weiInput); // eslint-disable-line var negative = wei.lt(zero); // eslint-disable-line const base = getValueOfUnit(unit); const baseLength = unitMap[unit].length - 1 || 1; const options = optionsInput || {}; if (negative) { wei = wei.mul(negative1); } var fraction = wei.mod(base).toString(10); // eslint-disable-line while (fraction.length < baseLength) { fraction = `0${fraction}`; } if (!options.pad) { fraction = fraction.match(/^([0-9]*[1-9]|0)(0*)/)[1]; // 省略 return value; } https://github.com/ethjs/ethjs-unit/blob/master/src/index.js#L83-L117
16 web3.utils.fromWei 使いたい Ver 1.0.0-beta.36 import Big from 'bignumber.js'; function
BigNumber (number, base) { return new Big(number, base); } function toDecimals (number, decimals) { return BigNumber(number).times(BigNumber(10).pow(decimals)); } function fromDecimals (number, decimals) { return BigNumber(number).div(BigNumber(10).pow(decimals)); }
まとめ 3
数字ではなく、資産になるので、慎重にやりましょう
ご清聴ありがとうございました!