大年初二已憋不住想写代码的心!教你15分钟写一个区块链Web应用

简介:

以太坊是什么

以太坊是一个全新开放的区块链平台,它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用。就像比特币一样,以太坊不受任何人控制,也不归任何人所有——它是一个开源项目,由全球区块链爱好者共同创建。和比特币协议有所不同的是,以太坊的设计十分灵活,极具适应性。

比特币 vs 以太坊

如果对比特币和以太坊,一个形象的比喻是计算器和智能手机,计算器只有一些内置的加减乘除功能,智能手机可以安装实现各种功能的App。因此,比特币会在金融支付等特定领域发挥价值,而以太坊可以为各行各业提供解决方案。

以太坊发展历史回顾

2013年末以太坊创始人Vitalik Buterin第一次描述了这个项目,作为他研究比特币的成果。不久后,Vitalik发表了以太坊白皮书,书中详细描述了以太坊协议的技术设计和基本原理,以及智能合约的结构。2014年1月,Vitalik在美国佛罗里达州迈阿密举行的北美比特币会议上正式宣布了以太坊。

与此同时,Vitalik开始和Gavin Wood博士合作共同实现以太坊。2014年4月,Gavin发表了以太坊黄皮书,作为以太坊虚拟机的技术说明。按照黄皮书中的具体说明,以太坊客户端已经有8种编程语言实现。

从2014年6月开始,以太坊借助42天公开的以太币预售活动对第一批以太币进行了分配,共筹集31591个比特币,当时价值1843万美元,交换出大约6000万以太币。众筹所得主要用于回报开发者们数月以来的努力,以及资助以太坊的持续开发。这笔资金为以太坊后续的发展提供了充足的的资金保证。

经过两年的快速发展,在以太坊平台上创立新的应用十分简便,随着Homestead的发布,任何人都可以安全地使用该平台上的应用。

以太坊核心概念之虚拟机(EVM)

以太坊是可编程的区块链。它并不是给用户一系列预先设定好的操作(例如比特币交易),而是允许用户按照自己的意愿创建复杂的操作。这样一来,它就可以作为多种类型去中心化区块链应用的平台,包括加密货币在内,但并不仅限于此。

以太坊狭义上是指一系列定义去中心化应用平台的协议,它的核心是以太坊虚拟机Ethereum Virtual Machine(EVM),可以执行任意复杂算法的编码。在计算机科学术语中,以太坊是“图灵完备的”。开发者能够使用现有的以JavaScript和Python等语言为模型的其他友好的编程语言,创建出在EVM上运行的应用。熟悉JVM的同学很好理解,EVM就是一个程序运行的容器。

和其他区块链一样,以太坊也有一个点对点网络协议。以太坊区块链数据库由众多连接到网络的节点来维护和更新。每个网络节点都运行着EVM并执行相同的指令。因此,人们有时形象地称以太坊为“世界电脑”。

以太坊如何工作?

以太坊合并了对比特币用户来说熟悉的特征和技术,同时自己也进行了修正和创新。比特币区块链纯粹是一个关于交易的列表,而以太坊的基础单元是账户。以太坊区块链跟踪每个账户的状态,所有以太坊区块链上的状态转换都是账户之间价值和信息的转移。账户分为两类:

  1. 外部账户(EOA),由私钥控制;

  2. 合约账户,由它们的合约编码控制,只能由外部账户“激活”

对于大部分用户来说,两者基本的区别在于外部账户是由人类用户掌控——因为他们能够控制私钥,进而控制外部账户。而合约账户则是由内部编码管控。

如果他们是被人类用户“控制”的,那也是因为程序设定它们被具有特定地址的外部账户控制,进而被持有私钥控制外部账户的人控制着。“智能合约”这个流行的术语指的是在合约账户中编码——交易被发送给该账户时所运行的程序。用户可以通过在区块链中部署编码来创建新的合约。

只有当外部账户发出指令时,合约账户才会执行相应的操作。所以合约账户不可能自发地执行诸如任意数码生成或应用程序界面调用等操作——只有受外部账户提示时,它才会做这些事。这是因为以太坊要求节点能够与运算结果保持一致,这就要求保证严格确定执行。

