建议和反馈

请填写你的反馈内容

如何部署以太坊智能合约

2019-12-03 ·746次阅读 ·读完需要10分钟

现在我们有了私有的区块链基础设施,让我们部署我们的第一个以太坊智能合约!

智能合约的设计

以下是有关我希望通过智能合约实现的一些要点。我将首先使基础工作,然后希望发展合同以处理更多功能。

  • 能源生产商将针对每千瓦时发出交易(销售)。

  • 这将根据当前的千瓦时费率为他分配奖励。

  • 费率应随所产生的总能量而变化,即,如果售出更多的kWh,费率将下降。

  • 合同应计算费率。

  • 能源消费者也可以按当前费率购买一些kWh。

  • 费率应随所购买的能源量而变化,即,如果购买更多的kWh,则费率会上升。

  • 合同可以显示当前汇率,也可以显示交易的总能量。

工装

我们将首先使用通用的以太坊“本机”工具来开发应用程序,并将其部署到我们的私有区块链中,因此我们了解了一切工作原理。然后,在我的下一个博客文章中,我将尝试一些集成的环境

和框架,

和框架,例如Ether.Camp,Truffle或BlockApps,以了解它们如何改善体验。


这是我编写第一个合同时使用的一些资源。


在官方文件密实


该合同的教程在GitHub的复仇维基


在复仇加密货币/硬币/令牌教程


编码

第一次尝试,我将使用以太坊基于浏览器的编译器这是一个简单但有效的工具,可让您轻松地在浏览器中轻松编写智能合约(使用语法突出显示),进行编译和测试(例如,发行呼叫和交易)。

这是我作为Gist的第一次尝试,整个代码都内联:

contract ApolloTrade {
    uint public kWh_rate = 1000;
    mapping (address => uint) energyAccount;
    mapping (address => uint) coinAccount;
    address public owner;
    
    function ApolloTrade() {
        owner = msg.sender;
    }
    
    modifier onlyOwner {
        if (msg.sender != owner) throw;
        _
    }
    
    function setRate(uint rate) onlyOwner {
        kWh_rate = rate;
    }
    // I am selling some energy; this will credit my account
    function sellEnergy(uint kwh) public {
        coinAccount[msg.sender] += (kwh * kWh_rate);
    }
    // I am buying some energy, thus crediting my energy account
    function buyEnergy(uint coin) {
        if (coinAccount[msg.sender] > coin) {
            coinAccount[msg.sender] -= coin;
            energyAccount[msg.sender] += (coin / kWh_rate);
        }
    }
    
    function getEnergyAccount() returns (uint kwh) {
        return energyAccount[msg.sender];
    }
    function getCoinAccount() returns (uint coin) {
        return coinAccount[msg.sender];
    }}

目前,这非常简单。我有几个称为的数组energyAccountcoinAccount用于跟踪用户拥有多少能量和硬币。这些数组使用用户的地址(或更准确地说,是其帐户的地址)建立索引。sellEnergy()buyEnergy()方法用于执行交换千瓦时为硬币和反之亦然的动作。您可以看到这里的逻辑非常简单,基本上,只有拥有足够的硬币,您才能购买能源;要获得硬币,您必须出售一些能源。

另外,are getCoinAccount()getEnergyAccount()方法将告诉您当前拥有多少个硬币或千瓦时。请记住,我们基本上是在这里创建自己的货币,我们不是在使用以太币,而是在使用我们自己的(超级简单)硬币。

我还介绍了setRate()一种可用于更改一度电价格方法。目前,我还没有管理汇率,我将在稍后进行探讨!

现在,让我们尝试一下我们的合同。要将Gist直接加载到基于Ethereum浏览器的编译器中,可以使用以下URL:

https://ethereum.github.io/browser-solidity/#gist=ca2e2927d72b472c5ee24f3db71a0987

这将加载源代码并进行编译。单击友好的红色“创建”按钮以运行合同!您现在可以使用红色按钮与其进行交互。例如,在setEnergy字段中输入一个值,然后按相应的按钮。然后单击getCoinAccount按钮以检查您是否记入了一些硬币。

基于浏览器的Solidity编译器

现在,我在迭代第一个版本时发现了一些东西:

  • 无需为公共成员创建吸气剂(例如rate),它们将被自动公开。

  • Solidity没有定点数字类型!我现在仅在进行加法和减法,但是对于费率计算而言,这有点尴尬。最佳实践似乎使用乘数,例如,将所有计算乘以1000,然后将最终结果相除。

  • Solidity具有时间管理(now)和时间单位,这在进行基于时间的计算时应派上用场。

  • 由于合同将不会接收或发送实际的以太币,因此我们应该禁用默认send功能。

  • 某些方法调用应受到限制,例如setRate()只能从所有者那里调用。为此,在Solidity中,我们可以使用可以执行预调用条件的“修饰符”。在我的示例中,onlyOwner修饰符用于限制对setRate()函数的访问

  • 默认功能可见性为“ public”,因此无需明确指定。

部署中

