区块链编程初学者入门指南

我有很多问题需要了解区块链Blockchain的工作原理。重要的是“我如何在其上构建应用程序dapp?”。花了几个星期的时间挖掘,阅读和试验才最终了解。我找不到简短而全面的指南。现在,我有一些不错的理解,我想写一个可以帮助别人的。这是一个快速指南,我只保留了重要的部分,以减少学习曲线。

目录

  • 区块链的目的
  • 区块链是如何发明的
  • 以太坊和智能合约简介
  • 在以太坊上编写智能合约

区块链的目的

Roopa住在Delhi的一个偏远地区。印度政府每个月都会分配她少量的食物资源。因为她属于BPL(贫困线以下)类别。政府通过中介来分配这些食物资源。只有三分之一的食物资源可供人们使用,如Roopa,其余的则被中介出售以获取利润。

Sara写小说,她在亚马逊上发表。她很沮丧,因为亚马逊将50%的销售额作为佣金。这是不公平的,因为她一个人投入了写作和营销的努力。

问题是中介渴望权力和金钱。他们的座右铭已成为“不惜任何代价获利”,为了支持生产者和赋予穷人权力,我们需要中介采取道德行为。这几乎是不可能实现的,但是如果我们可以用自治系统取代中介呢?

由于计算机没有偏见,因此既不需要金钱也不需要权力。这可能是Satoshi Namakato在2008年使用区块链技术发明比特币时的想法。

Blockchain是如何发明的?

随着时间的推移,货币逐渐发展,每次发展都降低了生产成本,使交易更加便利。金币的生产成本很高。纸币的发明解决了这个问题。但是,在计算机和互联网的发明之后,人们找到了一种更方便,更快捷的交易方式。

为了安全地保持我们一生的收入并促进数字交易,我们需要一个中介(银行)。这使银行变得强大,他们可以对我们的提款/交易征收高额费用,出售我们的私人信息等。

银行对金钱的渴望导致了2008年的金融危机。银行未能尊重客户的隐私。他们薄弱的安全系统引发了数字欺诈。

货币的下一次演变必须解决以下问题。

  • 它不应存储在中央实体。
  • 它需要高度安全。
  • 它应该确保隐私。

由于法定货币由政府控制,Satoshi别无选择,只能发明一种新货币(比特币)。他借助点对点网络和密码学解决了这些问题。

去中心化分享权力

Torrent使用点对点技术来共享文件。torrent应用程序不会从中央服务器或单台计算机下载文件,而是连接到其网络中的人员,找出谁拥有该文件并从其计算机下载。

你可以从世界各地的不同计算机上获取文件。如果网络中的某个人离开,你的下载不会受到影响,因为还有其他人可以共享该文件。

Satoshi采用这种技术,因为它以去中心化分散的方式存储钱。任何单一实体都无法控制它。

加密

在密码学中,人们可以对消息进行数字签名。为了做到这一点,我们需要三个东西:公钥,私钥和消息。

公钥和私钥是一组数学连接的长字符。公钥就像你的用户名一样公开,私钥就像你的密码一样是秘密。

消息是你要授权的信息,例如:“我授权你向John支付100美元”。

如果你使用公钥,私钥和消息输入算法。加密算法将产生签名。这是该消息内容唯一的另一组字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Key 
-----BEGIN EC PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE50uE+YSxqDgMkFByhpcgTVqXCqHOh68Ljt1z0jklDff/WV7xo+U6o3REBtK/C0/LM+Ef3FB3wR9aXMGNMLb9EA==
-----END EC PUBLIC KEY-----

Private Key
-----BEGIN EC PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgwqIsXl9FqsgrzMdxaxI6flBwWIev0Z7i+WF4j8BGnrKhRANCAATnS4T5hLGoOAyQUHKGlyBNWpcKoc6HrwuO3XPSOSUN9/9ZXvGj5TqjdEQG0r8LT8sz4R/cUHfBH1pcwY0wtv0Q
-----END EC PRIVATE KEY-----

Message
Hello World

Signature
B0A9A4F641D3A2E3A65576B7311DCD62ABE78BBF4D3F5FE856598508E24FCB2E6F0277C2F8D57E9E2E108B7C493986E783F5316B8046597019951669B4EE6922

要验证消息,必须输入公钥,消息和签名。加密算法可以验证消息是否由公钥的所有者签名。

破解加密算法需要1000年的时间。由于我们的计算限制,这不能更快地完成。未来的量子计算机可能会挑战这一点。但是,可以升级比特币系统以确保安全性。

Satoshi在他的系统中加入了密码术,以帮助人们从他们的钱包中授权比特币交易。

隐私

你通过生成钱包(公钥/私钥)注册到比特币。系统不会收集电子邮件ID,全名等信息。因此,除非你公布你的公钥,否则你将是匿名的。

把它放在一起Satoshi使用加密技术和点对点网络构建了一个共享分类账。当有人向某人发送比特币时,会以加密方式签署一条消息并将其广播给网络中的所有人。他们更新了他们的分类账,因此网络中的每个人都知道谁拥有什么。

Blockchain

每隔十分钟,交易就会组合成一个块并链接回以前的块。这个过程产生一个连续的区块链。挖掘是确认块的过程,这涉及网络中的计算机来解决数学问题。第一个解决问题的计算机/矿工获得了凭空制造的比特币奖励。