和比特币一样,以太坊用户必须向网络支付少量交易费用。这可以使以太坊区块链免受无关紧要或恶意的运算任务干扰,比如分布式拒绝服务(DDoS)攻击或无限循环 。交易的发送者必须在激活的“程序”每一步付款,包括运算和记忆储存。费用通过以太坊自有的有价代币,以太币的形式支付。

交易费用由节点收集,节点使网络生效。这些“矿工”就是以太坊网络中收集、传播、确认和执行交易的节点。矿工们将交易分组(包括许多以太坊区块链中账户“状态”的更新),分成的组被称为“区块”,矿工们会互相竞争,以使他们的区块可以添加到下一个区块链上。矿工们每挖到一个成功的区块就会得到以太币奖励。这就为人们带来了经济激励,促使人们为以太坊网络贡献硬件和电力。

和比特币网络一样,矿工们有解决复杂数学问题的任务以便成功地“挖”到区块,这被称为“工作量证明(POW)”。一个运算问题如果在算法上解决比验证解决方法需要更多数量级的资源,那么它就是工作证明的极佳选择。为防止比特币网络中已经发生的,专门硬件(例如特定用途集成电路ASIC)造成的中心化现象,以太坊选择了难以存储的运算问题。如果问题需要存储器和CPU,事实上理想的硬件是普通的电脑。这就使以太坊的工作量证明具有抗特定用途集成电路性,和比特币这种由专门硬件控制挖矿的区块链相比,能够带来更加去中心化的安全分布。

以太坊基础使用指南

以太坊上线之前计划的初始开发路线图主要有以下几个里程碑: 
1. 预发布:Olympic testnet —— 2015年5月 
2. 发布第一版:Frontier —— 2015年7月30日 
3. 发布第二版: Homestead —— 2016年3月14日(π日) 
4. 发布第三版: Metropolis —— 预计2017年上半年 
5. 发布第四版:Serenity——未知

通过本节可以获取用户参与以太坊项目中的基本方法。首先,要想成为网络中的节点,需要运行一个以太坊客户端。

以太坊客户端的选择与安装

为什么有多个以太坊客户端? 
以太坊客户端与Java虚拟机和.NET运行环境类似,能够让你在电脑上运行“以太坊程序”。以太坊客户端按照书面说明(黄皮书)执行,可以彼此协作,因此,你可以使用Go、C++、Java等熟悉的语言来参与以太坊网络。

项目早期,在众多不同的操作系统中就有多个可以彼此协作的客户端实现,客户端的多样性对于整个生态系统来说是巨大的成功。它使我们能够证明协议是明确清晰的,为后续创新打开了空间,也让我们都保持诚实。但是对终端用户来说,没有通用的“以太坊安装程序”可供他们使用,可能引起他们的困惑。

进入到Homestead阶段以后,Go客户端占据了主导地位,但情况并不一直是这样,将来也说不定。除了EthereumH,其他客户端都有Homestead兼容的版本。目前有8种客户端:C++、Go、Python、Java、JavaScript、Haskell、Rust、Ruby。

公有链、联盟链、私有链

当今大多数以太坊项目都选择了以太坊公有链,公有链可以接触到更多用户、网络节点、货币和市场。但有些领域则更偏好私有链或联盟链(在一群值得信任的参与者中)。例如,银行、保险领域的很多公司都希望以太坊作为他们私有链的平台。

三种区块链在许可方面的区别:

  1. 公有链:所有人都可以阅读和发送交易,合法信息都会被包括在内。任何人都能参与到共识形成过程——决定在链条上添加什么区块以及现状是怎样的。作为中心化或准中心化信任的替代品,公有链受加密经济的保护,加密经济是经济激励和加密验证的结合,用类似工作量证明或权益证明的机制,遵循的总原则是人们影响共识形成的程度与他们能够影响的经济资源数量成正比。这类区块链通常被认为是“完全去中心化”。

  2. 联盟链:共识形成过程由预先选择的一系列的节点所掌控,例如,设想一个有15个金融机构的团体,每个机构都操作一个节点,为了使区块生效,其中的10个必须签署那个区块。阅读区块链的权利可能是公开的,或仅限于参与者,也有混合的路径,比如区块的根哈希和应用程序编程接口一起公开,使公共成员可以进行一定量的查询,重获一部分区块链状态的加密证明。这类区块链被认为是“部分去中心化”。

  3. 私有链:写入权限对一个组织保持中心化。读权限可能是公开的或者限制在任意程度。应用很可能包含对单个公司内部的数据库管理,审查等,因此公共的可读性在很多情况下根本不必要,但在另一些情况下人们又想要公共可读性。

