Save 37% off PRO during our Black Friday Sale! »

ビヨンドブロックチェーン / Beyond Blockchain

ビヨンドブロックチェーン / Beyond Blockchain

2018年8月14日(火)〜18日(土) に開催された IPA セキュリティ・キャンプ全国大会 2018 の中で 15日(水) に実施した【開発と運用トラック】「ビヨンドブロックチェーン」にて使用したスライドです。

847a328633b1df6b11cc2f72430025e6?s=128

Kenji Saito
PRO

August 15, 2018
Tweet

Transcript

  1. — SFC ( ) ks91@sfc.wide.ad.jp — 2018-08-15 – p.1/94

  2. ( ) SFC ( ) ( ) CSO (Chief Science

    Officer) 1993 ( ) 2006 ( ) SFC 17 P2P (Peer-to-Peer) 2011 → ( ) — 2018-08-15 – p.2/94
  3. (2017) : SF + + SF (2048 ) 2048 —

    2018-08-15 – p.3/94
  4. — 2018-08-15 – p.4/94

  5. — 2018-08-15 – p.5/94

  6. ( ) (1) (2) (3) (4) ( ) state machine

    replication (1984) — 2018-08-15 – p.6/94
  7. 1) = ( , , , ) 2) 3) ⇒

    ( ) ⇒ · / (dependable ) — 2018-08-15 – p.7/94
  8. /DLT ( ) Bitcoin ( ) Open Assets Protocol (OAP)

    ( ) Ethereum ( ) ( ) Enterprise Ethereum Alliance (↓ ) (DLT: Distributed Ledger Technology) ( ) Hyperledger (Linux Foundation) Fabric (IBM/DAH), Sawtooth (Intel), Iroha ( ) Corda (R3), Tangle (IOTA), . . . , BBc-1 ( ) — 2018-08-15 – p.8/94
  9. (1) ( ) ⇒ P2P ( ) ⇒ — 2018-08-15

    – p.9/94
  10. (2) (double spending) ( ) ⇒ ⇒ ( ) ⇒

    ⇒ → → ⇒ → — 2018-08-15 – p.10/94
  11. — — 2018-08-15 – p.11/94

  12. politics (politics) “Code is Law” . . . . .

    . — 2018-08-15 – p.12/94
  13. / (1) 2,100 cm3 (cc) 1 1cm3 10 12.5cm3 ⇒

    ⇒ ( ) — 2018-08-15 – p.13/94
  14. / (2) ( ) ( ) ( ) ( )

    ( ) → ( ) — 2018-08-15 – p.14/94
  15. ∼ UTXO (= ) → — 2018-08-15 – p.15/94

  16. UTXO M A 60BTC ( ) SegWit ( ) —

    2018-08-15 – p.16/94
  17. ∼ ท൪߸O ท൪߸O  ท൪߸O  લทͷμΠδΣετ λʔήοτҎԼͰͳ͍ͱ͍͚ͳ͍ ͸Έͩ͠ίʔφʔ μΠδΣετ͕λʔήοτҎԼʹͳΔΑ͏ʹೖΕΔద౰ͳ಺༰

    ( ) → — 2018-08-15 – p.17/94
  18. ∼ ϖʔδ൪߸O ϖʔδ൪߸O  ϖʔδ൪߸O  ϖʔδ൪߸O  ϖʔδ൪߸O 

    ϖʔδ൪߸O  ϖʔδ൪߸O  ϖʔδ൪߸O  ͬͪ͜ͷྺ࢙͕༗ޮ ( ) — 2018-08-15 – p.18/94
  19. /DLT ਖ਼౰ੑͷอূ ྫ6590ߏ଄ͱσδλϧॺ໊ ଘࡏੑͷূ໌ ྫ࡞ۀূ໌෇͖ϋογϡνΣʔϯ །Ұੑͷ߹ҙ ྫφΧϞτɾίϯηϯαε ϧʔϧͷهड़ ྫ#5$ͷҠస ɾ

    τϥϯβΫγϣϯͷ಺༰͕վ͟ΜͰ͖ͣɺ ɾ ͦͷΞηοτʹؔ͢ΔաڈͷτϥϯβΫγϣϯྻʹরΒͯ͠ໃ६͕ͳ͘ɺ ɾ ͔ͭɺਖ਼౰ͳϢʔβʹΑΓ౤ೖ͞Ε͍ͯΔ͜ͱΛอূ͢Δ ɾաڈʹ͋ͬͨτϥϯβΫγϣϯͷূڌΛຣফͰ͖ͣɺ ɾ ͔ͭɺաڈʹͳ͔ͬͨτϥϯβΫγϣϯͷূڌΛ፻଄Ͱ͖ͳ͍ ɾໃ६͢Δ;ͨͭͷτϥϯβΫγϣϯ͕౤ೖ͞Εͨ৔߹ɺ ɹ ͍ͣΕ ؔ༩͢Δશһ͕ಉ͡ยํΛબΜͰྺ࢙ͷதʹҐஔ͚ͮΔ ɾΞϓϦέʔγϣϯϩδοΫ Կ͕ਖ਼͍͠τϥϯβΫγϣϯ͔ΛܾΊΔ — 2018-08-15 – p.19/94
  20. /DLT Bitcoin, Ethereum DLT BBc-1 ( ) ( ) (

    ) ( ) ( ) ( ) ( ) ( ) ( ) Ethereum ( ) ( ) — 2018-08-15 – p.20/94
  21. ( ( )) ( ) DLT ( ) ( )

    : ( ) ( ) ( ) BBc-1 ( ) — 2018-08-15 – p.21/94
  22. 0 and/or “The Times 03/Jan/2009 Chancellor on brink of second

    bailout for banks” 2009 1 3 2 https://blockchain.info SEARCH 0 — 2018-08-15 – p.22/94
  23. /DLT ( ) ( ) ( vs. ) ( )

    ( ) ( ) ⇒ ( : BBc-1) DLT : : — 2018-08-15 – p.23/94
  24. → ( ) — 2018-08-15 – p.24/94

  25. C V C ≥ V Bitcoin ( ) bitcoin Bitcoin

    ( ) Ethereum DLT ( ) BBc-1 ( ) ( ) C ≥ V (proactive) (introspection ( ) ) ( ) — 2018-08-15 – p.25/94
  26. — 2018-08-15 – p.26/94

  27. Ethereum ( ) ( ) ⇒ (Casper) ( ) ⇒

    ZoE (Zcash on Ethereum) ( vs. ) ( ) ⇒ Plasma ( ) ⇒ ( ) (Benevolent Dictator For Life (BDFL)) ( ) ⇒ — 2018-08-15 – p.27/94
  28. BBc-1 ( ) ( ) ⇒ ( ) ⇒ (

    vs. ) ( ) ⇒ DHT ( ) ⇒ ( ) ( ) ⇒ — 2018-08-15 – p.28/94
  29. Beyond Blockchain One (BBc-1) https://beyond-blockchain.org https://github.com/beyond-blockchain 2017 10 31 2018

    5 22 core v1.0 office@beyond-blockchain.org (1) (2) (3) — 2018-08-15 – p.29/94
  30. #JUDPJO ##D$PSF ϨοδϟʔαϒγεςϜ ΞϓϦέʔγϣϯ ͦ ͷ ଞ ͞ · ͟

    · ͳ Ξ ϓ Ϧ ͷ Մ ೳ ੑ ڞ௨ϥΠϒϥϦ ##D ։ൃ߲໨ ஍ Ҭ ௨ ՟ Ξ ϓ Ϧ ϙ Π ϯ τ Ξ ϓ Ϧ དྷ ྺ ূ ໌ Ξ ϓ Ϧ ʜ ॳظʹ͓͍ͯଘࡏূ໌Λґଘ ΞϯΧϦϯά ֤ϊʔυʹ͓͚Δه࿥ʹ͸ ֤छσʔλϕʔεΛར༻Մೳ TRMJUF.Z42-ͦͷଞ%# BBc-1 σδλϧ௨՟ϥΠϒϥϦ ͦͷଞͷϥΠϒϥϦ Bitcoin Ethereum ( ) ( ) — 2018-08-15 – p.30/94
  31. ⇒ BBc-1 ( ) ( ) ( ) — 2018-08-15

    – p.31/94
  32. — ( . . .) QR ⇒ — 2018-08-15 –

    p.32/94
  33. AI → : — 2018-08-15 – p.33/94

  34. BBc-1 https://speakerdeck.com/beyondblockchain Ethereum — 2018-08-15 – p.34/94

  35. : https://github.com/beyond-blockchain/bbc1/blob/develop/docs/BBc1_core_tutorial_installation_ja.md Python — 2018-08-15 – p.35/94

  36. Python 3.5.0 (3.6.0 ) ( + pipenv) macOS + Homebrew

    $ brew install libtool automake pkg-config libffi autoconf openssl Linux (Ubuntu 16.04 LTS ) $ sudo apt install -y git tzdata openssh-server libffi-dev net-tools autoconf automake libtool libssl-dev pkg-config make Windows 10 Linux (Ubuntu 16.04 LTS ) — 2018-08-15 – p.36/94
  37. Python (venv) macOS ‘python3.6’ ‘python3’ $ python3.6 -m venv bbcenv

    $ source bbcenv/bin/activate (bbcenv) $ pip install -U pip (bbcenv) $ deactivate — 2018-08-15 – p.37/94
  38. pip $ pip install bbc1 develop $ bbc_core.py --no_nodekey --no_nodekey

    Python 3.7.0 “bad argument to internal function” $ pip install -U --force-reinstall --no-binary :all: gevent <CTRL>+C — 2018-08-15 – p.38/94
  39. (develop pip ) pip install $ git clone https://github.com/beyond-blockchain/bbc1.git $

    cd bbc1 $ python setup.py sdist $ pip install dist/bbc1-1.0.1.tar.gz dist tar pip install — 2018-08-15 – p.39/94
  40. BBc-1 Core : https://github.com/beyond-blockchain/bbc1/blob/develop/docs/BBc1_core_tutorial_file_proof_ja.md — 2018-08-15 – p.40/94

  41. file proof ( ) ( ) ( ) — 2018-08-15

    – p.41/94
  42. bbc_core.py venv file_proof $ source bbcenv/bin/activate — 2018-08-15 – p.42/94

  43. --help $ file_proof.py --help file_proof.py $ file_proof.py keypair $ file_proof.py

    setup — 2018-08-15 – p.43/94
  44. $ cat > test.txt BBC HEAVEN. <CTRL>+D $ more test.txt

    BBC HEAVEN. file_proof.py BBc-1 Core $ file_proof.py store test.txt BBc-1 Core — 2018-08-15 – p.44/94
  45. (1) ——- Dump of the transaction data —— * transaction_id:

    b’de0af83d66170096dac81c4889bed3e1a20b6ab3eb3ae789adf8a580e25c100c’ version: 0 timestamp: 1529296860 Event[]: 0 Reference[]: 0 Relation[]: 1 [0] asset_group_id: b’45b2a200ccdcdcc3fb80cc9d423e1069f3ca726157f6492b4a70a48e4a1713ab’ Asset: asset_id: b’8bd26d0774050015181185de631c48bdfba411b64fb318f3cbfe8df2dcc80a9d’ user_id: b’e59c553504ca7a54f888eb47e61b773a221ae1311bd58ec4c0912d71c443d715’ nonce: b’83136a5fe6a76ab0’ file_size: 12 file_digest: b’7a30a5ef92e4f84287225e980c48ad3a7c29ea929a710d6b798a9bdcc41afc97’ body_size: 21 body: b’Owner is user_default’ — 2018-08-15 – p.45/94
  46. (2) Witness: [0] user_id: b’e59c553504ca7a54f888eb47e61b773a221ae1311bd58ec4c0912d71c443d715’ sig_index: 0 Cross_Ref: None Signature[]:

    1 [0] key_type: 1 signature: b’2a99a304311eacec015f99638584865faf5c7b5b609f0a04762ea40828baf11934df 6cc22289287362b9f9d6deb7f2c6f9528d0aab61b059292f50646942e553’ pubkey: b’04dc03d221c173fb2cf49bd4f2077fdd88babaa8234a96353b245cb3450ca665a12adb1 86695040188b366f12569b892c63f8410b9e471c4f1cf6f3ff96ddc48fc’ — 2018-08-15 – p.46/94
  47. BBc-1 Core $ rm test.txt $ file_proof.py get test.txt —

    2018-08-15 – p.47/94
  48. BBc-1 Core $ file_proof.py verify test.txt 1 test.txt is valid

    1 test.txt is invalid — 2018-08-15 – p.48/94
  49. BBc-1 Core $ file_proof.py update test.txt BBc-1 Core verify $

    file_proof.py verify test.txt — 2018-08-15 – p.49/94
  50. (1) ——- Dump of the transaction data —— * transaction_id:

    b’346cd3f414a3ed25b7180a80bde41b1b611c13a4de0018f9684356312fa3ddbf’ version: 0 timestamp: 1529297518 Event[]: 0 Reference[]: 0 Relation[]: 1 [0] asset_group_id: b’45b2a200ccdcdcc3fb80cc9d423e1069f3ca726157f6492b4a70a48e4a1713ab’ Pointers[]: 1 [0] transaction_id: b’de0af83d66170096dac81c4889bed3e1a20b6ab3eb3ae789adf8a580e25c100c’ asset_id: None Asset: asset_id: b’69e01aef0e2854aa45625036f824c8275ecfacf48090b07b21bed216f5a67b34’ user_id: b’e59c553504ca7a54f888eb47e61b773a221ae1311bd58ec4c0912d71c443d715’ nonce: b’1f0e962766009a52’ — 2018-08-15 – p.50/94
  51. (2) file_size: 11 file_digest: b’d866539f224896613df91023f0a9e226085451d6adf1dc5282cbba129d553713’ body_size: 21 body: b’Owner is

    user_default’ Witness: [0] user_id: b’e59c553504ca7a54f888eb47e61b773a221ae1311bd58ec4c0912d71c443d715’ sig_index: 0 Cross_Ref: None Signature[]: 1 [0] key_type: 1 signature: b’5eeb9ca0ce527c90e62a6d087e13ccc009b621974420a5f6201ad65443d0b600c4c2c0 ac6f4ba22beee8a1e265853d13fc3e147ad38c2bebc9b06869559925ff’ pubkey: b’04dc03d221c173fb2cf49bd4f2077fdd88babaa8234a96353b245cb3450ca665a12adb186 695040188b366f12569b892c63f8410b9e471c4f1cf6f3ff96ddc48fc’ — 2018-08-15 – p.51/94
  52. / ( ) $ file_proof.py keypair $ file_proof.py setup $

    file_proof.py wait -o someone ID $ file_proof.py send test.txt “someone” file_proof.py get — 2018-08-15 – p.52/94
  53. (1) verify ——- Dump of the transaction data —— *

    transaction_id: b’8775246772587c9b35329ae39a2d6826175c2cb7ba98da80f51e818db4a144d7’ version: 0 timestamp: 1529298154 Event[]: 0 Reference[]: 0 Relation[]: 1 [0] asset_group_id: b’45b2a200ccdcdcc3fb80cc9d423e1069f3ca726157f6492b4a70a48e4a1713ab’ Pointers[]: 1 [0] transaction_id: b’346cd3f414a3ed25b7180a80bde41b1b611c13a4de0018f9684356312fa3ddbf’ asset_id: None Asset: asset_id: b’97a5023af9fcdba1fb72e12f34c9bf05ee1b24636c02f8d88f5a7f9d269115b6’ user_id: b’2a59d59e3809f827ce709d3815e3950eef4a6a93af5557a93a7fdfba71460843’ nonce: b’18607aaf24de83ee’ — 2018-08-15 – p.53/94
  54. (2) file_size: 11 file_digest: b’d866539f224896613df91023f0a9e226085451d6adf1dc5282cbba129d553713’ body_size: 52 body: b’Ownership is

    transfered from user_default to someone’ Witness: [0] user_id: b’e59c553504ca7a54f888eb47e61b773a221ae1311bd58ec4c0912d71c443d715’ sig_index: 0 [1] user_id: b’2a59d59e3809f827ce709d3815e3950eef4a6a93af5557a93a7fdfba71460843’ sig_index: 1 Cross_Ref: None — 2018-08-15 – p.54/94
  55. (3) Signature[]: 2 [0] key_type: 1 signature: b’149b0fd48137fec9a076b9214de857da285f2bcc7e634579ac519eada35386179b9c 78e6aa20910165648d8bef62e625d449445626d9c7bcdfaf63d1279331ee’ pubkey:

    b’04dc03d221c173fb2cf49bd4f2077fdd88babaa8234a96353b245cb3450ca665a12adb1 86695040188b366f12569b892c63f8410b9e471c4f1cf6f3ff96ddc48fc’ [1] key_type: 1 signature: b’51f77ef2b66bd61db125facbc478c03df5a258af8fded20501c00665594c910604e7d e5c5b75d0259cf8716acd1e99a193fc79f20173b175e1b8bfe72c530df0’ pubkey: b’045833b8045305cb4da21f17cef4c44941de6152d0cfc0c77bc638071a8b86337a59f474 fc11e924a5afe7f3fc4e43491a55193c32f9403ca574ddc088cf8d5158’ — 2018-08-15 – p.55/94
  56. file_proof BBc-1 Core — 2018-08-15 – p.56/94

  57. Python3 bbc1 : https://speakerdeck.com/beyondblockchain/bbc-1-hands-on-installation-and-file-content-proof bbc1-lib-std ( ) bbc1-lib-tokens ( )

    — 2018-08-15 – p.57/94
  58. GitHub git clone $ git clone https://github.com/beyond-blockchain/bbc1-lib-std.git $ cd bbc1-lib-std

    $ git checkout develop tar pip $ python setup.py sdist $ pip install dist/bbc1-lib-std-0.11.0.tar.gz — 2018-08-15 – p.58/94
  59. ( SQLite3 ) ( ) ( ) ( ) (

    ) — 2018-08-15 – p.59/94
  60. GitHub git clone $ git clone https://github.com/beyond-blockchain/bbc1-lib-tokens.git $ cd bbc1-lib-tokens

    $ git checkout develop tar pip $ python setup.py sdist $ pip install dist/bbc1-lib-tokens-0.10.0.tar.gz bbc_core.py — 2018-08-15 – p.60/94
  61. (mint) / mint mint — 2018-08-15 – p.61/94

  62. payment payment — 2018-08-15 – p.62/94

  63. payment payment bbc1-lib-tokens bbc-lib-std — 2018-08-15 – p.63/94

  64. payment GitHub git clone $ git clone https://github.com/beyond-blockchain/examples.git $ cd

    examples/payment payment.py BBc-1 — 2018-08-15 – p.64/94
  65. payment ( ) ( (mint) ) ( ) — 2018-08-15

    – p.65/94
  66. $ python payment.py --help (bbc_core.py ) $ python payment.py setup

    “./.bbc1_app_support” — 2018-08-15 – p.66/94
  67. alice bob $ python payment.py def-user alice $ python payment.py

    def-user bob alice bob ( ) — 2018-08-15 – p.67/94
  68. $ python payment.py user alice ∗bob bob ( bob )

    alice $ python payment.py user alice ∗alice bob — 2018-08-15 – p.68/94
  69. $ python payment.py def-currency Yen JPY default_spec.json (mint) ( )

    $ python payment.py currency ∗Yen — 2018-08-15 – p.69/94
  70. alice 1,000 $ python payment.py issue 1000 alice mint alice

    bob $ python payment.py status alice balance = 1000JPY. $ python payment.py status bob balance = 0JPY. — 2018-08-15 – p.70/94
  71. alice bob 100 $ python payment.py transfer 100 bob alice

    mint $ python payment.py status alice balance = 900JPY. $ python payment.py status bob balance = 100JPY. — 2018-08-15 – p.71/94
  72. 2 $ python payment.py def-currency Dollar USD decimal_2.json mint (

    ) $ python payment.py currency Yen ∗Dollar — 2018-08-15 – p.72/94
  73. (1) ( ) bob 10 $ python payment.py issue 10

    bob mint alice bob $ python payment.py status alice balance = 0.00USD. $ python payment.py status bob balance = 10.00USD. — 2018-08-15 – p.73/94
  74. (2) $ python payment.py currency Yen ∗Yen Dollar alice bob

    1 110 (bob alice 110 1 ) $ python payment.py swap 110 bob 1 Dollar alice, bob, mint, mint — 2018-08-15 – p.74/94
  75. (3) alice bob $ python payment.py status alice balance =

    790JPY. $ python payment.py status bob balance = 210JPY. $ python payment.py currency Dollar Yen ∗Dollar $ python payment.py status alice balance = 1.00USD. $ python payment.py status bob balance = 9.00USD. — 2018-08-15 – p.75/94
  76. payment.py payment.py token_lib.BBcMint swap() BBcMint swap() — 2018-08-15 – p.76/94

  77. . . . — 2018-08-15 – p.77/94

  78. token lib mint token_lib.BBcMint mint.transfer() . . . transaction mint.store.sign()

    . . . mint.store.sign_and_insert() . . . — 2018-08-15 – p.78/94
  79. 304 mint.swap(counter_mint, user.user_id, counter_user.user_id, value1, value2, keypair_this=user.keypair, keypair_that=counter_user.keypair, keypair_mint=currency.keypair, keypair_counter_mint=counter_currency.keypair)

    ⇓ tx = mint.transfer(user.user_id, counter_user.user_id, value1) counter_mint.transfer(counter_user.user_id, user.user_id, value2, transaction=tx) mint.store.sign(tx, counter_user.user_id, counter_user.keypair) mint.store.sign(tx, mint.mint_id, currency.keypair) mint.store.sign(tx, counter_mint.mint_id, counter_currency.keypair) mint.store.sign_and_insert(tx, user.user_id, user.keypair, mint.idPublickeyMap) — 2018-08-15 – p.79/94
  80. BBc-1 payment.py bbc-lib-tokens bbc-lib-std — 2018-08-15 – p.80/94

  81. Ethereum Go Ethereum Solidity — 2018-08-15 – p.81/94

  82. Go Etheruem macOS + Homebrew $ brew install geth Linux

    (Ubuntu 16.04 LTS ) $ sudo apt install software-properties-common $ sudo add-apt-repository -y ppa:ethereum/ethereum $ sudo apt update $ sudo apt install ethereum Windows 10 Linux (Ubuntu 16.04 LTS ) — 2018-08-15 – p.82/94
  83. Solidity macOS + Homebrew $ brew install solidity Linux (Ubuntu

    16.04 LTS ), Windows 10 $ sudo apt install solc — 2018-08-15 – p.83/94
  84. BBc-1 Core — 2018-08-15 – p.84/94

  85. git clone $ git clone https://github.com/beyond-blockchain/ledger_subsystem.git $ cd ledger_subsystem tar

    pip $ python setup.py sdist $ pip install dist/ledger_subsystem-0.11.0.tar.gz — 2018-08-15 – p.85/94
  86. Ethereum populus (Python Ethereum ) Genesis Ethereum BBcAnchor — 2018-08-15

    – p.86/94
  87. (1) “bbc_core.py” BBc-1 Core bbc_core.py populus $ eth_subsystem_tool.py -w ∼/.bbc1

    populus Genesis $ eth_subsystem_tool.py -w ∼/.bbc1 genesis Ethereum $ eth_subsystem_tool.py -w ∼/.bbc1 new_account — 2018-08-15 – p.87/94
  88. (2) geth $ eth_subsystem_tool.py -w ∼/.bbc1 run_geth $ tail -f

    geth.log BBcAnchor ( ) $ eth_subsystem_tool.py -w ∼/.bbc1 deploy geth $ eth_subsystem_tool.py -w ∼/.bbc1 stop_geth “run_geth” — 2018-08-15 – p.88/94
  89. BBcAnchor.sol ( ) contract BBcAnchor { mapping (uint256 => uint)

    public _digests; constructor () public { } function getStored(uint256 digest) public returns (uint block_no) { return (_digests[digest]); } function isStored(uint256 digest) public returns (bool isStored) { return (_digests[digest] > 0); } function store(uint256 digest) public returns (bool isAlreadyStored) { bool isRes = _digests[digest] > 0; if (!isRes) { _digests[digest] = block.number; } return (isRes); } } — 2018-08-15 – p.89/94
  90. — 2018-08-15 – p.90/94

  91. (“bbc_core.py” ) $ eth_subsystem_tool.py -w ∼/.bbc1 config_demo 100 30 domain_id

    ( ) “bbc_core.py” $ eth_subsystem_tool.py -w ∼/.bbc1 -d enable — 2018-08-15 – p.91/94
  92. 3 $ eth_subsystem_tool.py -w ∼/.bbc1 -d register_demo 3 transaction_id (

    ) $ eth_subsystem_tool.py -w ∼/.bbc1 -d verify 30 verify — 2018-08-15 – p.92/94
  93. Ethereum verify “eth_subsystem_tool.py” “subsystem_tool_lib.py” — 2018-08-15 – p.93/94

  94. — 2018-08-15 – p.94/94