Dapp系统开发智能合约部署技术

简介: 在这个例子中,我们只是调用了web3.eth.accounts,然后将返回结果的第一个账号作为这个合约的所有者(即将合约部署到区块链上的账号)。也就是说,即便你更新了合约,又重新部署了一次,之前的合约仍然会原封不动地留在区块链上,并且其中存储的数据也不会受到丝毫影响,新部署的代码会创建一个全新的合约实例。首先,准备开发环境,学习在开发环境中的合约编写、编译和部署流程,通过node.js控制台与区块链上的合约交互,通过一个简单的网页与合约交互,在页面上提供投票功能并显示候选项及相应的票数。

  如何在以太坊上搭建一个Dapp?对于开发人员来说,最好的学习办法就是亲自动手做一个小项目。所以,接下来将会以一个投票程序为例,带着你在以太坊平台上搭建一个dapp,并且通过借助这样一个例子介绍Dapp的编译、部署及交互过程。

  这个程序的功能很简单,只是设定一组候选项,让所有人都可以给这些候选项投票,以及显示每个候选项收到的总票数。

  事先说明,因为所有dapp框架都会隐藏掉一些底层细节,对初学者来说,贸然使用框架可能会形成对系统认识上的障碍,所以本文不会介绍如何借助框架搭建dapp。这样等将来需要甄选框架时,你也能清楚地看到框架到底帮你做了什么。

  首先,准备开发环境,学习在开发环境中的合约编写、编译和部署流程,通过node.js控制台与区块链上的合约交互,通过一个简单的网页与合约交互,在页面上提供投票功能并显示候选项及相应的票数。

  整个程序的开发都是在一台干净的ubuntu 16.04 xenial上完成的。除此之外,我还在一台macos上重复了一遍搭建和测试过程。

  准备开发环境

  按web开发的说法,真实区块链(live blockchain)相当于生产环境,我们自然不应该在生产环境上做开发,因此本文用了一个名为ganache的内存区块链(相当于区块链模拟器)。本教程的第二篇文章才会跟真正的区块链交互。

  下面是在linux操作系统上安装ganache和web3js,以及启动测试区块链的步骤。在macos上可以用同样的命令。windows系统可以参照这里的命令。

  注意:ganache-cli会创建10个自动参与交易的测试账号,每个账号里都预存了100个以太币(当然,只能用于测试),区块链DAPP项目开发,DAPP系统开发模式源码,DAPP钱包系统搭建技术。

  简单的投票合约

  接下来我们要用Solidity编程语言编写合约。如果你熟悉面向对象编程,就会觉得这个学起来很轻松。

  我们要编写一个名为Voting的合约(相当于OOP语言中的类)。这个合约中会有个构造器,负责初始化一个包含候选项的数组;还会有两个方法,一个用于返回指定候选项的总票数,另一个给候选项的得票数加一。

  注意:在将合约部署到区块链上时,构造器会执行,并且只会执行这一次。在做web应用时,每次重新部署都会覆盖掉原来的代码,但部署到区块链上的代码是不可变的。也就是说,即便你更新了合约,又重新部署了一次,之前的合约仍然会原封不动地留在区块链上,并且其中存储的数据也不会受到丝毫影响,新部署的代码会创建一个全新的合约实例。

  下面是带有注释的投票合约代码:

  pragma solidity^0.4.18;

  //必须指明编译这段代码的编译器版本

  contract Voting{

  /*下面这个mapping域相当于一个关联数组或哈希。

  mapping的键是候选项的名字,类型为bytes32;

  值的类型是无符号整型,用于存储得票数。

  */

  mapping(bytes32=>uint8)public votesReceived;

  /*Solidity(还)不允许给构造器传入字符串数组。

  所以我们用bytes32数组存储候选项

  */

  bytes32[]public candidateList;

  /*这就是把合约部署到区块链上时会执行一次的构造器。

  在部署合约时,我们会传入一个包含候选项的数组。

  */

  function Voting(bytes32[]candidateNames)public{

  candidateList=candidateNames;

  }

  //这个函数用于返回指定候选项的总票数,其参数即为指定候选项

  function totalVotesFor(bytes32 candidate)view public returns(uint8){

  require(validCandidate(candidate));

  return votesReceived[candidate];

  }

  //这个函数用于将指定候选项的票数加一

  //这相当于实现了投票功能

  function voteForCandidate(bytes32 candidate)public{

  require(validCandidate(candidate));

  votesReceived[candidate]+=1;

  }

  function validCandidate(bytes32 candidate)view public returns(bool){

  for(uint i=0;i<candidateList.length;i++){

  if(candidateList<i>==candidate){

  return true;

  }

  }

  return false;

  }

  }

  部署区块链

  将上面的代码保存到Voting.sol文件中,放在hello_world_voting目录下。接下来我们要编译这段代码,并将它部署到ganache区块链上。

  在编译Solidity代码之前,需要先安装npm模块solc。我们会在node控制台中用这个库编译合约。

  首先,在终端中运行node命令进入node控制台,初始化solc和web3对象。下面是需要在node控制台中输入的代码:

  mahesh projectblockchain:~/hello_world_voting$node

  >Web3=require('web3')

  >web3=new Web3(new Web3.providers.HttpProvider

  为了确保web3对象初始化成功,可以跟区块链通讯,我们可以查询一下区块链上的所有账号。

  为了编译合约,需要先加载文件Voting.sol中的代码,并将其赋值给一个字符串变量,然后再编译这个字符串。

  >code=fs.readFileSync('Voting.sol').toString()

  >solc=require('solc')

  >compiledCode=solc.compile(code)

  代码编译成功后,可以在node终端中输入compiledCode命令查看contract对象,有两个域非常重要,一定要搞明白:compiledCode.contracts[‘:Voting’].bytecode:这是Voting.sol中的代码编译而成的字节码,也是要部署到区块链上的代码。compiledCode.contracts[‘:Voting’].interface:这是合约的接口或者说模板(称为abi),告诉合约的用户有哪些方法可用。将来不管什么时候要跟合约交互,都需要这个abi定义。这里有关于ABI的详细介绍。

  部署合约

  先创建一个在区块链中部署和初始化合约的合约对象(即下面的VotingContract)。

  >abiDefinition=JSON.parse(compiledCode.contracts[':Voting'].interface)

  >VotingContract=web3.eth.contract(abiDefinition)

  >byteCode=compiledCode.contracts[':Voting'].bytecode

  >deployedContract=VotingContract.new(['Rama','Nick','Jose'],{data:byteCode,from:web3.eth.accounts[0],gas:

  4700000})

  >deployedContract.address

  >contractInstance=VotingContract.at(deployedContract.address)

  上面代码中的VotingContract.new将合约部署到区块链上。它的第一个参数是包含候选项的数组,一看就能明白。第二个参数中各数据项的含义分别为:data:这是已编译好要部署到区块链上的字节码。from:区块链必须追踪是谁部署的合约。在这个例子中,我们只是调用了web3.eth.accounts,然后将返回结果的第一个账号作为这个合约的所有者(即将合约部署到区块链上的账号)。

  记住,web3.eth.accounts返回的是ganche在启动测试区块链时创建的10个测试账号组成的数组。然而在真实的区块链中,不能随便指定一个账号。那必须是你拥有的账号,并且在交易之前要解锁那个账号。在创建账号时,系统会要求你提供一个口令,这个口令就是用来证明你对账号的所有权的。为了用起来方便,Ganache默认把10个账号全解锁了。

  gas:跟区块链交互是要花钱的。为了把你的代码放到区块链上,是需要让矿机干活的,这笔钱就是给那些付出计算力的矿机的。

  你必须明确愿意为此支付多少钱,即给‘gas’一个值。购买燃料的以太币是从你的from账号中出的。燃料的价格是由网络设定的。合约部署好之后,我们就可以跟合约的实例(即上面的变量contractInstance)交互了。区块链上有成百上千个合约,怎么确定哪个是你的呢?答案是用deployedContract.address。在你必须跟合约交互时,需要这个部署地址和之前说过的那个abi定义。

相关文章
|
存储 安全 区块链
智能合约DAPP系统搭建 | 区块链技术智能合约系统模式开发
智能合约是一种特殊协议,旨在提供、验证及执行合约。具体来说,智能合约是区块链被称之为“去中心化的”重要原因,它允许我们在不需要第三方的情况下,执行可追溯、不可逆转和安全的交易。
|
存储 安全 算法
DAPP合约系统开发|DAPP去中心化模式系统开发(成熟技术)
透明度和灵活性:任何区块链用户都可以评估合约逻辑和底层机制
|
区块链 存储
DAPP智能合约系统开发详细技术及方案项目
区块的作用就是将不同时间阶段内的交易数据按照一定的格式和数量,打包成结构化数据,方便存储和管理。
|
JavaScript 前端开发 Go
区块链Dapp智能合约系统开发(开发功能)丨dapp/defi代币合约项目系统开发成熟案例版及源码部署
The following are important technical points in the development process of smart contract DApp:
|
存储 Oracle 关系型数据库
|
JSON 前端开发 编译器
链上DAPP系统开发|DApp智能合约开发搭建技术
合约可以调用其他合约,只需知道地址和ABI,我们就可以在合约内部调用其他合约,需要注意的是,调用合约也是事务性操作,因此,你不需要通过手动管理异步操作的方式来等待返回结果。在合约内部调用其他合约需要消耗额外的Gas费用。
链上DAPP系统开发|DApp智能合约开发搭建技术
|
存储 算法 区块链
区块链DAPP智能合约项目系统开发讲解方案
区块链DAPP智能合约项目系统开发讲解方案
234 11
|
区块链
DAPPQ去中心化智能合约开发正式版丨DAPP去中心化智能合约系统开发(开发方案)丨DAPP智能合约去中心化系统源码
Artificial intelligence technology is one of the core technologies in the era of intelligent industry.Artificial intelligence technology includes machine learning,deep learning,natural language processing,computer vision,and so on.The application of these technologies enables machines to learn,under
|
区块链 计算机视觉
什么是DAPP智能合约系统开发技术方案丨智能合约区块链DAPP项目系统开发流程
什么是DAPP智能合约系统开发技术方案丨智能合约区块链DAPP项目系统开发流程
117 0
|
关系型数据库 MySQL Go
DAPP智能合约系统开发代码部署方案介绍
DAPP智能合约系统开发代码部署方案介绍