在未来的区块链行业解决方案领域,联盟链可能会扮演很重要的角色。

以太坊账户管理

账户在以太坊中发挥着中心作用。前面我们讲了共有两种账户类型:外部和合约账户。这里重点讲一下外部账户,以下会简称为账户。如果我们把以太坊限制为只有外部账户,只允许外部账户之间进行交易,我们就会进入到“代币”系统,这样就类似于一个比特币网络。

钥匙文件

每个账户都由一对钥匙定义,一个私钥和一个公钥。 账户以地址为索引,地址由公钥衍生而来,取公钥的最后20个字节。每对私钥和地址都编码在一个钥匙文件里。钥匙文件是JSON文本文件,可以用任何文本编辑器打开和浏览。钥匙文件的关键部分是账户私钥,通常用你创建帐户时设置的密码进行加密。钥匙文件可以在以太坊节点数据目录的keystore子目录下找到,一定要确保经常给钥匙文件备份。

创建钥匙和创建帐户是一样的,在此过程中: 
1. 不必告诉任何人你的操作 
2. 不必和区块链同步 
3. 不必运行客户端 
4. 不必连接到网络

当然新账户不包含任何以太币,但它将会是你的,大可放心,没有你的钥匙和密码,没有人能进入。转移备份整个目录或任何以太坊节点之间的个人钥匙文件都是安全的。

创建账号

使用geth account new 
一旦安装了geth客户端,创建账号就只在终端执行 geth account new指令就可以了。 
注意不必运行geth客户端或者和区块链同步来使用geth account指令。

$ geth account new 
Your new account is locked with a password. Please give a password. Do not forget this password. 
Passphrase: 
Repeat Passphrase: 
Address: {168bc315a2ee09042d83d7c5811b533620531f67}

警告:记住密码并“备份钥匙文件”。你必须同时有钥匙文件和密码才能从账号发送交易,包括发送以太币。确保钥匙文件有个备份并牢记密码,尽可能安全地存储它们。如果钥匙文件丢失或忘记密码,就会丢失所有的以太币。没有密码不可能进入账号,也没有忘记密码选项,所以一定不要忘记密码。

要列出目前在你的keystore文件夹中的钥匙文件的所有账号,使用geth account指令的list子指令:

$ geth account list 
account #0: {a94f5374fce5edbc8e2a8697c15331677e6ebf0b} 
account #1: {c385233b188811c9f355d4caec14df86d6248235} 
account #2: {7f444580bfef4b9bc7e14eb7fb2a029336b07c9d}

使用geth控制台 
也可以通过控制台创建新账号,我们必须先在控制台模式开启geth

geth console 2>> file_to_log_output

控制台使你能够通过发出指令与本地节点互相作用。比如,试一下这个列出账号的指令:

eth.accounts 
{ 
code: -32000, 
message: “no keys in store” 
}

这就表明你没有账号。你可以从控制台创建一个账号:

personal.newAccount() 
Passphrase: 
Repeat passphrase: 
“0xb2f69ddf70297958e582a0cc98bce43294f1007d”

我们刚刚创建了第一个账号。如果再次试着列出账号,就可以看到新创建的账号了。

eth.accounts 
[“0xb2f69ddf70297958e582a0cc98bce43294f1007d”]

案例演示:通过命令行做转账操作 
安装完以太坊客户端,就可以使用命令了,以Go语言客户端为例。 
查看帮助命令:

geth –h

列出账户:

geth account list

指定目录启动一个节点:

geth –datadir “~/ethdev” —dev

