您的位置:网站首页 > 区块链技术 > 正 文 比特币

IPFS和智能合约的布署

【作者:网文】 来源:转载 日期:2022-4-14 17:03:25 人气: 标签:IPFS 智能合约 ETH 【打印】

 

我们创造了一个中心化的数字世界,它依赖于服务器上运行的服务。这些服务器通常集中提供服务以及数据基础设施。如果服务或数据存储失败,则会对提供服务本身产生风险。除此之外,防火墙还可以阻止人们获取信息。那有什么其他选择呢?IPFS 提供了一种将文件分发到世界各地的方法,在这种方法中,我们使用哈希值(CID—内容标识符—是文件的SHA-256哈希版本)来标识内容。这一定程度上简化了我们创建的复杂URL结构。


那么,为什么我需要服务来定位磁盘上某个地方的文件,然后将其与复杂的URL匹配呢?为什么我不能给内容一个标识符,让互联网找到它呢?


因此,我正在将我的密码挑战基础设施的大部分都转向IPFS和智能合约。这意味着我不需要在服务器上存储文件或在服务器上运行代码来生成挑战。现在让我们以Pigpen密码为例。目前,我使用我的服务器来生成挑战,并为每个Pigpen图形提供图形来源:

IPFS


IPFS使用P2P方法实现分布式基础设施,没有中心化服务器。就像Torrent网络一样,它被定义为抗审查的,IPFS可以被比作我们使用内容地址超链接的Web,但是在这里一个单一的BitTorrent集群在一个Git库中交换的对象。


IPFS将文件分解为区块或区块与跟踪,并使用Merkle DAG(直接无环图)来定义文件的版本控制和分布式哈希表。在传统的区块链基础结构中,我们按顺序存储交易。这可能需要一些时间来通过构建模块来达成共识。使用DAG,每个交易都会成为一个区块,从而加快了共识机制的速度。Sergio Demian Lerner指出,在DAG中没有固定的区块,每个交易都有自己的工作证明。在这个框架中,他为最近的交易定义了快速缓存的用法,以及旧的交易不能作为引用的用法。

IPFS 存储

因此,让我们从IPFS中获取图形,并使用智能合约生成挑战。首先,我们需要运行一个IPFS桌面,并“种”图形(‘a.png’, ‘b.png’,等等):

我们可以用CID回调图形,或者使用一个源网关。这已将“a”作为:


QmcizbQqy4A9HRUEA34aiBSzbpk6BHJFDjAJWMvrKQRUyA


然后我们可以访问:


https://ipfs.io/ipfs/QmcizbQqy4A9HRUEA34aiBSzbpk6BHJFDjAJWMvrKQRUyA


A ' 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," " ));
      }
    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;
  }

}

首先,我们将创建智能合约并编译它:

然后我们就可以用ganache开始我们的区块链了:

然后在本地部署我们的合约:

然后我们看到矿工们收取了一些gas:

现在我们将测试:


如果我们把它加载到浏览器中,我们会得到:

部署到以太坊测试网络

返回顶部】【关闭窗口 风险提示:本站分享转载的信息均来自互联网,且仅供阅读参考,不作为具体投资的依据,据此入市,风险自担。本站所有内容涉及到的“货币”字眼需谨慎研判,我们维护各国法币的合法地位,同时数字资产具有货币的某些属性,目前是不能替代任何国家的法定货币的,请谨慎理解投资并严格遵守各国法律法规!详见本站[免责声明]。】
【读完这篇文章后,可否发表您的感受?】
0
0
0
0
0
0
0
0
本文网址:
安全联盟站长平台 互联网举办平台 公共信息安全网监 中国网安 赛门铁克安全响应中心