现在我们已经在编译器中运行了代码,我们希望将其部署到我们的私有区块链中!您可以查看我以前的文章,以了解我正在使用哪种设置。本着学习的精神,我将再次仅使用基本工具(即geth控制台)来执行此操作。

使用在线编译器,导出合同代码非常简单:只需将代码复制到“ web3 deploy”文本框中,然后将其粘贴到geth控制台中即可。片刻之后(需要签订合同),您应该看到类似以下内容:

Contract mined! address: 0xd761201a95b4e02ccdf720a40350e750d0245a9e transactionHash: 0x1ec5e7186f7fd7a0d43e5226a06711e2d915e26b53154d4ebef981d58d2570ff

当您想从另一个节点调用合同时,合同的地址将在以后有用。但是,到目前为止,部署代码应该已经创建了一个不错的JavaScript对象,您可以立即使用它来调用合同。就我而言,该对象名为apollotrade我们可以使用web3 API调用方法(即读取值)并发送事务(即更改合同状态)。有关交易和通话之间差异的更多详细信息,请参阅“ 合约和交易”文档

基本上,这是如何(通过交易)出售一些能量,然后(通过电话)获取余额的方法:

web3.eth.defaultAccount = eth.accounts[0]apollotrade.sellEnergy(10)apollotrade.getCoinAccount.call()

由于合同已部署在区块链上,因此您也可以在Raspberry Pi中使用它:您需要做的就是从在线编译器(“接口”文本框中)获取ABI(应用程序二进制接口)并将其粘贴到通过以下方式在Pi上的geth控制台:

var abi = [...]

您还应该为合同的地址定义一个变量,如上所示:

var address = "0xd761201a95b4e02ccdf720a40350e750d0245a9e"

然后,您可以在本地定义合同对象:

var apollotrade = eth.contract(abi).at(address)

现在,您可以使用apollotradeRaspberry Pi geth控制台中对象,通过与上面所示相同的方式对象进行交互,例如,使用事务和调用。

请注意,要花一些时间才能执行交易,例如在网络内进行挖掘,然后在本地检索结果。这绝对是区块链平台的重要方面:合同交互本质上是异步的,如果区块链很忙,甚至可能要花几分钟的时间执行!这肯定会影响UI层,这是我将在下一次迭代中进行的工作。


评论(0)问答(0)
请先登录或注册

请先登陆或注册

相关推荐

三两谈币:币圈追求财富自由的几种姿势?

有人说币圈一日,股市一年,币圈在不断演绎创富神话的同时,也会让人一夜返贫。如果说币圈里面,什么是最吸引眼球的字眼,别说什么科技,也别说什么信仰,最最吸引眼球的是四个字“财富自由”。不同的币圈众人用不同......
ofbing88 · 2019-12-09
144阅读 · 0赞赏 · 0问答

李向午:主流币处于震荡上行状态,多头可区间内操作

李向午:主流币处于震荡上行状态,多头可区间内操作  比特币行情分析  昨日比特币价格如笔者所料上行至7600后遇阻回调以7500附近收盘得阳。近日来比特币还是未能脱离震荡区间。今日价格继续在7300-......
李向午 · 2019-12-08
387阅读 · 0赞赏 · 0问答

李向午:保持短空间内操作,狭道亦可获利

李向午:保持短空间内操作,狭道亦可获利  比特币行情分析  比特币上行突破7500点,在触及7600上方位置后触顶回弹。日线图中,布林带呈收口状态,价格在布林带上行通道运行,布林带中轨在7500位置给......
李向午 · 2019-12-07
449阅读 · 0赞赏 · 0问答

以太坊Azure区块链中创建自己的加密货币

如此长的时间以来,“区块链和加密货币”已经成功地破坏了市场。他们在行业中产生的影响是巨大的。看起来它有自己的未来,所以我想写些有关它的东西。在本文中,我们将在Azure中创建我们自己的加密货币和我们自......
Blockchain · 2019-12-07
573阅读 · 0赞赏 · 0问答

李向午:主流币市场陷入震荡,操作者还需谨慎

李向午:主流币市场陷入震荡,操作者还需谨慎  比特币行情分析  比特币昨日登上7500位置后未能企稳,又回调至7350附近位置收盘得阴。  日线图中布林带开始收口,价格运行在布林带下行通道,布林带下轨......
李向午 · 2019-12-06
677阅读 · 0赞赏 · 0问答

以太坊区块链教程从零开始学

从头开始的以太坊区块链教程 是当今的热门话题。 区块链 现在是  Google 搜索量最大的关键字之一,你们中许多人已经听说过 &......
比特币 · 2019-12-06
694阅读 · 0赞赏 · 0问答

樱花YING

1495

LK币

12

粉丝

35

笔记

感谢"樱花YING"

这篇精彩的笔记,目前已经帮助

  • 0
  • 0
  • 7
  • 4
  • 6
喜欢0
链客社群 加入

微博进入

商务合作>

广告投放>

公司名称:北京链客行科技有限公司

联系方式:010-67707199

ICP备案号:京ICP备18032136号

Copyright:链客区块链技术问答社区 版权所有

感谢您的提问,问题被社区永久收入以便新人查看。一定要记得采纳最佳答案哦!加油!

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!