进入控制台:

geth –dev console 2>> file_to_log_output

列出账户:

eth.accounts

指定密码为123456,创建一个账户

personal.newAccount(‘123456’) 
eth.accounts

创建第二个账户

personal.newAccount(‘123456’) 
eth.accounts

取出第一个账户,赋值给user1

user1 = eth.accounts[0]

取出第二个账户,赋值给user2

user2 = eth.accounts[1]

查看user1初始余额

eth.getBalance(user1) 
0

查看user2初始余额

eth.getBalance(user2) 
0

查看当前区块号

eth.blockNumber 
0

启动挖矿

miner.start()

查看当前区块号

eth.blockNumber

查看user1当前余额

eth.getBalance(user1)

查看user2当前余额

eth.getBalance(user2)

停止挖矿

miner.stop()

查看当前区块号

eth.blockNumber

user1转账给user2(会报错,请看下一步)

eth.sendTransaction({from: user1, to: user2, value: web3.toWei(3, “ether”)})

转账涉及到资金支出,需要提供密码解锁转出账户

personal.unlockAccount(user1, “123456”)

重新执行转账操作:

eth.sendTransaction({from: user1, to: user2, value: web3.toWei(3, “ether”)})

转账成功以后,查看user1和user2余额

eth.getBalance(user1) 
eth.getBalance(user2)

好了,一个完整的命令行转账功能就完成了。

15分钟编写一个区块链Web应用:truffle开发入门

以太坊是区块链开发领域最好的编程平台,而truffle是以太坊最受欢迎的一个开发框架。实战是最重要的事情,这一节不讲原理,只搭建环境,并运行一个区块链程序。 
【安装truffle】

$ npm install -g truffle

【依赖环境】 
访问https://nodejs.org 官方网站下载安装NodeJS 
推荐Mac OS 系统,不建议使用Windows,会碰到各种各样的问题,导致放弃。 
需要安装Ethereum客户端来支持JSON RPC API调用开发环境,推荐使用EthereumJS TestRPC: https://github.com/ethereumjs/testrpc 
安装命令:

$ npm install -g ethereumjs-testrpc

【新建第一个项目】

mkdirzhaoxi cd zhaoxi 
$ truffle init

默认会生成一个MetaCoin的demo,可以从这个demo中学习truffle的架构 
项目一级目录结构如下: 
/Users/bob/workspace/zhaoxi/ 
▶ app/ 
▶ contracts/ 
▶ migrations/ 
▶ test/ 
truffle.js 
项目所有文件目录如下: 
/Users/bob/workspace/zhaoxi/ 
▼ app/ 
▼ images/ 
▼ javascripts/ 
app.js 
▼ stylesheets/ 
app.css 
index.html 
▼ contracts/ 
ConvertLib.sol 
MetaCoin.sol 
Migrations.sol 
▼ migrations/ 
1_initial_migration.js 
2_deploy_contracts.js 
▼ test/ 
metacoin.js 
truffle.js 
【编译项目】

$ truffle compile 
bob@192 zhaoxi % truffle compile 
Compiling ConvertLib.sol… 
Compiling MetaCoin.sol… 
Compiling Migrations.sol… 
Writing artifacts to ./build/contracts

【部署项目】 
部署之前先启动TestRPC

$ testrpc

$ truffle deploy 
bob@192 zhaoxi % truffle migrate 
Running migration: 1_initial_migration.js 
Deploying Migrations… 
Migrations: 0x43d6a4e2196dcc73fe146edc73d2ebd8f15b5a7a 
Saving successful migration to network… 
Saving artifacts… 
Running migration: 2_deploy_contracts.js 
Deploying ConvertLib… 
ConvertLib: 0x57625b35460974b61c5e2862f1fcb463e2500b7b 
Linking ConvertLib to MetaCoin 
Deploying MetaCoin… 
MetaCoin: 0xd90058c2b73fa50403b1368d2f48c601576b8b40 
Saving successful migration to network… 
Saving artifacts…

【启动服务】

$ truffle serve



原文发布时间为:2018年02月17日
本文作者:区块链大本营
本文来源:CSDN区块链大本营,如需转载请联系原作者。

