1. 首页
  2. 知识百科

在以太坊区块链上建立广告市场

本教程针对编码人员,至少具有React和Solidity方面的一些经验。它将逐步指导智能合约并指出以太坊反应应用程序的细节。

在以太坊区块链上建立广告市场
照片由Tobias MooreUnsplash上  拍摄

本教程的目标是在区块链上为广告建立一个虚构的市场。作为用户,您可以创建代表网站上广告空间的代币。然后,其他用户可以购买由您指定的ETH量的令牌,以获取令牌的所有权并定义广告的内容。如果您只对代码感兴趣,可以在此处找到包含整个应用程序的存储库。

先决条件

首先,如果您对使用以太坊区块链实现智能合约的编程语言Solidity没有任何经验,我建议您先从一些教程开始。Cryptozombies是开始使用基础知识的一个很好的交互,Truffle 的Pet Shop Tutorial是开始使用Truffle框架的一个很好的开始,我们将使用它。

我们还需要一个IPFS的本地运行节点。为了让它运行,您可以查看我关于IPFS的故事。然后我们需要浏览器扩展MetaMask,您可以下载Chrome,Firefox和Brave。最后,我们需要Ganache,一个本地运行的以太坊Blockchain for Mac。


建立

要开始,我们首先需要安装松露,如果你还没有松露:npm install -g truffle。为项目创建一个目录并cd进入该目录。获取反应/松露应用程序的样板truffle unbox react。启动Ganache并更新你的truffle.js,使用Ganache:

module.exports = { 
  networks:{ 
    development:{ 
      host:“127.0.0.1”,
      port:7545,
      network_id:“5777” 
      } 
  } 
};

现在,您可以使用truffle migrate然后启动分散式应用程序(dapp)来编译示例合同并将其部署到本地区块链npm start

接下来,我们将Ganache中的帐户导入MetaMask:打开MetaMask弹出窗口,然后单击“导入现有DEN”。从Ganache复制助记符并将其粘贴到钱包种子字段中。您可以通过单击右上角的图标和时钟导入帐户来导入更多帐户。在Ganache中,您可以使用任何帐户右侧的密钥图标显示私钥,并将其导入MetaMask。稍后您将需要两个或三个导入的帐户。现在单击MetaMask左上角的“主网络”,单击“自定义RPC”并输入http://127.0.0.1:7545/Ganache 的RPC服务器(由于当前版本的MetaMask中的错误,我不得不使用尾部斜杠)。你的余额(99.something)现在应该出现在MetaMask中。

最后,我们需要OpenZeppelin的合同,通过运行安装它们npm install -E openzeppelin-solidityOpenZeppelin提供了许多预定义的合同,如果你还有一些时间可以在他们的GitHub存储库中读取一些合同!

现在我们准备开始开发了!

合同

创建AdvertMarket.solcontracts文件夹中命名的合同。然后我们定义可靠性的版本并定义合同,它继承自合同Ownable(注意:从技术上讲,我们不需要具有此功能的Ownable合同,但它可能对以后的功能很方便)。

在以太坊区块链上建立广告市场

不用担心,整个代码在本教程末尾的存储库中可用。

接下来,我们定义一个结构,包含我们的广告可以拥有的所有信息。我们将广告的内容(它应显示的内容)和元信息(显示的广告在哪里)包含在IPFS哈希中。哈希是不可变的,所以我们在这里很好。

在以太坊区块链上建立广告市场

现在我们为所有广告和两个映射添加一个数组,以存储每个广告的创建者和所有者。此外,我们添加了两个修饰符,以限制对某些方法的访问。

在以太坊区块链上建立广告市场

以下函数允许dapp的每个用户创建广告。参数是元信息的散列和可以购买广告的价格。我们创建一个新广告并将数据哈希值设置为32 x 0,因为它现在为空,前一个价格为0,创建者为消息的发件人,即创建广告的地址。然后广告被推送到数组,索引用于将广告映射到创建者和所有者,在两种情况下都是发送者。(注意,该push方法返回数组的长度,因此我们减去1.)最后我们发出一个事件,我们之前定义过,我们稍后将在dapp中使用该事件。

在以太坊区块链上建立广告市场

下一个函数返回给定广告ID的广告数据。这个函数是一个视图函数,所以它不需要使用它,因为它只访问数据而不写数据。我们将返回以下值:元信息的哈希值,数据的哈希值,价格,之前的价格,创建者的地址和所有者的地址。

在以太坊区块链上建立广告市场

接下来,我们需要逻辑来实现市场和购买。当然我们想在市场上赚钱,所以我们使用以下价格逻辑:

  • 当广告被出售时,新价格不能高于先前价格的2倍。
  • 每当转售广告获利时,我们就会获得25%的利润,广告的创造者获得25%的利润。
  • 对于每笔交易,无论是否获利,我们都要按交易价格的5%计算。

为此,我们定义以下变量:

在以太坊区块链上建立广告市场

以下功能用于购买广告。它需要广告的ID,即将所有者,新价格和新数据的哈希值更改为参数。该函数是应付的,这意味着该交易可以包含访问的ETH(除了天然气)msg.value。我们检查提供的价值是否等于广告的价格,并且新价格不高于当前价格的2倍。如果所有检查都通过,则会触发一个事件以通知该广告已更改其所有者。接下来,付款的分配在payShareholders函数中完成,我们将在下面讨论。然后更新广告数据并发出一个事件,其中包含新数据的id和哈希值。

