区块链编程初学者指南

区块链编程初学者指南

在了解区块链的工作原理时,我遇到了很多问题。 重要的是“如何在其上构建应用程序?” 经过数周的挖掘,阅读和尝试,终于得到了它。 我找不到简短而全面的指南。 现在,我有了一些不错的理解,我想到了写一篇可以帮助他人的书。 这是一个光速指南,为了简化学习曲线,我仅保留了重要的部分。

区块链编程初学者指南

章节

  1. 区块链的目的
  2. 区块链是如何发明的?
  3. 以太坊和智能合约简介
  4. 在以太坊上编程智能合约
  5. 未来之路

区块链的目的

区块链编程初学者指南

Roopa居住在德里的偏远地区之一。 印度政府每月都分配很少的粮食资源。 由于她属于BPL(贫困线以下)类别。 政府使用中间人来分发这些粮食资源。 分配的食物资源中只有三分之一到达了Roopa之类的人,其余的则由中间人出售以牟取暴利。

莎拉(Sara)创作小说,并在亚马逊上出版。 她很沮丧,因为亚马逊收取了销售额的50%作为佣金。 这是不公平的,因为仅她一个人就投入了写作和营销工作。

区块链编程初学者指南

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

区块链编程初学者指南

由于计算机没有偏见,因此它们既不需要金钱也不不需要电力。 那是中村聪(Satoshi Namakato)在2008年使用区块链技术发明比特币时的想法。

区块链是如何发明的?

区块链编程初学者指南

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

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

区块链编程初学者指南

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

货币的下一个发展必须解决以下问题。

  1. 它不应与中央实体一起存储。
  2. 它需要高度安全。
  3. 它应该确保隐私。

由于法定货币由政府控制,中本聪别无选择,只能发明一种新的货币(比特币)。 他借助对等网络和加密技术解决了这些问题。

分权化

区块链编程初学者指南
积分: xkcd

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

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

中本聪采用了这项技术,因为它以分散的方式存储金钱。 没有任何一个实体可以控制它。

密码学

区块链编程初学者指南
积分: xkcd

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

公钥和私钥是一组长字符,它们在数学上是相连的。 公钥像您的用户名一样是公钥,私钥是像您的密码一样的秘密。

一条消息是您要授权的信息,例如:“ 我授权您向约翰支付100美元 ”。

如果输入带有公共**,私有**和消息的算法。 密码算法将产生签名。 那是该消息内容所特有的另一组字符。

 Public Key 
-----BEGIN EC PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE50uE+YSxqDgMkFByhpcgTVqXCqHO h68Ljt1z0jklDff/WV7xo+U6o3REBtK/C0/LM+Ef3FB3wR9aXMGNMLb9EA== -----END EC PUBLIC KEY-----
 Private Key 
-----BEGIN EC PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgwqIsXl9FqsgrzMdx axI6flBwWIev0Z7i+WF4j8BGnrKhRANCAATnS4T5hLGoOAyQUHKGlyBNWpcKoc6H rwuO3XPSOSUN9/9ZXvGj5TqjdEQG0r8LT8sz4R/cUHfBH1pcwY0wtv0Q -----END EC PRIVATE KEY-----
 Message
Hello World
 Signature
B0A9A4F641D3A2E3A65576B7311DCD62ABE78BBF4D3F5FE856598508E24FCB2E6F0277C2F8D57E9E2E108B7C493986E783F5316B8046597019951669B4EE6922

为了验证该消息,必须输入公共**,消息和签名。 密码算法可以验证消息是否由公钥所有者签名。

**密码算法将花费1000多年。 由于我们的计算限制,无法更快地完成此操作。 未来的量子计算机可能会对此提出挑战。 但是,比特币系统可以升级以确保安全性。

中本聪在他的系统中加入了加密技术,以帮助人们通过钱包进行比特币交易授权。

隐私

区块链编程初学者指南
积分: xkcd

您通过生成钱包(公用**/专用**)注册到比特币。 系统不会收集诸如电子邮件ID,全名等信息。因此,除非您宣布公开**,否则您是匿名的。