目录
相关文章
|
17天前
|
前端开发 JavaScript 关系型数据库
从前端到后端:构建现代化Web应用的技术探索
在当今互联网时代,Web应用的开发已成为了各行各业不可或缺的一部分。从前端到后端,这篇文章将带你深入探索如何构建现代化的Web应用。我们将介绍多种技术,包括前端开发、后端开发以及各种编程语言(如Java、Python、C、PHP、Go)和数据库,帮助你了解如何利用这些技术构建出高效、安全和可扩展的Web应用。
|
25天前
|
存储 传感器 监控
未来智能城市中的区块链技术应用
随着城市化进程不断加速,智能城市成为了未来城市发展的主要趋势之一。区块链技术作为一种去中心化、安全可靠的数据传输和存储方式,将在智能城市建设中发挥关键作用。本文将探讨区块链技术在智能城市中的应用场景,并分析其对城市管理、信息共享和安全保障等方面的积极影响。
15 2
|
1天前
|
存储 中间件 Go
探索Gin框架:快速构建高性能的Golang Web应用
探索Gin框架:快速构建高性能的Golang Web应用
|
1天前
|
前端开发 JavaScript Java
前端与后端:构建现代Web应用的双翼
前端与后端:构建现代Web应用的双翼
|
1天前
|
安全 前端开发 JavaScript
在Python Web开发过程中:Web框架相关,如何在Web应用中防止CSRF攻击?
在Python Web开发中防范CSRF攻击的关键措施包括:验证HTTP Referer字段、使用CSRF token、自定义HTTP头验证、利用Web框架的防护机制(如Django的`{% csrf_token %}`)、Ajax请求时添加token、设置安全会话cookie及教育用户提高安全意识。定期进行安全审计和测试以应对新威胁。组合运用这些方法能有效提升应用安全性。
6 0
|
7天前
|
存储 供应链 安全
《区块链简易速速上手小册》第7章:区块链在其他行业的应用(2024 最新版)
《区块链简易速速上手小册》第7章:区块链在其他行业的应用(2024 最新版)
23 1
|
10天前
|
缓存 负载均衡 数据库
优化后端性能:提升Web应用响应速度的关键策略
在当今数字化时代,Web应用的性能对于用户体验至关重要。本文探讨了如何通过优化后端架构和技术手段,提升Web应用的响应速度。从数据库优化、缓存机制到异步处理等多个方面进行了深入分析,并提出了一系列实用的优化策略,以帮助开发者更好地应对日益增长的用户访问量和复杂的业务需求。
15 1
|
10天前
|
缓存 监控 数据库
Flask性能优化:打造高性能Web应用
【4月更文挑战第16天】本文介绍了提升Flask应用性能的七大策略:优化代码逻辑,减少数据库查询,使用WSGI服务器(如Gunicorn、uWSGI),启用缓存(如Flask-Caching),优化数据库操作,采用异步处理与并发(如Celery、Sanic),以及持续监控与调优。通过这些手段,开发者能有效优化Flask应用,适应大型或高并发场景,打造高性能的Web服务。
|
11天前
|
数据库 开发者 Python
Python中使用Flask构建简单Web应用的例子
【4月更文挑战第15天】Flask是一个轻量级的Python Web框架,它允许开发者快速搭建Web应用,同时保持代码的简洁和清晰。下面,我们将通过一个简单的例子来展示如何在Python中使用Flask创建一个基本的Web应用。
|
13天前
|
供应链 安全 物联网
未来交织:区块链、物联网和虚拟现实的技术革新与融合应用
【4月更文挑战第13天】 在数字化时代的浪潮中,新兴技术正以前所未有的速度重塑着世界。本文将深入分析区块链技术的去中心化信任机制、物联网(IoT)的智能连接网络,以及虚拟现实(VR)的沉浸式体验如何独立发展并开始交汇融合,共同构建一个更加智能、安全和互动的未来。我们将探讨这些技术的发展趋势,揭示它们在各行各业的潜在应用场景,并讨论它们如何联合起来推动第四次工业革命。