{"id":18956,"date":"2023-02-01T05:00:00","date_gmt":"2023-02-01T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=18956"},"modified":"2023-02-16T14:46:53","modified_gmt":"2023-02-16T13:46:53","slug":"smart-contract-i-iot-oswiadczyny-w-blockchainie","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/smart-contract-i-iot-oswiadczyny-w-blockchainie\/","title":{"rendered":"Smart contract i IoT: o\u015bwiadczyny w blockchainie"},"content":{"rendered":"\n<p>Technologia blockchain powsta\u0142a w kontek\u015bcie walut cyfrowych i przeprowadzania bezpiecznych transakcji z ich wykorzystaniem. By\u0142o to pierwsze i jest to wci\u0105\u017c najbardziej popularne zastosowanie zdecentralizowanego rejestru, jakim jest \u0142a\u0144cuch blok\u00f3w. Dosy\u0107 szybko zorientowano si\u0119, \u017ce system ten ma du\u017co wi\u0119kszy potencja\u0142, a technologia znalaz\u0142a praktyczny u\u017cytek r\u00f3wnie\u017c w wielu innych dziedzinach.<\/p>\n\n\n\n<p>Niestety, najbardziej chwytliwy i medialny aspekt stanowi temat handlu kryptowalutami na gie\u0142dach \u2013 kto ile milion\u00f3w zyska\u0142, a kto je straci\u0142. \u0141atwo\u015b\u0107 spekulowania kryptowalutami jest jedn\u0105 z <strong>g\u0142\u00f3wnych wad realizacji projekt\u00f3w<\/strong> z wykorzystaniem tej bezpiecznej i rozproszonej bazy danych, \u015bci\u015ble zwi\u0105zanej z walutami cyfrowymi. Wp\u0142ywa to znacz\u0105co na koszty tworzenia inteligentnych kontrakt\u00f3w, przeprowadzenia transakcji, a co za tym idzie \u2013 na realny koszt projektu.<\/p>\n\n\n\n<p>W dalszej cz\u0119\u015bci artyku\u0142u przedstawi\u0119 spos\u00f3b realizacji projektu IoT wykorzystuj\u0105cy technologi\u0119 blockchain, tworzenie smart kontrakt\u00f3w i spos\u00f3b pod\u0142\u0105czenia do sieci Ethereum w systemach wbudowanych. Postaram si\u0119 w spos\u00f3b praktyczny zaprezentowa\u0107 wcze\u015bniej wspomniane zagadnienia zwi\u0105zane z wykorzystaniem \u0142a\u0144cucha blok\u00f3w poza \u015bwiatem finansowym.<\/p>\n\n\n\n<p>Zaczynamy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>O\u015bwiadczyny jako smart contract<\/strong><\/h2>\n\n\n\n<p>Tak \u2013 jestem nerdem. Musia\u0142em wymy\u015bli\u0107 co\u015b troszk\u0119 nietypowego, \u017ceby \u2013 jak mi si\u0119 wydawa\u0142o \u2013 zaimponowa\u0107 swojej dziewczynie (\u201ea mog\u0142a to by\u0107 romantyczna kolacja\u201d \u2013 pomy\u015bla\u0142a M.).&nbsp;&nbsp;<\/p>\n\n\n\n<p>Hmmm, a mo\u017ce tak zdefiniowa\u0107 ramy czasowe i inne warunki, jakie musz\u0105 zosta\u0107 spe\u0142nione do o\u015bwiadczyn? I dodatkowo: \u017ceby ka\u017cdy widzia\u0142, mia\u0142 dost\u0119p i m\u00f3g\u0142 zweryfikowa\u0107 decyzj\u0119, jaka zosta\u0142a podj\u0119ta. Wchodzi on \u2013 blockchain \u2013 ubrany ca\u0142y na bia\u0142o.<\/p>\n\n\n\n<p>Mamy ju\u017c nasz\u0105&nbsp;gwiazd\u0119 projektu, wi\u0119c teraz zostaje jeszcze pytanie, w jaki spos\u00f3b ma si\u0119 to odby\u0107. W zwi\u0105zku z tym, \u017ce pracuj\u0119 w dziale Embedded i zawsze blisko mi do elektroniki oraz sprz\u0119tu, to moim niepisanym obowi\u0105zkiem jest stworzenie czego\u015b fizycznego. Czego\u015b, co b\u0119d\u0119 m\u00f3g\u0142 wr\u0119czy\u0107 swojej dziewczynie z jakie\u015b wymy\u015blonej okazji. Tam b\u0119dzie <strong>ukryta niespodzianka<\/strong>, kt\u00f3ra zaskoczy j\u0105 w przysz\u0142o\u015bci. Ca\u0142o\u015b\u0107 przedsi\u0119wzi\u0119cia, uj\u0119t\u0105 w schemat blokowy, przedstawiam poni\u017cej.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.1.png\"><img decoding=\"async\" width=\"1024\" height=\"688\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.1-1024x688.png\" alt=\"Schemat blokowy\" class=\"wp-image-18957\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.1-1024x688.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.1-300x202.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.1-768x516.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.1.png 1420w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Ryc. 1 Schemat blokowy<\/figcaption><\/figure><\/div>\n\n\n\n<p>Przygotowa\u0142em o\u015bwiadczynowe pude\u0142ko sk\u0142adaj\u0105ce si\u0119 z: drewnianego opakowania, sterowanego elektronicznie zamka, Rpi zapewniaj\u0105cego dost\u0119p do sieci Ethereum oraz obs\u0142uguj\u0105cego kamer\u0119 (tak, tak, trzeba mie\u0107 dow\u00f3d), przycisk\u00f3w, led\u00f3w, GPS-a. Jako zamek wykorzysta\u0142em serwomechanizm blokuj\u0105cy mechanicznie mo\u017cliwo\u015b\u0107 otwarcia skrzynki.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-2-1-scaled.jpg\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-2-1-818x1024.jpg\" alt=\"O\u015bwiadczynowe pude\u0142ko\" class=\"wp-image-18959\" width=\"645\" height=\"808\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-2-1-818x1024.jpg 818w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-2-1-240x300.jpg 240w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-2-1-768x961.jpg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-2-1-1227x1536.jpg 1227w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-2-1-1636x2048.jpg 1636w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-2-1-scaled.jpg 2045w\" sizes=\"(max-width: 645px) 100vw, 645px\" \/><\/a><figcaption>Ryc. 2 O\u015bwiadczynowe pude\u0142ko<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Inteligentny kontrakt \u2013 krok po kroku<\/strong><\/h2>\n\n\n\n<p>Najpierw musia\u0142em napisa\u0107 inteligentny kontrakt. Nie ma jednoznacznej definicji czym jest tzw. smart contract. Imran Bashir w ksi\u0105\u017cce \u201e<a aria-label=\" (opens in a new tab)\" href=\"https:\/\/helion.pl\/autorzy\/imran-bashir\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Blockchain. Zaawansowane zastosowanie \u0142a\u0144cucha blok\u00f3w<\/a>\u201d pr\u00f3buje zdefiniowa\u0107 to tak:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Inteligenty kontrakt to bezpieczny i niemo\u017cliwy do zablokowania program komputerowy, reprezentuj\u0105cy umow\u0119, kt\u00f3ra jest automatycznie wykonywana i egzekwowana.<\/p><\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Przygotowanie \u015brodowiska<\/strong><\/h3>\n\n\n\n<p>Istniej\u0105 r\u00f3\u017cne j\u0119zyki, platformy i \u0142a\u0144cuchy blok\u00f3w, gdzie takie inteligentne kontrakty mog\u0105 by\u0107 umieszczone. <strong>Ethereum jest jedn\u0105 z najbardziej popularnych platform<\/strong> do ich rozwijania i obs\u0142ugiwania. Na potrzeby tego projektu wykorzysta\u0142em <strong>j\u0119zyk Solidity<\/strong> do stworzenia smart kontraktu dzia\u0142aj\u0105cego w EVM (Etherum Virtual Machine) oraz <a href=\"https:\/\/remix.ethereum.org\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >webowe narz\u0119dzie Remix<\/a> jako \u015brodowisko programistyczne. S\u0142u\u017cy ono do:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>kompilowania nowych kontrakt\u00f3w do wykonania w EVM,<\/li><li>testowania kontrakt\u00f3w,<\/li><li>deployowania nowych kontrakt\u00f3w do sieci testowej lub do sieci Mainnet,&nbsp;<\/li><li>wykonywania interakcji na ju\u017c istniej\u0105cych w sieci smart kontraktach.<\/li><\/ul>\n\n\n\n<p>Mainnet jest to aktywny, publiczny, produkcyjny blockchain Ethereum, gdzie wykonuj\u0105 si\u0119 wszystkie transakcje o realnej warto\u015bci. Na gie\u0142dach notowana jest kryptowaluta ETH zwi\u0105zana w\u0142a\u015bnie z t\u0105 sieci\u0105. Dodatkowe sieci testowe s\u0142u\u017c\u0105 do sprawdzania dzia\u0142ania protoko\u0142u oraz testowania smart kontrakt\u00f3w przed umieszczeniem ich w g\u0142\u00f3wnej sieci. ETH w sieciach testowych nie maj\u0105 rzeczywistej warto\u015bci i nie s\u0105 notowane na \u017cadnej gie\u0142dzie. Aby uzyska\u0107 ETH w sieciach testowych, mo\u017cna wys\u0142a\u0107 zapytanie z wykorzystaniem specjalnych aplikacji webowych, tzw. \u201efaucet\u201d.<\/p>\n\n\n\n<p>Wszystkie <strong>zewn\u0119trzne elementy<\/strong> przekazuj\u0105ce dodatkowe dane do \u0142a\u0144cucha blok\u00f3w nazywamy <strong>wyroczniami (oracles).<\/strong> S\u0105 to ogniwa, kt\u00f3re musz\u0105 by\u0107 zaufane i zweryfikowane, aby nasz kontrakt dostawa\u0142 tylko prawdziwe dane. Pami\u0119tajmy \u2013 <strong>raz utworzonego kontraktu nie mo\u017cna ju\u017c zmieni\u0107<\/strong>, poniewa\u017c podstawow\u0105 cech\u0105 blockchaina jest jego sta\u0142o\u015b\u0107. Zosta\u0142 zapisany w \u0142a\u0144cuchu blok\u00f3w, zweryfikowany przez sie\u0107 (deployowanie kontraktu jest tak\u0105 sam\u0105 transakcj\u0105, jak transakcja przes\u0142ania Ether\u00f3w z jednego konta na drugie) i to od nas zale\u017cy jego stopie\u0144 zabezpieczenia przed mo\u017cliwymi atakami.<\/p>\n\n\n\n<p>W naszym przypadku elementem komunikuj\u0105cym si\u0119 z inteligentnym kontraktem jest nasza skrzynka. W kontrakcie zapisana zostanie lokalizacja, w kt\u00f3rej nasze pude\u0142ko \u201emagicznie\u201d si\u0119 otworzy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Historyczne b\u0142\u0119dy w kontrakcie, czyli drobny offtop<\/strong><\/h3>\n\n\n\n<p>B\u0142\u0105d w kontrakcie projektu The DAO (platformy inwestycyjnej) umo\u017cliwi\u0142 <strong>wyprowadzenie r\u00f3wnowarto\u015bci 50 mln dolar\u00f3w<\/strong> na konto atakuj\u0105cego i przyczyni\u0142o si\u0119 do utworzenia hard forka przez fundacj\u0119 Ethereum. W rezultacie doprowadzi\u0142o to do zaistnienia dw\u00f3ch osobnych \u0142a\u0144cuchu blok\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>pierwszy, kt\u00f3ry zawiera\u0142 wszystkie transakcje przed atakiem (Ethereum),<\/li><li>drugi, zawieraj\u0105cy aktualne transakcje, uwzgl\u0119dniaj\u0105c r\u00f3wnie\u017c transakcje atakuj\u0105cego (Ethereum Classic).<\/li><\/ul>\n\n\n\n<p>Du\u017ca grupa g\u00f3rnik\u00f3w sprzeciwi\u0142a si\u0119 tej sytuacji, uznaj\u0105c, \u017ce hard fork jest niezgodny z duchem decentralizacji i za\u0142o\u017ceniem niezmienno\u015bci operacji. Zdecydowa\u0142a si\u0119 na kontynuowanie wydobywania blok\u00f3w w pierwotnym \u0142a\u0144cuchu blok\u00f3w. Dzia\u0142o si\u0119 to w roku 2016, a ETC wci\u0105\u017c notowane jest na gie\u0142dzie (zgodnie z koncepcj\u0105: kod ponad wszystko). <a href=\"https:\/\/101blockchains.com\/what-is-ethereum-classic\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Incydent ten opisany jest szeroko w Internecie<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przygotowanie kontraktu<\/strong><\/h2>\n\n\n\n<p>Dobrze \u2013 po tym wprowadzeniu tworzymy kontrakt i jego konstruktor:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nconstructor(int32 down_lat_x100000, int32 up_lat_x100000, int32 left_lon_x100000, \nint32 right_lon_x100000) {\n         \tgeofence.down_lat_x100000 = down_lat_x100000; \n\tgeofence.up_lat_x100000 = up_lat_x100000;\n\tgeofence.left_lon_x100000 =  left_lon_x100000; \n\tgeofence.right_lon_x100000 = right_lon_x100000;\n}\n<\/pre><\/div>\n\n\n<p>Konstruktor ten mo\u017cna wywo\u0142a\u0107 tylko raz w trakcie deploymentu. Podczas umieszczenia kontraktu w sieci ustalamy warunki kontraktu, kt\u00f3re s\u0105 niezmienne w trakcie jego istnienia. Nale\u017cy o tym pami\u0119ta\u0107, poniewa\u017c w przypadku podania b\u0142\u0119dnych warto\u015bci, warunku kontraktu nie mo\u017cna ju\u017c p\u00f3\u017aniej zmieni\u0107. Parametry przekazywane w konstruktorze to szeroko\u015b\u0107 i d\u0142ugo\u015b\u0107 geograficzna naszego obszaru, gdzie ca\u0142e to ekscytuj\u0105ce wydarzenie ma nast\u0105pi\u0107.<\/p>\n\n\n\n<p>Do weryfikacji lokalizacji pos\u0142u\u017cy nam funkcja:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nfunction verifyLocation(int32 lat_x100000, int32 lon_x100000) external isOwner { \n\t\/\/require(location_verified == false, &quot;Location has been already verified&quot;);\n\t\/\/check left -&gt; right\n\trequire((lon_x100000 &gt;= geofence.left_lon_x100000 \n\t\t&amp;amp;&amp;amp; lon_x100000 &amp;lt;= geofence.right_lon_x100000), &quot;Wrong location&quot;); \n\t\/\/check down -&gt; up\n\trequire((lat_x100000 &gt;= geofence.down_lat_x100000 \n\t\t&amp;amp;&amp;amp; lat_x100000 &amp;lt;= geofence.up_lat_x100000), &quot;Wrong location&quot;);\n \n\tlocation_verified = true;\n\temit LocationVerifiedEvent();\t\n}\n<\/pre><\/div>\n\n\n<p>Tylko i <strong>wy\u0142\u0105cznie w\u0142a\u015bciciel kontraktu mo\u017ce zweryfikowa\u0107 po\u0142o\u017cenie<\/strong>, a domy\u015blnie w\u0142a\u015bcicielem jest adres, z kt\u00f3rego zosta\u0142 utworzony kontrakt. W naszym przypadku jest to o\u015bwiadczynowe pude\u0142ko. S\u0142u\u017cy do tego modyfikator isOwner, kt\u00f3ry wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nmodifier isOwner() {\n\trequire(msg.sender == owner, &quot;Caller is not owner&quot;);\n\t_;\n}\n<\/pre><\/div>\n\n\n<p>Czyli nikt inny, poza naszym urz\u0105dzeniem, nie mo\u017ce tego zrobi\u0107. Ka\u017cda transakcja (a wywo\u0142anie funkcji jest transakcj\u0105 z odpowiednimi argumentami w sieci Ethereum) wysy\u0142ana do sieci jest podpisana w\u0142asnym kluczem prywatnym nale\u017c\u0105cym do konkretnego adresu. Dzi\u0119ki temu mamy zapewnione uwierzytelnienie naszego pude\u0142eczka i <strong>jeste\u015bmy pewni, \u017ce nikt inny nie o\u015bwiadczy si\u0119 M. w innym miejscu.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Koszt operacji<\/strong><\/h3>\n\n\n\n<p>Ka\u017cda operacja wykonywana w EVM kosztuje prawdziwe Ether (jej u\u0142amkowe cz\u0119\u015bci, najmniejszym nomina\u0142em jest 1 wei). Do wykonania ka\u017cdej operacji potrzebna jest okre\u015blona ilo\u015b\u0107 gazu (Gas), za kt\u00f3ry trzeba zap\u0142aci\u0107 podczas wys\u0142ania transakcji. Cena gazu waha si\u0119 i jest zale\u017cna od obci\u0105\u017cenia sieci, czyli wp\u0142yw ma na ni\u0105 liczba operacji zleconych do realizacji w jednym czasie (globalnie, w ca\u0142ej sieci).<\/p>\n\n\n\n<p>Dzi\u0119ki s\u0142owu kluczowemu \u201erequire\u201d, je\u017celi warunek nie zostanie spe\u0142niony, pieni\u0105dze potrzebne do dalszego wykonania transakcji s\u0105 zwracane i tylko gaz potrzebny do realizacji wszystkich operacji przed wywo\u0142aniem \u201erequire\u201d zostaje zu\u017cyty. W przypadku funkcji payable, wysy\u0142ane pieni\u0105dze r\u00f3wnie\u017c zostaj\u0105 zwracane.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wyemitowanie eventu<\/strong><\/h3>\n\n\n\n<p>Wracaj\u0105c do opisywanej funkcji, je\u017celi lokalizacja zosta\u0142a prawid\u0142owo zweryfikowana, na ko\u0144cu zostaje wyemitowany event, kt\u00f3ry zapisywany jest w bloku zawieraj\u0105cym nowe transakcje i dodawany jest do \u0142a\u0144cucha. Ka\u017cdy w\u0119ze\u0142 komunikuj\u0105cy si\u0119 z sieci\u0105 Ethereum mo\u017ce nas\u0142uchiwa\u0107 i sprawdza\u0107, czy w nowo utworzonym bloku, zawieraj\u0105cym t\u0105 transakcj\u0119, jest informacja o wyst\u0105pieniu danego eventu.<\/p>\n\n\n\n<p>W ten spos\u00f3b urz\u0105dzenie dostaje informacj\u0119, \u017ce geofence zosta\u0142 naruszony. W naszym przypadku mamy pewne uproszczenia i tylko jedno urz\u0105dzenie bierze udzia\u0142 w komunikacji. Pami\u0119tajmy jednak, \u017ce zale\u017cnie od sytuacji <strong>inne urz\u0105dzenie mo\u017ce zweryfikowa\u0107 swoj\u0105 lokalizacj\u0119<\/strong>, a inne mo\u017ce dosta\u0107 alert o naruszeniu. Tak oto inteligentny kontrakt powoduje dzia\u0142anie w \u015bwiecie IoT.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Ustawienia czasu i akceptacja o\u015bwiadczyn<\/strong><\/h3>\n\n\n\n<p>Dodajmy jakie\u015b elementy czasowe do tego projektu:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nfunction setProposalExpectedTime(uint32 timestamp) public isOwner { \n\trequire(location_verified == true, &quot;Location has not been verified yet&quot;);\n\trequire(timestamp &gt;= block.timestamp, &quot;Time is in the past&quot;);\n\tproposal_expected_time = timestamp;\n\temit ProposalExpectedTimeEvent(proposal_expected_time);\n}\n<\/pre><\/div>\n\n\n<p>Przygotowana funkcja pos\u0142u\u017cy nam do ustawienia oczekiwanego czasu o\u015bwiadczyn.<\/p>\n\n\n\n<p>Zmienna przechowuj\u0105ca ten czas jest zadeklarowana w kontrakcie, a nazywana jest \u201eState Variable\u201d. W przeciwie\u0144stwie do zmiennych lokalnych (Local Variable), przechowywana jest ona na sta\u0142e w blockchainie, a ka\u017cdy taki bajt danych kosztuje pewn\u0105 ilo\u015b\u0107 gazu i wp\u0142ywa na ca\u0142kowity koszt kontraktu. O ca\u0142kowitych kosztach, wahaniach cen gazu itd. napisz\u0119 troch\u0119 wi\u0119cej w dalszej cz\u0119\u015bci artyku\u0142u.<\/p>\n\n\n\n<p>Zosta\u0142a nam jeszcze funkcja potrzebna do zaakceptowania o\u015bwiadczyn. No dobrze, niech b\u0119dzie \u2013 do odrzucenia r\u00f3wnie\u017c\u2026<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nfunction sayYes(int32 lat_x100000, int32 lon_x100000, bytes32 her_proof_hash, \n\t\tbytes32 his_proof_hash) external payable isOwner { \n\trequire((block.timestamp &gt;= proposal_expected_time - 600) \n\t\t&amp;amp;&amp;amp; (block.timestamp &amp;lt;= proposal_expected_time + 600), &quot;Time is up&#039;&quot;);\n\trequire((saidNo == false) &amp;amp;&amp;amp; (saidYes == false), &quot;Proposal has been already finished &quot;);\n\trequire(msg.value &gt;= 0.0035 ether, &quot;Deposit is too small&quot;);\n\tproposal_her_proof_hash = her_proof_hash;\n\tproposal_his_proof_hash = his_proof_hash;\n\tsaidYes = true;\n\tproposal_location_lat_x100000 = lat_x100000;\n\tproposal_location_lon_x100000 = lon_x100000;\n\temit ProposalEvent(saidYes, saidNo);\n}\n \nfunction sayNo() external isOwner { \n\trequire((block.timestamp &gt;= proposal_expected_time - 600) \n\t\t&amp;amp;&amp;amp; (block.timestamp &amp;lt;= proposal_expected_time + 600), &quot;Time is up&#039;&quot;);\n\trequire((saidNo == false) &amp;amp;&amp;amp; (saidYes == false), &quot;Proposal has been already finished &quot;);\n\tsaidNo = true;\n\temit ProposalEvent(saidYes, saidNo);\n}\n<\/pre><\/div>\n\n\n<p>Je\u017celi w okre\u015blonym czasie nie nast\u0105pi\u0105 o\u015bwiadczyny i odpowied\u017a nie zostanie wys\u0142ana, to <strong>kontrakt ten mo\u017cna uzna\u0107 za niewa\u017cny<\/strong>, mimo \u017ce nadal zostanie w blockchainie (nie ma mo\u017cliwo\u015bci jego usuni\u0119cia) i ju\u017c nigdy nie b\u0119dzie mo\u017cna wys\u0142a\u0107 informacji z decyzj\u0105. Tak samo \u2013 <strong>raz podj\u0119tej decyzji nie mo\u017cna zmieni\u0107.<\/strong> Po akceptacji lub odrzuceniu o\u015bwiadczyn, kontrakt zosta\u0142 wykonany.<\/p>\n\n\n\n<p>Dodatkowo, funkcja sayYes zosta\u0142a zadeklarowana jako \u201eexternal payable\u201d. S\u0142owo kluczowe \u201eexternal\u201d oznacza, \u017ce funkcja mo\u017ce by\u0107 wywo\u0142ana tylko przez zewn\u0119trzny kontrakt lub konto. S\u0142owo \u201epayable\u201d daje mo\u017cliwo\u015b\u0107 przesy\u0142ania pieni\u0119dzy do kontraktu, tworz\u0105c pewien depozyt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Przypadek 2&nbsp;000 kolumbijskich pesos<\/strong><\/h3>\n\n\n\n<p>Ogl\u0105dali\u015bcie kiedy\u015b film \u201eKiler-\u00f3w 2-\u00f3ch\u201d? M\u0142odsi czytelnicy mog\u0105 tego filmu nie pami\u0119ta\u0107, ale tam by\u0142 taki <a href=\"https:\/\/www.youtube.com\/watch?v=jpr3TuAbfxQ\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >motyw z dwoma po\u0142\u00f3wkami banknotu 2 000 kolumbijskich pesos<\/a>. Maj\u0105c dwie po\u0142\u00f3wki banknotu, niejaki Waldek zamienia je na kontener dolar\u00f3w.<\/p>\n\n\n\n<p>Dodajmy takie 2 000 kolumbijskich pesos i Waldka do blockchainu, a dok\u0142adniej do naszego kontraktu. Naszym kontenerem dolar\u00f3w jest depozyt, kt\u00f3ry przes\u0142ali\u015bmy do kontraktu. Jako \u017ce pier\u015bcionek i sam smart kontrakt w sieci g\u0142\u00f3wnej Ethereum troch\u0119 kosztuj\u0105, to my\u015bl\u0119, \u017ce symboliczne 0,0035 ethera b\u0119dzie tym razem wystarczaj\u0105ce (kto wie, mo\u017ce kiedy\u015b b\u0119dzie warte tyle, co p\u00f3\u0142 tony dolar\u00f3w).<\/p>\n\n\n\n<p>Za jedn\u0105 po\u0142\u00f3wk\u0119 2 000 kolumbijskich pesos pos\u0142u\u017cy nam podw\u00f3jny hash (funkcja skr\u00f3tu) SHA-3 wykorzystuj\u0105cy algorytm Keccak-256 zdj\u0119cia wykonanego przez urz\u0105dzenie podczas o\u015bwiadczyn wysy\u0142any na maila do M. Druga po\u0142\u00f3wka to troch\u0119 inne zdj\u0119cia z tego momentu wys\u0142ane do mnie. Skr\u00f3ty te przes\u0142ane s\u0105 jako argumenty funkcji sayYes i zapisywane na sta\u0142e w \u0142a\u0144cuchu blok\u00f3w.<\/p>\n\n\n\n<p>No to jeszcze zosta\u0142 nam Waldek:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nfunction getProposalFund(bytes memory her_proof, bytes memory his_proof) external payable {\n\trequire(saidYes == true, &quot;Yes is needed&quot;);\n\trequire(msg.value &gt;= 0.00035 ether, &quot;Deposit is too small&quot;);\n\tbytes32 her_hash = keccak256(her_proof);\n\tbytes32 his_hash = keccak256(his_proof);\n\tif((her_hash == proposal_her_proof_hash) &amp;amp;&amp;amp; (his_hash == proposal_his_proof_hash)) \n\t{\n\t\tuint256 amount = address(this).balance;\n\t\t(bool success,) = msg.sender.call{value:amount}(&quot;&quot;);\n\t\trequire(success, &quot;Withdrawal error&quot;);\n\t}\n}\n<\/pre><\/div>\n\n\n<p>Wybrany zosta\u0142 wspomniany <strong>algorytm Keccak-256<\/strong> ze wzgl\u0119du na to, \u017ce jest to operacja kryptograficzna dost\u0119pna w EVM. Je\u017celi, wywo\u0142uj\u0105c \u201ewaldkow\u0105\u201d funkcj\u0119 jako argumenty, poda si\u0119 dwa zdj\u0119cia (a dok\u0142adniej pojedynczy hash zdj\u0119cia), to po prawid\u0142owej weryfikacji ich autentyczno\u015bci nasz \u201ekontener dolar\u00f3w\u201d wydawany jest wywo\u0142uj\u0105cemu funkcj\u0119. Czyli musimy si\u0119 z M. nadal dogadywa\u0107, je\u017celi chcieliby\u015bmy <strong>wyp\u0142aci\u0107 pieni\u0105dze z naszego \u201efunduszu o\u015bwiadczynowego\u201d.<\/strong> <\/p>\n\n\n\n<p>Dlaczego podw\u00f3jny hash? Ze wzgl\u0119du na ilo\u015b\u0107 danych wysy\u0142anych do \u0142a\u0144cucha blok\u00f3w (du\u017cy koszt operacji) oraz ze wzgl\u0119du na publiczn\u0105 widoczno\u015b\u0107 transakcji i ich parametr\u00f3w. Pami\u0119tajmy, \u017ce wszystkie dane wysy\u0142ane do \u0142a\u0144cucha nie s\u0105 szyfrowane i s\u0105 dost\u0119pne dla ka\u017cdego (jedna z cech blockchainu: <strong>transparentno\u015b\u0107 transakcji<\/strong>). Dlatego przy pr\u00f3bie odzyskania pieni\u0119dzy nie s\u0105 wysy\u0142ane nasze prywatne zdj\u0119cia, a tylko ich skr\u00f3t.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Tab.-1.png\"><img decoding=\"async\" width=\"1024\" height=\"616\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Tab.-1-1024x616.png\" alt=\"Hashowanie danych\" class=\"wp-image-18967\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Tab.-1-1024x616.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Tab.-1-300x180.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Tab.-1-768x462.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Tab.-1.png 1046w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Tab. 1 Hashowanie danych<\/figcaption><\/figure><\/div>\n\n\n\n<p>Dodatkowo, aby ograniczy\u0107 pr\u00f3by hackowania kontraktu metod\u0105 brute force, ka\u017cde wywo\u0142anie funkcji zwi\u0119ksza depozyt kontraktu o 0,00035 eth, zabieraj\u0105c je z konta atakuj\u0105cego. Ca\u0142y depozyt jest zwracany w ramach jednego poprawnego wywo\u0142ana funkcji getProposalFund, poniewa\u017c, tak jak wcze\u015bniej zaznaczy\u0142em, dane wysy\u0142ane jako argument funkcji s\u0105 transparentne i ka\u017cda operacja jest zapisywane w \u0142a\u0144cuchu blok\u00f3w. Znaczy to, \u017ce po jednorazowym, poprawnym wywo\u0142aniu funkcji ka\u017cda osoba w \u0142atwy spos\u00f3b dostaje dost\u0119p do danych potrzebnych do zwrotu depozytu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Pod\u0142\u0105czenie o\u015bwiadczynowej skrzynki do sieci Etherum<\/strong><\/h2>\n\n\n\n<p>Dobrze, to teraz zadania dla naszej skrzynki:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>kontrola lokalizacji o\u015bwiadczynowej i wysy\u0142anie jej do weryfikacji,<\/li><li>\u015bwiecenie i brz\u0119czenie,<\/li><li>otwarcie zamka w momencie o\u015bwiadczyn,<\/li><li>nagrywanie i wykonywanie zdj\u0119\u0107 z momentu o\u015bwiadczyn,<\/li><li>interakcja ze smart kontraktem w g\u0142\u00f3wnej sieci Ethereum.<\/li><\/ul>\n\n\n\n<p>Aby komunikowa\u0107 si\u0119 z blockchainem, wykorzysta\u0142em <strong>pythonow\u0105 bibliotek\u0119 Web3 i serwis Infura<\/strong>, do kt\u00f3rej pod\u0142\u0105czy\u0142em si\u0119 za pomoc\u0105 interfejsu https (wykorzystuj\u0105c protok\u00f3\u0142 JSON-RPC). Infura jest jednocze\u015bnie w\u0119z\u0142em w sieci&nbsp; Ethereum i dzi\u0119ki temu mamy mo\u017cliwo\u015b\u0107 wykonywania operacji w blockchainie.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nw3 = Web3(Web3.HTTPProvider(&quot;https:\/\/mainnet.infura.io\/v3\/&lt;API-KEY&gt;&quot;))\n<\/pre><\/div>\n\n\n<p>Transakcje podpisywane s\u0105 prywatnym kluczem, lokalnie na urz\u0105dzeniu. Nie przechowujemy \u017cadnych poufnych danych w serwisie Infura. Biblioteka Web3 daje nam dost\u0119p do funkcji podpisuj\u0105cych, interfejsu do smart kontrakt\u00f3w i danych w blockchainie.<\/p>\n\n\n\n<p>Przejd\u017amy do pod\u0142\u0105czenia do kontraktu. Potrzebny nam b\u0119dzie interfejs z funkcjami i transakcjami dost\u0119pnymi w utworzonym przez nas wcze\u015bniej kontrakcie. S\u0142u\u017cy do tego <strong>Application Binary Interface (ABI)<\/strong>. Plik abi.json mo\u017cna wyeksportowa\u0107 bezpo\u015brednio w \u015brodowisku Remix po kompilacji. Inicjalizacja obiektu web3 wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\ncontract = w3.eth.contract(address=SMART_PROPOSAL_CONTRACT_ADDRESS, abi=ABI)\n<\/pre><\/div>\n\n\n<p>Teraz tworzymy transakcje. Wsp\u00f3lna funkcja, z kt\u00f3rej b\u0119dziemy korzysta\u0107 do wys\u0142ania transakcji, mo\u017ce wygl\u0105da\u0107 np. tak:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\ndef SendSmartContractTransaction(transaction):\n    retransmission = 5\n        while retransmission &gt; 0:\n          try:\n            transaction.update({&#039;maxFeePerGas&#039;: \\\n            w3.toWei(SMART_PROPOSAL_CONTRACT_TRANSACTION_GAS_FEE_LIMIT, &#039;gwei&#039;)})\n            transaction.update({&#039;maxPriorityFeePerGas&#039;: \\ \n            w3.toWei(SMART_PROPOSAL_CONTRACT_TRANSACTION_PRIORITY_FEE_LIMIT, &#039;gwei&#039;)})\n            transaction.update({&#039;nonce&#039; : w3.eth.get_transaction_count(SMART_PROPOSAL_BOX_ADDRESS)})\n            signed_transaction = w3.eth.account.sign_transaction(transaction, PRIVATE_KEY)\n            transaction_hash = w3.eth.send_raw_transaction(signed_transaction.rawTransaction)\n            print(f&quot;Transaction hash: {encode_hex(transaction_hash)}&quot;)\n            retransmission = 0\n          except Exception as e:\n            retransmission = retransmission - 1\n<\/pre><\/div>\n\n\n<p>Do ka\u017cdej transakcji okre\u015blamy limit gazu oraz maksymalna cen\u0119 gazu, jak\u0105 zgadzamy si\u0119 zap\u0142aci\u0107. Im ta cena jest wy\u017csza, tym szybciej mo\u017ce zosta\u0107 zweryfikowana przez w\u0119z\u0142y w sieci. Stawka zale\u017cy od aktualnego obci\u0105\u017cenia sieci. <a href=\"https:\/\/etherscan.io\/gastracker\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Aktualn\u0105 cen\u0119 gazu mo\u017cna \u015bledzi\u0107.<\/a> Je\u017celi wpiszemy <strong>za ma\u0142\u0105 warto\u015b\u0107<\/strong>, mo\u017ce si\u0119 okaza\u0107, \u017ce przez bardzo d\u0142ugi czas transakcja ta nie zostanie wykonana.<\/p>\n\n\n\n<p>Z drugiej strony musimy nas\u0142uchiwa\u0107 event\u00f3w wyemitowanych w smart kontrakcie:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nevent_filters.append(contract.events.LocationVerifiedEvent.createFilter(fromBlock=&#039;latest&#039;))\nevent_filters.append(contract.events.ProposalEvent.createFilter(fromBlock=&#039;latest&#039;))\nevent_filters.append(contract.events.ProposalExpectedTimeEvent.createFilter(fromBlock=&#039;latest&#039;))\n<\/pre><\/div>\n\n\n<p>Wa\u017cne jest tutaj okre\u015blenie, z jakiego bloku chcemy otrzyma\u0107 tak\u0105 informacj\u0119. My chcemy by\u0107 pewni, \u017ce transakcja zosta\u0142a poprawnie umieszczona w nowym bloku \u0142a\u0144cuchu blok\u00f3w, a blok ten zosta\u0142 w pe\u0142ni zweryfikowany przez sie\u0107. Na ten moment przy podaniu \u015bredniej ceny gazu, czas oczekiwania na weryfikacj\u0119 transakcji wynosi \u015brednio ok. 3 minuty. <strong>Jest to stosunkowo d\u0142ugi czas<\/strong> i wynika z pewnych ogranicze\u0144 sieci.<\/p>\n\n\n\n<p>Aktualnie sie\u0107 Ethereum jest w stanie obs\u0142u\u017cy\u0107 30 transakcji na sekund\u0119. Platforma jest w trakcie dodawania usprawnie\u0144, kt\u00f3re sk\u0142adaj\u0105 si\u0119 na ca\u0142o\u015b\u0107 projektu Etherum 2.0, po kt\u00f3rym szybko\u015b\u0107 wykonywania transakcji ma si\u0119 znacz\u0105co zwi\u0119kszy\u0107, a sie\u0107 b\u0119dzie w stanie obs\u0142u\u017cy\u0107 do 100 000 transakcji na sekund\u0119. Na ten moment zmieniony zosta\u0142 spos\u00f3b ustalania konsensusu za pomoc\u0105 PoW (proof of work) na PoS (proof of stake). <a href=\"https:\/\/ethereum.org\/en\/developers\/docs\/consensus-mechanisms\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Algorytmy ustalania konsensusu<\/a> to temat na osobny artyku\u0142, dlatego zainteresowanych tematem odsy\u0142am do jednego z wielu dost\u0119pnych materia\u0142\u00f3w. <\/p>\n\n\n\n<p>Innymi s\u0142owy \u2013 niepotrzebne s\u0105 ju\u017c ogromne moce obliczeniowe i wynikaj\u0105ce z tego niepotrzebne straty energii elektrycznej. <strong>Pierwsze\u0144stwo w tworzeniu nowego bloku maj\u0105 w\u0119z\u0142y, kt\u00f3re posiadaj\u0105 okre\u015blon\u0105 (i to du\u017c\u0105) kwot\u0119 w swoim portfelu.<\/strong> W tej chwili jest to 32 ETH.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Umieszczenie kontraktu w g\u0142\u00f3wnej sieci Ethereum<\/strong><\/h2>\n\n\n\n<p>Aby umie\u015bci\u0107 kontrakt w sieci Ethereum, trzeba wyposa\u017cy\u0107 konto w niema\u0142\u0105 liczb\u0119 wei. Po kompilacji ostatecznej wersji kontraktu kod binarny umieszczamy w blockchainie. Jak ka\u017cde przechowywanie danych w \u0142a\u0144cuchu blok\u00f3w, nie odbywa si\u0119 to za darmo. Jednak\u017ce w trakcie rozwoju kontraktu, za pomoc\u0105 narz\u0119dzia Remix, mo\u017cemy oczywi\u015bcie korzysta\u0107 z dost\u0119pnego, testowego \u015brodowiska w przegl\u0105darce (Remix VM) lub testowych sieci Ethereum, w kt\u00f3rych nie wydajmy realnych pieni\u0119dzy. Pod\u0142\u0105czaj\u0105c nasze urz\u0105dzenie do tej samej sieci testowej, mo\u017cemy przetestowa\u0107 jego dzia\u0142anie.<\/p>\n\n\n\n<p>Adres opisywanego kontraktu w Ethereum Mainnet to 0xe4e7Ed4f714A8cbDA6Da05910484CFA796f992bb. Wpisuj\u0105c ten <a href=\"https:\/\/etherscan.io\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >adres w eksplorator<\/a>, mo\u017cemy przejrze\u0107 wszystkie transakcje wys\u0142ane do tego kontraktu wraz z transakcj\u0105 utworzenia kontraktu.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-3-3.png\"><img decoding=\"async\" width=\"1024\" height=\"549\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-3-3-1024x549.png\" alt=\"Transakcja utworzenia kontraktu\" class=\"wp-image-18971\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-3-3-1024x549.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-3-3-300x161.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-3-3-768x412.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-3-3.png 1364w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Ryc. 3 Transakcja utworzenia kontraktu<\/figcaption><\/figure><\/div>\n\n\n\n<p>Jak widzimy, kontrakt zosta\u0142 utworzony 8 maja, kiedy to cena gazu wynosi\u0142a 20 Gwei, p\u0142ac\u0105c 0,03226868 Ether, co przek\u0142ada\u0142o si\u0119 na 81,29 dolar\u00f3w po kursie z danego dnia. Jest to stosunkowo wysoka cena dla niezbyt skomplikowanego kontraktu. Najlepiej <strong>planowa\u0107 tworzenie kontraktu na dni wolne od pracy<\/strong>, gdzie spodziewane jest mniejsze obci\u0105\u017cenie sieci.<\/p>\n\n\n\n<p>Warto zauwa\u017cy\u0107, \u017ce je\u017celi w trakcie tworzenie kontraktu \u017ale ustawimy maksymaln\u0105 cen\u0119 gazu i trafimy na chwilowo zawy\u017con\u0105 cen\u0119, to mo\u017cemy przez przypadek <strong>wyda\u0107 ogromne pieni\u0105dze<\/strong>. Tak, jak to mia\u0142o miejsce 1 maja, gdy \u015brednia cena gazu wynosi\u0142a ok. 475 Gwei. Koszt utworzenia kontraktu w tym dniu m\u00f3g\u0142by mnie wynie\u015b\u0107 prawie 2 000 dolar\u00f3w, a je\u017celi bra\u0107 pod uwag\u0119 maksymalny koszt w tym dniu, to op\u0142ata dobi\u0142aby do jakiej\u015b astronomicznej kwoty.<\/p>\n\n\n\n<p>Tak jak kosmiczny wydaje si\u0119 pow\u00f3d tej zawy\u017conej ceny, czyli obci\u0105\u017cenie sieci przez ogromne zainteresowanie <a href=\"https:\/\/decrypt.co\/99156\/yuga-labs-sees-561-million-in-otherside-ethereum-nft-sales-within-24-hours\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >wypuszczeniem NFT zwanych \u201cOtherdeed\u201d do gry Otherside w metaverse przez firm\u0119 Bored Ape Yacht Club<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc-4.png\"><img decoding=\"async\" width=\"1024\" height=\"440\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc-4-1024x440.png\" alt=\"Historia \u015bredniej ceny gazu Ethereum\" class=\"wp-image-18974\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc-4-1024x440.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc-4-300x129.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc-4-768x330.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc-4-1536x660.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc-4.png 1700w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Ryc. 4 Historia \u015bredniej ceny gazu Ethereum<\/figcaption><\/figure><\/div>\n\n\n\n<p>Kod \u017ar\u00f3d\u0142owy kontraktu zosta\u0142 wys\u0142any i poprawnie zweryfikowany przez etherscan.io<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-5.png\"><img decoding=\"async\" width=\"1024\" height=\"543\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-5-1024x543.png\" alt=\"Kod \u017arod\u0142owy kontraktu w etherscan\" class=\"wp-image-18976\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-5-1024x543.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-5-300x159.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-5-768x407.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-5.png 1396w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Ryc. 5 Kod \u017arod\u0142owy kontraktu w etherscan<\/figcaption><\/figure><\/div>\n\n\n\n<p>Dzi\u0119ki zapisaniu kodu \u017ar\u00f3d\u0142owego w etherscan.io, \u0142atwiejszy jest p\u00f3\u017aniejszy przegl\u0105d przeprowadzonych transakcji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Relacja z o\u015bwiadczyn<\/strong><\/h2>\n\n\n\n<p>Podsumowuj\u0105c, proces o\u015bwiadczyn zosta\u0142 zaplanowany nast\u0119puj\u0105co:<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\"><li>Jedziemy do miejsca, gdzie maj\u0105 nast\u0105pi\u0107 o\u015bwiadczyny.<\/li><li>Po wej\u015bciu w okre\u015blony obszar geofence wysy\u0142ana jest transakcja z aktualn\u0105 pozycj\u0105.<\/li><li>Czekamy na potwierdzenie transakcji i wyst\u0105pienie eventu.<\/li><li>Skrzynka losuje czas, kiedy maj\u0105 nast\u0105pi\u0107 o\u015bwiadczyny i wysy\u0142a ten czas do kontraktu.<\/li><li>Teraz nast\u0119puje najbardziej ekscytuj\u0105cy moment: pude\u0142ko si\u0119 otwiera, kamera zaczyna nagrywa\u0107 to, co si\u0119 dzieje&#8230;<br>\u2013 Czekamy na decyzj\u0119\u2026<br>\u2013 Czekamy.<br>.<br>.<br>\u2013 Ej, co tak d\u0142ugo? My\u015bla\u0142em, \u017ce p\u00f3jdzie szybciej.<\/li><li>Jest! Ufff, przycisk zosta\u0142 wci\u015bni\u0119ty.<\/li><li>Wykonywane s\u0105 zdj\u0119cia \u2013 jedno zdj\u0119cie wysy\u0142ane jest na maila do jednej osoby, drugie do drugiej.<\/li><li>Tworzymy skr\u00f3ty tych zdj\u0119\u0107, kt\u00f3re wysy\u0142ane s\u0105 do smart kontraktu razem z depozytem, wykorzystuj\u0105c transakcj\u0119 akceptacji o\u015bwiadczyn.<\/li><\/ol>\n\n\n\n<p>Na poni\u017cszej grafice przedstawi\u0142em diagram sekwencji z ca\u0142ego \u201eprzedsi\u0119wzi\u0119cia\u201d.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-6-1.png\"><img decoding=\"async\" width=\"530\" height=\"1024\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-6-1-530x1024.png\" alt=\"Procedura o\u015bwiadczyn \u2013 diagram sekwencji\" class=\"wp-image-18980\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-6-1-530x1024.png 530w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-6-1-155x300.png 155w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-6-1-768x1482.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-6-1-796x1536.png 796w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-6-1-1061x2048.png 1061w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-6-1.png 1133w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/a><figcaption>Ryc. 6 Procedura o\u015bwiadczyn \u2013 diagram sekwencji<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>O\u015bwiadczyny w praktyce<\/strong><\/h2>\n\n\n\n<p>W pewien majowy dzie\u0144 wr\u0119czy\u0142em M. tajemnicze pude\u0142ko, informuj\u0105c, \u017ce od tej pory ma je mie\u0107 zawsze przy sobie \u2013 rano i wieczorem, w pracy i na kolacji, bo nie wie, gdzie i w jakim momencie skrzynka si\u0119 otworzy. Doda\u0142em, \u017ce je\u017celi przegapi ten moment, to pude\u0142ko zamknie si\u0119 i ju\u017c nigdy nie uchyli wieka ponownie, a tym samym straci ten prezent na zawsze\u2026<\/p>\n\n\n\n<p>Jako \u017ce zbli\u017ca\u0142y si\u0119 jej urodziny, M. stwierdzi\u0142a, \u017ce wie, kiedy pude\u0142ko si\u0119 otworzy (ha! Dobrze, \u017ce projekt jak zawsze \u201etroch\u0119\u201d mi si\u0119 op\u00f3\u017ani\u0142, przynajmniej jest jaka\u015b wym\u00f3wka). Mija\u0142y dni, pude\u0142ko si\u0119 nie otwiera\u0142o. M. niecierpliwie zadawa\u0142a pytania: \u201eNo kiedy si\u0119 otworzy?!\u201d. Spojrza\u0142em na prognoz\u0119 pogody \u2013 w weekend b\u0119dzie \u0142adnie, mo\u017cemy w sobot\u0119 jecha\u0107 nad morze. Ehh\u2026 W sobot\u0119 mia\u0142o si\u0119 odby\u0107 rodzinne spotkanie u rodzic\u00f3w\u2026 Trudno, pojedziemy w niedziel\u0119.<\/p>\n\n\n\n<p>W sobot\u0119 siedzieli\u015bmy przy stole, a M. pude\u0142ko mia\u0142a przy sobie. Nagle m\u0105\u017c siostry (tzw. szwagier) powiedzia\u0142: \u201eM. s\u0142uchaj, a tam (w tym pude\u0142ku) to pewnie pier\u015bcionek zar\u0119czynowy\u201d i si\u0119 za\u015bmia\u0142. Ha ha \u2013 moja mama \u015bmia\u0142a si\u0119 jeszcze g\u0142o\u015bniej. Pewnie \u2013 my\u015bl\u0119 sobie \u2013 karuzela \u015bmiechu\u2026 Uda\u0142o si\u0119 jako\u015b szybko ten temat uci\u0105\u0107, obracaj\u0105c wszystko w \u017cart.<\/p>\n\n\n\n<p>W niedziel\u0119 rano zapakowali\u015bmy psa i ruszyli\u015bmy na pla\u017c\u0119. Zobaczy\u0142em molo, wi\u0119c chyba byli\u015bmy we w\u0142a\u015bciwym miejscu. Dlaczego wi\u0119c nie dosta\u0142em informacji o naruszeniu geofence? Stresik si\u0119 spot\u0119gowa\u0142, co\u015b jak zwykle nie dzia\u0142a\u0142o\u2026 Poszli\u015bmy troch\u0119 dalej. Jest alert! Usiedli\u015bmy na piasku i czeka\u0142em na otwarcie skrzynki. Po jakim\u015b czasie us\u0142yszeli\u015bmy odg\u0142os brz\u0119czyka. Podpowiadam wi\u0119c, \u017ce chyba jaki\u015b d\u017awi\u0119k z torby si\u0119 wydobywa. M. pomy\u015bla\u0142a, \u017ce to jaka\u015b ci\u0119\u017car\u00f3wka jedzie na wstecznym. Faktycznie, d\u017awi\u0119k podobny, ale&#8230; ci\u0119\u017car\u00f3wka na pla\u017cy? No dobra \u2013 jakie\u015b remonty by\u0142y widoczne, wi\u0119c jest to jakie\u015b usprawiedliwienie. M. bierze pude\u0142ko do r\u0119ki, otwiera i\u2026 dalej zobaczcie sami:<\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Smart Marriage Proposal\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/ClVBHRSMgwU?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Wracaj\u0105c do eksploratora etherscan, mo\u017cemy przejrze\u0107 wszystkie transakcje wys\u0142ane do smart kontraktu. I tak, <strong>transakcja akceptacji o\u015bwiadczyn wygl\u0105da nast\u0119puj\u0105co<\/strong>:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-7-1.png\"><img decoding=\"async\" width=\"1024\" height=\"665\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-7-1-1024x665.png\" alt=\"Transakcja akceptacji o\u015bwiadczyn w etherscan\" class=\"wp-image-18983\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-7-1-1024x665.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-7-1-300x195.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-7-1-768x499.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-7-1.png 1390w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Ryc. 7 Transakcja akceptacji o\u015bwiadczyn w etherscan<\/figcaption><\/figure><\/div>\n\n\n\n<p>Dane wej\u015bciowe transakcji przedstawione s\u0105 w postaci binarnej. Po zdekodowaniu wygl\u0105daj\u0105 tak:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-8-1.png\"><img decoding=\"async\" width=\"1024\" height=\"165\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-8-1-1024x165.png\" alt=\"Dane wej\u015bciowe transakcji\" class=\"wp-image-18985\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-8-1-1024x165.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-8-1-300x48.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-8-1-768x124.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-8-1.png 1399w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Ryc. 8 Dane wej\u015bciowe transakcji<\/figcaption><\/figure><\/div>\n\n\n\n<p>Jeszcze przedstawienie zapisanych wsp\u00f3\u0142rz\u0119dnych na mapie:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-9-1.png\"><img decoding=\"async\" width=\"1024\" height=\"503\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-9-1-1024x503.png\" alt=\"Lokalizacja wys\u0142ana do kontraktu\" class=\"wp-image-18987\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-9-1-1024x503.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-9-1-300x147.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-9-1-768x377.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-9-1-1536x755.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-9-1.png 1766w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Ryc. 9 Lokalizacja wys\u0142ana do kontraktu<\/figcaption><\/figure><\/div>\n\n\n\n<p>Zapisane skr\u00f3ty zdj\u0119\u0107 czekaj\u0105 na wykorzystanie przez funkcj\u0119 <em>getProposalFund<\/em> w celu pobrania depozytu (balans kontraktu wynosi 0,0045 ether). Wspomniany wcze\u015bniej Waldek z \u201eKiler-\u00f3w 2-\u00f3ch\u201d niech jeszcze na nas poczeka \ud83d\ude09<\/p>\n\n\n\n<p>A Wy znacie jakie\u015b ciekawe projekty wykorzystuj\u0105ce technologi\u0119 blockchain? Albo mo\u017ce jaki\u015b nietypowy spos\u00f3b o\u015bwiadczyn? Piszcie w komentarzach, je\u015bli co\u015b macie.<\/p>\n\n\n\n<p>Dla zainteresowanych zostawiam <a href=\"https:\/\/github.com\/lkasperowicz\/Smart-Marriage-Proposal\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >GitHub projektu<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0179r\u00f3d\u0142a<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/helion.pl\/autorzy\/imran-bashir\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Blockchain. Zaawansowane zastosowania \u0142a\u0144cucha blok\u00f3w, Imran Bashir<\/a><\/li><li><a href=\"https:\/\/etherscan.io\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Etherscan<\/a><\/li><li><a href=\"https:\/\/ethereum.org\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Ethereum<\/a><\/li><li><a href=\"https:\/\/www.udemy.com\/course\/master-ethereum-and-solidity-programming-with-real-world-apps\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Master Ethereum and Solidity programming with real world apps<\/a><\/li><\/ul>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;18956&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;19&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 19)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Smart contract i IoT: o\u015bwiadczyny w blockchainie&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 19)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Technologia blockchain powsta\u0142a w kontek\u015bcie walut cyfrowych i przeprowadzania bezpiecznych transakcji z ich wykorzystaniem. By\u0142o to pierwsze i jest to &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/smart-contract-i-iot-oswiadczyny-w-blockchainie\/\">Continued<\/a><\/p>\n","protected":false},"author":465,"featured_media":19748,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":13,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[1608,1148,435],"class_list":["post-18956","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-smart-contract","tag-blockchain","tag-iot"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Smart-contract-i-IoT-oswiadczyny-w-blockchainie.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/18956"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/465"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=18956"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/18956\/revisions"}],"predecessor-version":[{"id":19518,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/18956\/revisions\/19518"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/19748"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=18956"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=18956"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=18956"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}