0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Dapp系统项目开发部署流程

搭建punk2558 来源:搭建punk2558 作者:搭建punk2558 2022-09-16 14:18 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

如何在以太坊上搭建一个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

if(candidateList==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定义。

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开发
    +关注

    关注

    0

    文章

    376

    浏览量

    42022
  • 区块链智能合约

    关注

    4

    文章

    426

    浏览量

    11769
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于安路DR1M90 FPSoC 的Linux 系统流程开发指南(3)

    本手册由创龙科技研发,针对安路飞龙 DR1M90,详述 Linux 系统开发流程:LinuxSDK 配置编译、BOOT.bin(FSBL+U-Boot)开发、Kernel 与 Rootfs
    的头像 发表于 11-26 17:01 142次阅读
    基于安路DR1M90 FPSoC 的Linux <b class='flag-5'>系统</b>全<b class='flag-5'>流程</b><b class='flag-5'>开发</b>指南(3)

    基于安路DR1M90 FPSoC 的Linux 系统流程开发指南(1)

    本手册由创龙科技研发,针对安路飞龙 DR1M90,详述 Linux 系统开发流程:LinuxSDK 配置编译、BOOT.bin(FSBL+U-Boot)开发、Kernel 与 Rootfs
    的头像 发表于 11-25 14:09 202次阅读
    基于安路DR1M90 FPSoC 的Linux <b class='flag-5'>系统</b>全<b class='flag-5'>流程</b><b class='flag-5'>开发</b>指南(1)

    明晚8点|睿擎文件系统实战:从开发到发布全流程解析

    从文件操作到镜像发布,一次直播掌握完整开发流程!在嵌入式系统开发中,文件系统是数据存储、配置管理和资源访问的核心基础。然而在实际开发中,文件
    的头像 发表于 11-11 11:53 384次阅读
    明晚8点|睿擎文件<b class='flag-5'>系统</b>实战:从<b class='flag-5'>开发</b>到发布全<b class='flag-5'>流程</b>解析

    项目效率翻倍!迅为RK3568 V2.0硬件接口升级,开发流程再提速

    项目效率翻倍!迅为RK3568 V2.0硬件接口升级,开发流程再提速
    的头像 发表于 10-29 10:53 219次阅读
    <b class='flag-5'>项目</b>效率翻倍!迅为RK3568 V2.0硬件接口升级,<b class='flag-5'>开发</b><b class='flag-5'>流程</b>再提速

    上扬软件助力华兴激光部署流程MES系统

    近日,上扬软件完成了对江苏华兴激光科技有限公司(“华兴激光”)通信应用激光外延材料、芯片及封测全流程生产制造执行系统(MES)的需求调研工作,系统正式进入开发实施阶段,预计将于2025
    的头像 发表于 09-04 15:01 876次阅读

    新唐科技推出高效AI MCU部署工具NuML Toolkit

    随着 AI 技术加速导入各类嵌入式系统,如何将训练完成的 AI 模型顺利部署至资源有限的微控制器成为工程师面对的重大挑战。为协助开发者快速落地 AI 方案,新唐科技推出 NuML Toolkit
    的头像 发表于 08-01 17:21 1877次阅读

    单片机开发流程包括什么?

    单片机开发是一个系统性的工程,从需求明确到最终产品落地,需要经历多个相互关联的流程环节,每个环节都对最终产品的性能和质量有着重要影响。 一、需求分析与文档梳理 开发
    的头像 发表于 07-22 11:21 626次阅读

    干货分享 | RK3588 Ubuntu系统Docker容器使用指南

    前言:在瑞芯微RK3588高性能AIoT平台上运行Ubuntu系统时,Docker容器技术能极大提升开发部署效率。通过轻量级虚拟化实现环境隔离与快速迁移,本文将从零开始详解RK3588平台
    的头像 发表于 06-27 12:01 3206次阅读
    干货分享 | RK3588 Ubuntu<b class='flag-5'>系统</b>Docker容器使用指南

    汽车零部件开发项目管理

    汽车零部件开发项目管理是一个涉及多环节、多部门协作的复杂过程,需从项目启动到交付全流程进行科学规划与管控。以下从 核心流程 、 关键要素 、
    的头像 发表于 06-09 13:26 1123次阅读

    HarmonyOS5云服务技术分享--Serverless抽奖模板部署

    活动。不用写复杂代码,跟着步骤走就能搞定,文末还有部署避坑指南哦~ 一、前期准备 1️⃣ ​​注册账号+创建项目​​ 先到华为开发者平台注册账号 创建新项目时记得勾选\"云
    发表于 05-22 20:25

    基于RV1126开发板的AI算法开发流程

    AI算法开发流程由需求分析到准备数据,然后到选取模型,训练模型,接着模型转换后进行模型部署
    的头像 发表于 04-18 14:03 2045次阅读
    基于RV1126<b class='flag-5'>开发</b>板的AI算法<b class='flag-5'>开发</b><b class='flag-5'>流程</b>

    基于RV1126开发板的AI算法开发流程

    AI算法开发流程由需求分析到准备数据,然后到选取模型,训练模型,接着模型转换后进行模型部署
    的头像 发表于 04-18 10:47 849次阅读
    基于RV1126<b class='flag-5'>开发</b>板的AI算法<b class='flag-5'>开发</b><b class='flag-5'>流程</b>

    极速部署!GpuGeek提供AI开发者的云端GPU最优解

    支持及全流程开发体验的综合考量。GpuGeek作为专注于AI基础设施的平台,凭借其“极速部署”能力与深度优化的服务体系,正成为开发者的云端首选。 一、秒级启动:从注册到运行,30秒开启
    的头像 发表于 03-17 11:27 652次阅读
    极速<b class='flag-5'>部署</b>!GpuGeek提供AI<b class='flag-5'>开发</b>者的云端GPU最优解

    K230D部署模型失败的原因?

    重现步骤 1.按照教程实现MicroPython 版本部署流程,连接上并将文件放到对应位置后,刚运行就断开和canmv ide的连接了(此时用的固件版本是图中推荐的K230D_Zero...
    发表于 03-11 06:19

    《AI Agent 应用与项目实战》阅读心得3——RAG架构与部署本地知识库

    实际开发中,开发者需要注意文档预处理的质量、向量化模型的选择、检索策略的优化等技术细节,同时要考虑系统的可维护性和扩展性。本地部署和云端部署
    发表于 03-07 19:49