Изграждане на разпределено и устойчиво бъдеще… Ето Pigpen, IPFS и Ethereum

Bulchain/Securitysite.com

Създадохме централизиран цифров свят, който зависи от услуги, работещи на сървъри. Тези сървъри често централизират предоставянето на услугата, както и инфраструктурата за данни. В такъв случай повреда на услугата или на хранилището за данни може да застраши предоставянето на услугата. Наред с това защитните стени могат да попречат и да спрат достъпа до информацията. И така, каква е алтернативата? Ами IPFS (Interplanetary File System) предоставя начин за разпространение на файлове по целия свят, при който използваме хеш стойност (CID – Content Identifier – и която е SHA-256 хеш версия на файла) за идентифициране на съдържанието. По този начин се преодоляват сложните структури на URL адресите, които сме създали.

И така, защо ми трябва услуги, които да намират файл някъде на диска и след това да го съпоставят със сложен URL адрес? Защо не мога просто да дам идентификатора на съдържанието и Интернет просто да го намери?

Затова премествам голяма част от инфраструктурата си за шифърни предизвикателства към IPFS и интелигентни договори. Това означава, че няма да е необходимо да съхранявам файлове на сървъра си или за изпълнявам код на сървъра, за да генерирам предизвикателството. Нека сега да разгледаме пример за шифър на Pigpen. Понастоящем използвам сървъра си на генериране на предизвикателството и за извличане на графиките за всяка графика Pigpen [тук]:

1*TB4sq7kaEI TIgbXqF9tBQ

IPFS (InterPlanetary File System)

В IPFS е реализирана разпределена инфраструктура, която използва метода P2P и в която няма централизиран сървър. Както и при Tornet мрежите, тя се определя като устойчива на цензура [1] очертава, че IPFS може да се оприличи на уеб, където използваме хипервръзки със съдържание и адрес, но където един рояк BitTorrnet обменя обекти и рамките на едно Git хранилище.

IPFS разделя файловете на блоковете или парчета и трасета и използва DAG на Меркcъл (Direcct Acyclic Graph) за определяне на контрола на версиите на файловете и разпределена таблица с данни. В рамките на традиционната блокчейн инфраструктура съхраняваме последователно трансакциите. Това може да отнеме известно време, за да се създаде консенсус чрез изграждане на блокове. При DAG всяка от трансакциите се превръща в блок и по този начин се ускоряват механизмите за постигане на консенсус. Серджо Демиан Лернер [2] изтъкна, че в DAG няма фиксирани блокове и че всяка трансакцията носи със себе си, свое собствено доказателство за работа. В рамките на това той дефинира използването на бърз кеш за най-новите трансакции и където по-старите трансакции не могат да се използват като референция.

Съхранение IPFS

Така че не да получим графиките от IPFS и да използваме интелигентен договор, за да генерираме предизвикателството. Първо, трябва да стартираме IPFS десктоп и и да поставим графиките (и кои са “a.png, “b.png” и т.н.):

1*0lXmG7F4nYYuIMvDH22Mbg

Можем да извикаме обратно графиката с CID или да използваме шлюз към източника. Това е източник “a” като:

QmcizbQqy4A9HRUEA34aiBSzbpk6BHJFDjAJWMvrKQRUyA

И след това можем да получим достъп от [тук]

https://ipfs.io/ipfs/QmcizbQqy4A9HRUEA34aiBSzbpk6BHJFDjAJWMvrKQRUyA

А “b” се получава като:

QmcVC9hK9CDKW9RC5aBNFjF521XyDCfiPR3zzzQ84NZGXy

И след това можем да получим достъп до него от [тук]

https://ipfs.io/ipfs/QmcVC9hK9CDKW9RC5aBNFjF521XyDCfiPR3zzzQ84NZGXy

Смарт контракт

Сега ще създадем интелигентен договор. За целта ще генерираме дума на случаен принцип, след което ще съпоставим всеки символ в хранилището IPFS:

pragma solidity ^0.8.0;
// SPDX-License-Identifier: MIT


contract Ciphers {

     string [59]  words =["accepting", "active",  "added",  "angle",
                        "area", "authors",
                            "besides","box","category","common",
                                "company","compare","complaints","complete","complicate",
                                "concern","concrete","consider","consistency",
                                "continuous","corners","course","crisis","cross","daily",
                                "danger","decide","default","department","depth","detail",
                                "dictionary","disadvantage","dislike","displays","documented",
                                "dream","drive","earth","education","emergency",
                                "enjoy","eraser","evidence","examine","exercise",
                        "exists","expand","expanded","expanding","expands","expansion",
                        "face", "facilities", "facility","fact","factor", "facts",
                        "igloo"];
 
  



  function pigpen_cipher() view public returns (string memory) {
  string [26] memory ipfs=["QmcizbQqy4A9HRUEA34aiBSzbpk6BHJFDjAJWMvrKQRUyA",
    "QmcVC9hK9CDKW9RC5aBNFjF521XyDCfiPR3zzzQ84NZGXy",
    "QmfP33Mde6wLXphucyV6Z3em8HjHhdftEBgJ4PDcfuNzgu",
    "QmPXZXszrGn2c1pcL2UNK3UfqW6DYaLHZsicYo5Gktkj4W",
    "QmWBcdmDzdQNkuNneaVgEWpCmHyacSDyUYGvWWKdWwmY5F",
    "QmVhddtfRsXnJyiuQbXgZcKoGyDVCqnNvcyVEBKZqqLMrR",
    "Qmdvvx2Ld8Hm4t2zKgwygJkSn95MhL1ydz2mJNcbUuJV3X", 
    "QmTKsT2MSFhYNMgF6dKALHHeXvgfM5opdqE1VeWcSDvbad",
    "QmR7StEGgVkURcbiwK2KBEq7kstwzawAQmp7tuAQ37dTBT", 
    "QmeUqUVkDqyHxGbugrc97w7JuyRvbh3C3CYwMPc31C6Sqa",
    "QmamDWzzAr3XvvvHk6DbRk7n7tUVsaXYorHnJJBiVMbtNS",
    "QmPVn2BEyKCBKc1SRK9KicFqyW9Sg7ohAypSBZEPJhMrqu", 
    "QmbqEVE1QWePs9U8wkDs8ciZuZYVjA6fZN64rJq3GFA7oj",
    "QmYZuznL9juXoFs7AiRysPqkaZxb6cskKrd7ze6zReg2tW", 
    "QmPAw8SpwvUQQxf3SfcKAmVvpko6bETBYeRJShCkYxMDef", 
    "QmfTyFLuwRxEYrj2zpu6sMsCCTJV6fh7QJphHCEHpCL5T5", 
    "QmQKp5QCw2TRr9dhyVFPKpGEErjSx7L6KTEhgHs7uYgWgN", 
    "QmapjseB9ZvajzZX39RHGJy3X1ny3t6wVCdruiNLtAcQLg", 
    "QmPyy7kn3TqT5EMJLKaumHxxpuQ7387Cyxvnc79pRcg44R", 
    "QmV1rgTWd8QBW8ZMZhUU26Jz3vfUnT6A2kBqwU2rnJWbUe", 
    "QmPnwDGtzWefzXwFcBV4TXWQ1cvbXsgMYAs1aRpotjy5WD", 
    "Qmf9BzmSqj7UJ9XBv9pKGEa8VHb3J4aJYHmCStopgKEBng", 
    "QmcSw7WNyvKTLuxLzFq4vCisw5u3eJN218K8ioHcGug6yR", 
    "QmYXaP2QMLpVsGpugKdTzYQ1V4JbnULnRDqmHAWMxdyJFy", 
    "Qmd5ZeGU5cJFUasQBWr7VvXbbPUWQcYnWUUQQVYkyk6XT6", 
    "QmWWd8DbkjJmkbD8b6xjr1X4Ped2ufokgatyp2vS92hSV8"

    ];

    bytes memory word=bytes(words[random(words.length,0)]);

    string memory rtn="Find the plaintext for the Pigpen code of: ";

    for (uint256 i=0;i<word.length;i++)
    { 
        uint256 pos=uint8(word[i])-uint8(97);

        rtn=string(abi.encodePacked(rtn,"<img src='https://ipfs.io/ipfs/",ipfs[pos],"' style='height: 50px;'> " ));
      } 
    rtn= string(abi.encodePacked(rtn, "\n\nThe answer is:\n",word));
    return string(rtn); 
 
  }
  


  function morse_code() view public returns (string memory) {

    string [26] memory morse= ["(.-)","(-...)","(-.-.)","(-..)","(.)","(..-.)","(- -.)","(....)",
    "(..)","(.- - -)","(-.-)","(.-..)","(- -)","(-.)","(- - -)","(.- -.)","(- -.-)",
    "(.-.)","(...)","(-)","(..-)","(...-)","(.- -)","(-..-)","(-.- -)","(- -..)"];


    bytes memory word=bytes(words[random(words.length,0)]);

    string memory rtn="Find the plaintext for the Morse code of: ";

    for (uint256 i=0;i<word.length;i++)
    { 
        uint256 pos=uint8(word[i])-uint8(97);
        rtn=string(abi.encodePacked(rtn, (morse[pos])));
      } 
    rtn= string(abi.encodePacked(rtn, "\n\nThe mapping is:\n"));
    rtn=string(abi.encodePacked(rtn, word));
    return string(rtn); 
 
  }
  

  function random(uint number,uint i) view internal returns(uint){
    return uint(keccak256(abi.encodePacked(block.timestamp,block.difficulty,  
        msg.sender,uint(i)))) % number;
  } 

}