在以太坊区块链上建立广告市场

根据我们上面提到的逻辑,我们使用以下功能在我们,前任所有者和创建者之间分配付款。费用按加价计算,默认情况下creatorPayment设置为0。通过从当前价格中减去先前价格来计算利润。如果利润高于0且销售广告的帐户不是创建者,我们会对利润收取费用并向创作者分享利润。所有者付款是支付的价格减去我们的费用和创建者的付款。接下来,将剩余的付款转发给所有者,如果创建者收到付款,也会转发。

在以太坊区块链上建立广告市场

最后,我们定义一个函数,允许当前所有者更改广告的数据。

在以太坊区块链上建立广告市场

合同的完整代码可以在这里找到。
为了能够部署合同,我们必须修改文件migrations/2_deploy_contracts.js。我们导入了Ownable合同,以及我们刚刚编写并签署的合同。
现在我们可以使用合同将合同部署到本地区块链truffle migrate

在以太坊区块链上建立广告市场

前端

虽然我们的智能合约可以替代传统服务器,但我们仍然需要一个前端让用户与智能合约进行互动。你可以访问GitHub存储库中的整个代码,我将浏览那些对我们的dapp特别的部分,而不是通过这些东西,它们的行为就像常规的React一样。

首先,我们需要.json在部署期间生成的构建文件夹中导入合同  文件,我们还需要Ethereum JavaScript API,它称为web3并ipfs-mini与IPFS节点交互。

在以太坊区块链上建立广告市场

除了我们广告的数组,我们还需要在我们的州中存储合同实例,web3提供者,当前帐户地址和IPFS实例。

在以太坊区块链上建立广告市场

在该componentWillMount()函数中,我们首先实例化IPFS api并将我们的本地节点作为端点提供。你需要更新你的  .ipfs/config :

“API”:{ 
    “HTTPHeaders”:{ 
      “Server”:[ 
        “go-ipfs / 0.4.15” 
      ],
      “Access-Control-Allow-Methods”:[ 
       “PUT”,
       “GET”,
       “POST” 
     ],
     “Access-Control-Allow-Origin”:[ 
       “*” 
     ]

然后我们得到了web3提供程序,它将由MetaMask注入。如果用户没有安装MetaMask,您可以回退到Infura等公共提供商。

在以太坊区块链上建立广告市场

一旦设置了web3提供程序,我们就需要实例化合同。这将通过将我们的导入合同传递给truffle-contract。松露为我们带来了所有的魔力,并且知道已部署合同的地址。接下来,需要将web3提供程序设置为合同的提供程序。合同部署后,我们可以在我们的州设置合同实例并启动观察者。我们还会定期检查MetaMask中所选帐户是否已更改,并相应地设置当前帐户。

在以太坊区块链上建立广告市场

我们可以听取智能合约中触发的事件并相应地更新我们的UI。请注意,我们可以一次又一次地根据块编号访问所有事件。与来自例如Web套接字的事件不同,它只能被访问一次,在它们被触发时,这些事件在区块链上是永久性的,并且可以更多地被视为区块链上的一种记录。

在以太坊区块链上建立广告市场

我们跳过React App的显示部分,然后继续创建广告,该广告在组件中发生AdSpaceForm。表单字段接受价格为ether,因此我们需要将其转换为Wei,因为智能合约的API假设所有以太坊值都在Wei中。(10⁸Wei是以太。)转换功能由web3提供。接下来,我们需要将json添加元信息的表示添加到IPFS以接收哈希。这个哈希需要转换(使用函数shorten),因为IPFS返回的哈希值在base58中,我们将它存储为十六进制。购买广告是类似的。

在以太坊区块链上建立广告市场

AdSpace显示广告的组件需要.json在显示之前从IPFS中检索  数据。我们使用该lengthen函数将哈希转换为IPFS可读格式。

在以太坊区块链上建立广告市场

包起来

现在你已经完成了。继续尝试使用MetaMask中的第一个帐户创建和广告,然后切换帐户以购买广告。当然这个示例应用程序缺少很多功能,但它的目的只是为了演示如何使用加密令牌构建市场。尝试为应用程序添加更多功能并分享您的见解!

使用ERC721时,无法自定义令牌的交易方式。

您可能想知道为什么我们没有将ERC721令牌标准用于不可替换的令牌。(不可替代的令牌是唯一的,不可分离,如广告。)这是因为ERC721令牌API只定义了有关所有权的信息以及交易它的方法。如果你查看OpenZeppelin的合同实现,你可以看到,这些令牌本身没有价格。如果您想为此令牌建立一个交易平台,您需要一个新合约,该合约实施托管以存储所有者的令牌,并在买方提供约定的ETH量时将其交易给买方。基本上,如果我们的广告是ERC721代币,那么每个人都可以为他们建立一个交易平台并收取费用。但我们是支付和利润分享的自定义逻辑,因此令牌带有内置的购买机制。

原创文章,作者:Running,如若转载,请注明出处:https://ipfsdrop.com/wiki/zaiyitaifangqukuailianshangjianliguanggaoshichang/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

(+86)18301922335

在线咨询:点击这里给我发消息

邮件:haskell@freechains.cn

工作时间:7×24小时

QR code