把它放在一起

中本聪利用密码学和对等网络建立了一个共享的分类帐。 当某人向某人发送比特币时,消息将被加密签名并广播给网络中的所有人。 他们更新其分类帐,因此网络中的每个人都知道谁拥有什么。

区块链

区块链编程初学者指南

每十分钟将事务分组到一个块中,并链接回先前的块。 这个过程形成了一个连续的区块链。 挖掘是一个确认块的过程,这涉及网络中的计算机来解决数学问题。 解决问题的第一台计算机/矿工是凭空制作的比特币获得奖励的。

确认该块并将其添加到网络后,它将在整个网络中复制。 区块链是在制作自主比特币系统的过程中发明的,该系统无需人工干预即可确认交易。 如果您正在寻找有关区块链的简化解释,那么这里有个故事。

以太坊和智能合约简介

区块链编程初学者指南

之前我们讨论过用自治系统代替中间人。 这可以通过编程来完成。 比特币的系统对人们来说很难编码自治系统。

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

区块链编程初学者指南

在智能合约中,我们可以对条件进行编程。 如果要建立分散的书店。 您编写说明以帮助作者添加新书,一旦客户进行交易,就将下载链接发送到电子书等。

智能合约不仅可以存储条件,还可以存储数据。 去中心化书店的智能合约本身就存储着书的清单,购买等。

区块链编程初学者指南

但是,我们应该承认智能合约的局限性。 某些系统需要人工支持,而计算机则无法处理。 在现实世界中,实现智能合约并不容易。 智能合约一旦发布就无法更改,愚蠢的错误可能会造成巨大的损失。

在以太坊上编程智能合约

区块链编程初学者指南
积分: xkcd

我们将建立一个简单的智能合约来存储和检索学生的成绩。 我们将扎实地编写合同。 这是github repo

pragma solidity ^0.4.18;
contract Grades{
}

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

区块链编程初学者指南

我们需要在合同中存储两件事,即学生姓名和他们的成绩。 因此,我们将创建一个数组来存储学生姓名,并创建一个关联数组来存储他们的成绩。

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

现在,我们将创建一种方法,通过该方法可以发送合同,学生姓名列表。 我们将在构造函数中执行此操作。

pragma solidity ^0.4.18;
contract Grades{
mapping (bytes32 => string) public grades;
bytes32[] public studentList;
function Grades(bytes32[] studentNames) public {
studentList = studentNames;
}
}

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

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

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 ”函数将学生姓名作为参数,从关联数组返回相应的成绩。

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的命令。

npm install ganache-cli [email protected] solc
node_modules/.bin/ganache-cli

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

让我们编译代码。

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

现在,让我们部署智能合约。 在区块链上部署合同将耗费您大量的汽油,这是为了奖励将计算能力租给您的人们。 因此,我们必须指定您愿意分配的气体量。 您可以使用气体计算器来估算。 但是,您不必立即付款,因为您是在个人区块链上进行部署,并且正在使用您的资源。 在公共以太坊区块链上部署合同时,您将需要付费。

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 '函数检查它是否已更新。

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

恭喜,您已经部署了智能合约。 如果您有任何疑问/疑问,请对此故事发表评论,我将回覆或更新此故事。

未来之路

您可以在以下网站上深入了解如何编写以太坊智能合约。

加密僵尸

您无需下载任何内容,可以在其交互式编译器上编写代码。 您将通过构建游戏来学习稳定性编程的概念。 它是免费的。

扎斯特林

Zastrin提供免费和付费课程。 Mahesh Murthy涵盖了所有重要方面。 他们甚至教会您建立类似于eBay的分散市场。

拍手请????,谢谢????。 关注我们 Hackernoon 和我( Febin John James )以获取更多故事。

我希望撰写更多有关在区块链上构建应用程序的系列文章。 你可以给我 买杯咖啡 来养活我

区块链编程初学者指南

From: https://hackernoon.com/a-beginners-guide-to-blockchain-programming-4913d16eae31