Съпоставянето с IPFS хранилището се определя с масива от низове:

string [26] ipfs=["QmcizbQqy4A9HRUEA34aiBSzbpk6BHJFDjAJWMvrKQRUyA",
"QmcVC9hK9CDKW9RC5aBNFjF521XyDCfiPR3zzzQ84NZGXy",
"QmfP33Mde6wLXphucyV6Z3em8HjHhdftEBgJ4PDcfuNzgu",
"QmPXZXszrGn2c1pcL2UNK3UfqW6DYaLHZsicYo5Gktkj4W",
];

Сега можем да изберем произволна дума, да определим нейното място в азбуката (pos) и след това да я съпоставим с графиките на Pigpen:





function pigpen_cipher() view public returns (string memory) {
  bytes memory word=bytes(words[random(words.length,0)]);
  string memory rtn="Find the plaintext for the Pigpen code of: ";
  for (uint256 i=0;i<word.length;i++) {
    uint256 pos=uint8(word[i])-uint8(97);
    rtn=string(abi.encodePacked(rtn,
      "<img src='https://ipfs.io/ipfs/",ipfs[pos],"' style='height: 50px;'> " ));
  }
rtn= string(abi.encodePacked(rtn, "\n\nThe answer is:\n",word));
return string(rtn);
}

Първо ще създадем интелигентен договор и ще го компилираме:

След това можем да стартираме нашия локален блокчейн с ganache:

1*luW4ZOslZytBh5a9LQh7zw

И след това разгърнете вашия договор на локално ниво:

1*7uYpugm2ZppyAp

След това виждаме, че миньорите за заредили малко газ:

Сега ще тестваме:

Кодът е:

ind the plaintext for the Pigpen code of:  <img  src='https://ipfs.io/ipfs/QmPXZXszrGn2c1pcL2UNK3UfqW6DYaLHZsicYo5Gktkj4W'  style='height: 50px;'> <img  src='https://ipfs.io/ipfs/QmR7StEGgVkURcbiwK2KBEq7kstwzawAQmp7tuAQ37dTBT'  style='height: 50px;'> <img  src='https://ipfs.io/ipfs/QmPyy7kn3TqT5EMJLKaumHxxpuQ7387Cyxvnc79pRcg44R'  style='height: 50px;'> <img  src='https://ipfs.io/ipfs/QmfTyFLuwRxEYrj2zpu6sMsCCTJV6fh7QJphHCEHpCL5T5'  style='height: 50px;'> <img  src='https://ipfs.io/ipfs/QmPVn2BEyKCBKc1SRK9KicFqyW9Sg7ohAypSBZEPJhMrqu'  style='height: 50px;'> <img  src='https://ipfs.io/ipfs/QmcizbQqy4A9HRUEA34aiBSzbpk6BHJFDjAJWMvrKQRUyA'  style='height: 50px;'> <img  src='https://ipfs.io/ipfs/Qmd5ZeGU5cJFUasQBWr7VvXbbPUWQcYnWUUQQVYkyk6XT6'  style='height: 50px;'> <img  src='https://ipfs.io/ipfs/QmPyy7kn3TqT5EMJLKaumHxxpuQ7387Cyxvnc79pRcg44R'  style='height: 50px;'>   
The answer is: displays

Ако заредим това в браузъра, ще получим:

1*9GTIjMAZdEktNoBE3D1OQg

И коя изложба казва “дисплея”.

Разгърнете в тестовата мрежа на Ethereum

След като го тестваме локално, можем да го преместим в тестовата врежа на Ethereum. В този случай ще използваме тестовата мрежа Ropsten. След това променяме средата за разгръщане на “Injected Web3” и свързваме портфейла Metamask, след което разгръщаме:

1*zP

След това ще изчакаме миньорите да вземат интелигентния договор:

1*JMHOzDVWw67FZBgVyrDBiA

И след това:

1*Nopk8qsv5GrJDNdXo4rk3g

След това можем да прегледаме трансакцията за новия договор [тук]:

1*Hwdl4LudZVEFUMZEw3EM7w

След това можем да разгледаме договора [тук]:

1*y6vMiyHZHndLPJQFFHS1HA

Сега трябва да проверим договора:

И след това с:

След това въведете кода, за да го проверите:

1* MWV7lJPcedUHN9Q4TyzDg

И след това получете успешно внедряване [тук]:

1*g75K07dNN2TK87OhnaATHw

Сега можем да тестваме:

1*UPDOfdMwTwkgUSy1p37d6Q

Интелигентният договор е тук:

https://ropsten.etherscan.io/address/0x1a9cdda855948fb97debc7ef8064ff8ad72fd1ba#readContract

В заключение:

IPFS предлага по-устойчив и (надяваме се) по-бърз метод за снабдяване със съдържание. Интелигентните договори също поддържат по-разпределен подход. Като цяло IPFS предлага отличен метод за достъп до съдържание, но все още има проблеми за решаване, като например интегрирането на криптиране във файловете и осигуряването на възможност за изтриване на файлове. За стандартно съдържание обаче той е победител!

Ако проявите интерес, в момента провеждаме изследвания за интегриране на IPFS в разпределени системи в рамките на проект на ЕС, наречен GLASS, в който се стреми да изгради инфраструктура за електронно управление, насочено към гражданите..

Ако се интересувате от сътрудничество, моля, свържете се с нас, за да изградим един по-сигурен и устойчив свят.

Справка
[1] Benet, J. (2014). Ipfs-content addressed, versioned, p2p file system. arXiv preprint arXiv:1407.3561.
[2] Lerner, S. D. (2015). DagCoin: криптовалута без блокове (DagCoin: a cryptocurrency without blocks). Бяла книга.

BulChain/Securitysite

Default image
БУЛЧЕЙН
Articles: 319