区块确认并添加到网络后,将在整个网络中进行复制。区块链是在制作自主比特币系统的过程中发明的,该系统在没有人为干预的情况下确认了交易。如果你正在寻找区块链的简化说明,这里有一个故事

以太坊和智能合约简介

早些时候我们谈到用自治系统取代中介。这可以通过编程来完成。比特币的系统很难让人们对自治系统进行编码。

因此,Vitalik Buterin建立了一种名为以太坊的新加密货币。它不仅是一个去中心化的加密货币,而且是一个可以以智能合约的形式托管代码的计算机网络。

在智能合约中,我们可以编制条件。如果你想建立一个去中心化的书店。你编写说明以帮助作者添加新书,在客户进行交易后将下载链接发送到电子书等。

智能合约不仅存储条件,还存储数据。去中心化的书店的智能合约本身存储书籍列表,购买等。

但是,我们应该承认智能合约的局限性。有些系统需要人工支持,计算机无法处理。在现实世界中实施智能合约并不容易。一旦发布的智能合约不能改变,愚蠢的错误可能代价高昂。

在以太坊上编写智能合约

我们将建立一个简单的智能合约,存储和检索学生的成绩。我们将以合理的方式编写合约。这是github repo

1
2
3
pragma solidity ^0.4.18;
contract Grades{
}

第一行告诉编译器我们正在使用哪种版本的solidity。然后我们定义合约等级。

我们需要在合约中存储两项内容,学生姓名和成绩。因此,我们将创建一个数组来存储学生姓名和一个关联数组来存储他们的成绩。

1
2
3
4
5
pragma solidity ^0.4.18;
contract Grades{
mapping (bytes32 => string) public grades;
bytes32[] public studentList;
}

现在,我们将创建一种方式来发送合约,即学生姓名列表。我们将在构造函数中执行此操作。

1
2
3
4
5
6
7
8
pragma solidity ^0.4.18;
contract Grades{
mapping (bytes32 => string) public grades;
bytes32[] public studentList;
function Grades(bytes32[] studentNames) public {
studentList = studentNames;
}
}

在Solidity中,我们只调用一次构造函数。我们将学生名称作为参数传递,该参数将存储在我们之前声明的studentList数组中。

现在,我们需要编写一个函数来为学生分配他们的成绩。我们还需要另一个功能来检查学生是否有效。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
pragma solidity ^0.4.18;
contract Grades{
mapping (bytes32 => string) public grades;
bytes32[] public studentList;
function Grades(bytes32[] studentNames) public {
studentList = studentNames;
}
function giveGradeToStudent(bytes32 student, string grade) public {
require(validStudent(student));
grades[student] = grade;
}
function validStudent(bytes32 student) view public returns (bool) {
for(uint i = 0; i < studentList.length; i++) {
if (studentList[i] == student) {
return true;
}
}
return false;
}
}

giveGradeToStudent函数有两个参数,学生姓名和成绩。require函数检查validStudent函数是返回true还是false。如果返回false,则取消执行。

最后,我们需要编写一个函数来获取学生的成绩。getGradeForStudent函数将学生姓名作为参数,从关联数组中返回相应的成绩。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pragma solidity ^0.4.18;
contract Grades{
mapping (bytes32 => string) public grades;
bytes32[] public studentList;
function Grades(bytes32[] studentNames) public {
studentList = studentNames;
}
function giveGradeToStudent(bytes32 student, string grade) public {
require(validStudent(student));
grades[student] = grade;
}
function validStudent(bytes32 student) view public returns (bool) {
for(uint i = 0; i < studentList.length; i++) {
if (studentList[i] == student) {
return true;
}
}
return false;
}
function getGradeForStudent(bytes32 student) view public returns (string) {
require(validStudent(student));
return grades[student];
}
}

为了本教程的目的,你可以将其部署在个人区块链上。你可以用Ganache创建。以下是安装和运行ganache的命令。

1
2
npm install ganache-cli web3@0.20.3 solc
node_modules/.bin/ganache-cli

保持ganache运行,在新终端上我们将部署我们的智能合约。请将智能合约保存为Grades.sol

让我们编译代码。

1
2
3
4
node
code = fs.readFileSync('Grades.sol').toString()
solc = require('solc')
compiledCode = solc.compile(code)

现在让我们部署智能合约。在区块链上部署合约会花费你的gas,这是为了奖励那些向你租用计算能力的人。所以我们必须指定你愿意分配的gas量。你可以使用gas计算器估算。但是,你现在无需付费,因为你正在使用个人区块链进行部署,这是你正在使用的资源。在公共以太坊区块链上部署合约时,你必须付费。

1
2
3
4
5
6
Web3 = require('web3')
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
abiDefinition = JSON.parse(compiledCode.contracts[':Grades'].interface)
GradesContract = web3.eth.contract(abiDefinition)
byteCode = compiledCode.contracts[':Grades'].bytecode
deployedContract = GradesContract.new(['John','James'],{data: byteCode, from: web3.eth.accounts[0], gas: 4700000})

现在让我们调用我们的函数给我们的学生John提供成绩A +。稍后,我们将使用getGradeForStudent函数检查它是否已更新。

1
2
3
deployedContract.giveGradeToStudent('John', 'A+', {from: web3.eth.accounts[0]})
deployedContract.getGradeForStudent.call('John')
'A+'

恭喜,你已经部署了智能合约。

======================================================================

如果你希望更进一步,分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:

  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。

汇智网原创翻译,转载请标明出处。这里是原文区块链编程初学者入门指南