区块链(杂记)

2024-06-17 13:58
文章标签 区块 杂记

本文主要是介绍区块链(杂记),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

区块链

去中心化App

  1. 去中心化 github下载(Mist)
  2. Chrome插件 MetaMask
  3. 以太坊的四种钱包:Ethereum Wallet、METAMASK、 Parity Ethereum、MyEtherWallet
  4. 编辑器:Atom、Webstorm、Sublime、Vscode

在区块链上运行的程序,通常称为智能合约(Smart Contract)。所以通常会把写区块链程序改称写智能合约。

简单点来讲,合约就是运行在区块链上的一段程序。

Solidity合约结构(状态变量、局部变量、构造函数、析构函数、生命周期)

Demo 一个完整的合约

pragma solidity ^0.4.4;contract Counter {uint count = 0;address owner;function Counter() {owner = msg.sender;} function increment() public {uint step = 10;if (owner == msg.sender) {count = count + step;}}function getCount() constant returns (uint) {return count;}function kill() {if (owner == msg.sender) { selfdestruct(owner);}}
}

合约部署

要想发布我们的合约到区块链,打开Ethereum Wallet然后点击Contracts。

部署合约时,因为要往区块链写入数据,需要矿工进行验证,所以需要花费一些gas奖励给矿工,还有当我们每次调用increment方法时,也属于写入数据,同样需要花费gas,但是调用getCount方法时只是从区块链读取数据,无需验证,读取数据无须花费gas。

Solidity值类型与引用类型

值类型(Value Type)

值类型包含:

  • 布尔(Booleans)
  • 整型(Integer)
  • 地址(Address)
  • 定长字节数组(fixed byte arrays)
  • 有理数和整型(Rational and Integer Literals,String literals)
  • 枚举类型(Enums)
  • 函数(Function Types)

引用类型(Reference Types)

引用类型包含:

  • 不定长字节数组(bytes)
  • 字符串(string)
  • 数组(Array)
  • 结构体(Struts)

当函数参数为memory类型时,相当于值传递,而storage类型的函数参数将是指针传递。

案例:集资(CrowdFunding)智能合约(Smart Contract)

结构体和字典综合案例

下面的案例是一个集资合约的案例,里面有两个角色,一个是投资人Funder,也就是出资者。另一个角色是运动员Campaign,被赞助者。一个Funder可以给多个Campaign赞助,一个Campaign也可以被多个Funder赞助。

完整合约:

pragma solidity ^0.4.4;contract CrowdFunding {// 定义一个`Funder`结构体类型,用于表示出资人,其中有出资人的钱包地址和他一共出资的总额度。struct Funder {address addr; // 出资人地址uint amount;  // 出资总额}// 定义一个表示存储运动员相关信息的结构体struct Campaign {address beneficiary; // 受益人钱包地址uint fundingGoal; // 需要赞助的总额度uint numFunders; // 有多少人赞助uint amount; // 已赞助的总金额mapping (uint => Funder) funders; // 按照索引存储出资人信息}uint numCampaigns; // 统计运动员(被赞助人)数量mapping (uint => Campaign) campaigns; // 以键值对的形式存储被赞助人的信息// 新增一个`Campaign`对象,需要传入受益人的地址和需要筹资的总额function newCampaign(address beneficiary, uint goal) public returns (uint campaignID) {campaignID = numCampaigns++; // 计数+1// 创建一个`Campaign`对象,并存储到`campaigns`里面campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0);}// 通过campaignID给某个Campaign对象赞助function contribute(uint campaignID) public payable {Campaign storage c = campaigns[campaignID];// 通过campaignID获取campaignID对应的Campaign对象c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value}); // 存储投资者信息c.amount += msg.value; // 计算收到的总款c.beneficiary.transfer(msg.value);}// 检查某个campaignID编号的受益人集资是否达标,不达标返回false,否则返回truefunction checkGoalReached(uint campaignID) public returns (bool reached) {Campaign storage c = campaigns[campaignID];if (c.amount < c.fundingGoal)return false;return true;}
}

总而言之,智能合约实现上要达到的目标是:完备的业务功能、精悍的代码逻辑、良好的模块抽象、清晰的合约结构、合理的安全检查、完备的升级方案。

从业务视角来看,智能合约只需要做两件事,其一是如何定义数据的结构和读写方式,其二是如何处理数据并对外提供服务接口。

IPFS + 区块链

  1. IPFS简介

IPFS(InterPlanetary File System)是一个点对点的分布式超媒体分发协议,它整合了过去几年最好的分布式系统思路,为所有人提供全球统一的可寻址空间,包括Git、自证明文件系统SFS、BitTorrent和DHT,同时也被认为是最有可能取代HTTP的新一代互联网协议。

IPFS用基于内容的寻址替代传统的基于域名的寻址,用户不需要关心服务器的位置,不用考虑文件存储的名字和路径。我们将一个文件放到IPFS节点中,将会得到基于其内容计算出的唯一加密哈希值。哈希值直接反映文件的内容,哪怕只修改1比特,哈希值也会完全不同。当IPFS被请求一个文件哈希时,它会使用一个分布式哈希表找到文件所在的节点,取回文件并验证文件数据。

IPFS是通用目的的基础架构,基本没有存储上的限制。大文件会被切分成小的分块,下载的时候可以从多个服务器同时获取。IPFS的网络是不固定的、细粒度的、分布式的网络,可以很好的适应内容分发网络的要求。这样的设计可以很好的共享各类数据,包括图像、视频流、分布式数据库、整个操作系统、模块链、8英寸软盘的备份,还有静态网站。

IPFS提供了一个友好的WEB访问接口,用户可通过http://ipfs.io/hash 获取IPFS网络中的内容,也许在不久的将来,IPFS协议将会彻底替代传统的HTTP协议。

基于以太坊Ethereum & IPFS的去中心化Ebay区块链项目

  • 完整源码

    import React, {Component} from ‘react’;
    import ‘./App.css’;

    const ipfsAPI = require(‘ipfs-api’);
    const ipfs = ipfsAPI({host: ‘localhost’, port: ‘5001’, protocol: ‘http’});

    function Utf8ArrayToStr(array) {
    var out,
    i,
    len,
    c;
    var char2,
    char3;

    out = "";
    len = array.length;
    i = 0;
    while (i < len) {c = array[i++];switch (c >> 4) {case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:// 0xxxxxxxout += String.fromCharCode(c);break;case 12:case 13:// 110x xxxx   10xx xxxxchar2 = array[i++];out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));break;case 14:// 1110 xxxx  10xx xxxx  10xx xxxxchar2 = array[i++];char3 = array[i++];out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));break;default:break;}
    }return out;
    

    }

    class App extends Component {

    constructor(props) {super(props);this.state = {strHash: null,strContent: null}
    }saveTextBlobOnIpfs = (blob) => {return new Promise(function(resolve, reject) {const descBuffer = Buffer.from(blob, 'utf-8');ipfs.add(descBuffer).then((response) => {console.log(response)resolve(response[0].hash);}).catch((err) => {console.error(err)reject(err);})})
    }render() {return (<div className="App"><input ref="ipfsContent" style=/><button onClick={() => {let ipfsContent = this.refs.ipfsContent.value;console.log(ipfsContent);this.saveTextBlobOnIpfs(ipfsContent).then((hash) => {console.log(hash);this.setState({strHash: hash});});}}>提交到IPFS</button><p>{this.state.strHash}</p><button onClick={() => {console.log('从ipfs读取数据。')ipfs.cat(this.state.strHash).then((stream) => {console.log(stream);let strContent = Utf8ArrayToStr(stream);console.log(strContent);this.setState({strContent: strContent});});}}>读取数据</button><h1>{this.state.strContent}</h1></div>);
    }
    

    }

    export default App;

  1. 介绍

1.eBay简介

eBay,(EBAY,中文电子湾、亿贝、易贝)是一个管理可让全球民众上网买卖物品的线上拍卖及购物网站。ebay于1995年9月4日由Pierre Omidyar以Auctionweb的名称创立于加利福尼亚州圣荷西。人们可以在ebay上通过网络出售商品。

因为我们会将所有的业务逻辑和数据存储在以太坊区块链上,所以这将是一个完全去中心化的应用程序。与此同时,如果我们将所有的图片和大量文本都存储在以太坊区块链上,这将非常昂贵,甚至由于以太坊EVM的一些限制,我们根本不可能将大量的图片和文本存储到区块链。为了解决这个问题,我们将在IPFS(Inter Planetary File System)上存储大量的文本和图像。

  1. 为什么要去中心化

在我们开始构建应用程序之前,花一分钟的时间来了解在像Ethereum这样的去中心化平台上构建产品的动机。

eBay取得了巨大的成功,因为它使得买卖非常有效率。在互联网成为主流之前,人们只能在当地社区购买和出售商品,当然也可以在一定的地理范围内购物。随着越来越多的人上网,像eBay这样的公司完全可以体验整个线下购物拍卖的场景,任何人都可以在互联网上从世界任何地方买卖任何东西。 eBay对于消费者和商人都具有划时代的意义。

尽管这对大家都有好处,并且总体上改善了贸易和经济,但是它有一些缺点。

  • 参与的商人都在受到公司的相关限制:公司可以随时决定是否阻止商家自行处理交易,这对商人来说可能是一个巨大的打击。
  • 商家支付费用列出他们的产品,并支付销售佣金。付费本身并不是那么糟糕,因为eBay提供服务。然而,上市费有时太高,商家要么保证金很高,要么把这笔费用交给消费者。
  • 商家/消费者不拥有他们的任何数据。评论、购买历史等都是这些公司所有。例如,如果商家想将自己的操作转移到另一个提供商,那么导出她的评论或其他数据是几乎不可能的。

在以太坊这样的平台上构建产品解决了这些问题。商户的账户不能被封锁,数据是公开的,所以它可以很容易导出,交易费用比中心化的公司少很多很多。

  1. 项目详情

现在,您已经了解了构建此应用程序的原因以及为什么要构建这个应用程序,接下来我们来看一个高级别的,我们将在此项目中实现的所有功能。

  • 项目展示:一个网站应该允许商家列出他们的项目。我们将为任何人建立免费列出他们的项目的功能。我们会将这些项目都存储在区块链和非区块链的数据库中,以方便查询。
  • 将文件添加到IPFS:我们将添加将产品图像和产品描述(大文本)上传到IPFS的功能。
  • 浏览产品:我们将添加根据类别、拍卖时间等过滤和浏览产品的功能。
  • 拍卖:就像eBay,我们将实现维克里拍卖(Vickrey auction),即次价密封投标拍卖(Second-price sealed-bid auction)对物品进行投标。因为以太坊上的一切都是公开的,不像中心化应用程序,所以我们的实现将有所不同。我们的实现将非常类似于ENS的招标流程。
  • 托管合约:一旦投标结束,产品有赢家,我们将在买方,卖方和第三方仲裁人之间创建一个托管合同。
  • 2-of-3 数字签名:我们将通过实施2-of-3 数字签名解决方案来增加欺诈保护,其中3名参与者中的2名必须投票将资金释放给卖方或将金额退还给买方。
  1. 技术需求

要成功完成本课程,您应该对以下语言/技术有基本的了解:

  • Solidity面向对象编程:在讲解这个项目之前,我们会先给大家讲解Solidity面向对象编程基础,如何编写简单合约,部署合约,合约简单互动。
  • HTML/CSS/React:您应该对构建前端的HTML / CSS有基本的了解。
  • Javascript:我们在这个过程中广泛使用JavaScript。它在服务器端用于将数据保存到数据库并查询数据库并将结果返回到前端。前端使用Web3.js与区块链进行交互。我们尽力保持javascript代码尽可能简单,以迎合不同背景的学生。
  • Database:我们将在本课程中使用MongoDB来存储产品信息。没有必要特别了解MongoDB的知识,但是对这个过程需要对数据库有基本的了解。
  1. 项目架构

在我们开始执行代码之前,让我们来看看我们将在本课程中构建的Dapp的体系结构。

  • Web前端:Web前端是HTML,CSS和Javascript的组合(大量使用web3js)。用户将通过这个前端应用程序与区块链,IPFS和nodeJS服务器交互。
  • 区块链:这是所有代码和交易所在的应用程序的心脏。商店中的所有产品、用户出价和托管都写在区块链上。
  • MongoDB:尽管产品存储在区块链中,但是查询区块链展示产品和应用各种过滤器(仅显示特定类别的产品,显示即将过期的产品等)效率并不高。我们将使用MongoDB数据库来存储产品信息并查询它以展示产品。
  • NodeJS服务器:这是前端通过其与数据库进行通信的后端服务器。我们将公开一些简单的API来为前端查询和从数据库中检索产品。
  • IPFS:当用户在商店中列出商品时,前端会将产品文件和描述上传到IPFS,并将上传文件的散列HASH存储到区块链中。
  1. 实现步骤
  • 先通过truffle framework和Solidity实现合约代码,并将其部署到truffle develop自带的测试网络中,并且在truffle console中可以自由交互。
  • 然后我们将学习IPFS,通过命令行安装并与之交互。
  • 在后端实现完成后,我们将构建Web前端以与合约和IPFS进行交互。我们也会实现招标,揭示前端的拍卖功能。
  • 我们将安装MongoDB并设计数据结构来存储产品。
  • 数据库启动并运行后,我们将实现监听合约事件的NodeJS服务器端代码,并将请求记录到控制台。然后我们将执行代码将产品插入数据库。
  • 我们将更新我们的前端,从数据库而不是区块链中查找产品。
  • 我们将实现托管合同和相应的前端,参与者可以向买方/卖方发放或退款。

源码:https://github.com/liyuechun/IPFS-Ethereum-Image.git

这篇关于区块链(杂记)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069632

相关文章

【杂记-浅谈DHCP动态主机配置协议】

DHCP动态主机配置协议 一、DHCP概述1、定义2、作用3、报文类型 二、DHCP的工作原理三、DHCP服务器的配置和管理 一、DHCP概述 1、定义 DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,是一种网络协议,主要用于在IP网络中自动分配和管理IP地址以及其他网络配置参数。 2、作用 DHCP允许计算机和其他设备通

【区块链】区块链架构设计:从原理到实践

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 区块链架构设计:从原理到实践引言一、区块链基础概念1.1 区块链定义1.2 核心特性 二、区块链架构层次2.1 数据层2.2 网络层2.3 共识层2.4 合约层2.5 应用层 三、关键技术组件3.1

区块链会议投稿资讯CCF A--WINE 2024 截止7.15 附录用率 附录用的区块链文章

Conference:The Conference on Web and Internet Economics (WINE) CCF level:CCF A Categories:Cross-cutting/comprehensive/emerging Year:2024 Conference time: December 2-5, 2024 录用率: selected 66 p

【Rust日报】 2019-05-28:使用WASI对区块链进行通用计算

「嵌入式」Hawk-Rust系列:树莓派相机的驱动 #RaspberryPi Raspberry Pi提供了一组GPIO(通用输入/输出)引脚,允许您控制用于物理计算的电子组件并探索物联网(IoT)。 相机模块是Raspberry Pi的绝佳配件,它允许用户拍摄静态照片并以全高清录制视频。 HAWK是一个基于Rust的图像识别项目,它通过使用RFID卡进行用户识别和Image进行用户验证来实

【Linux 杂记】TOP命令

top命令用于动态显示系统中正在运行的进程的详细信息,以及系统的整体资源使用情况。以下是其主要输出解释: Header 表头信息: top:当前时间和运行时间。Tasks:进程统计信息,如总进程数、运行中、睡眠中等。CPU(s):CPU使用情况,包括总体利用率和每个CPU核心的使用率。Mem:内存使用情况,包括总内存、已使用、空闲、缓存等。Swap:交换空间使用情况,类似free命令的输出。

区块链媒体发布推广秘籍大揭秘-华媒舍

区块链技术迅猛发展,成为全球瞩目的热门领域。随之而来的是区块链媒体的兴起,成为传播和推广区块链知识、项目和应用的重要平台。本文将揭示区块链媒体发布推广的秘籍,为读者深入了解该领域提供详尽科普介绍。 一、什么是区块链媒体? 区块链媒体是指专门报道和宣传区块链技术的媒体平台。它们通过新闻报道、文章、专题访谈、社群互动等形式,向读者传递与区块链相关的信息。与传统媒体相比,区块链媒体更加专注于区块

区块链技术:金融市场监管的新篇章

一、引言         随着金融科技的迅猛发展,区块链技术作为其中的佼佼者,正逐渐改变着金融市场的格局。在金融市场监管领域,区块链技术以其独特的优势,为监管机构提供了新的监管思路和手段。本文将深入探讨区块链技术在金融市场监管中的作用,并分析其面临的挑战与前景。 二、区块链技术的特点及其在金融市场的应用         区块链技术以其去中心化、不可篡改、透明公开等特性,在金融市场中得到了

【杂记-浅谈多播地址】

多播地址 一、多播地址概述二、多播地址的结构三、多播地址的使用四、多播技术的优势与挑战 一、多播地址概述 多播地址是一种特殊的IP地址,用于网络中的一对多通信。在IP网络中,多播技术允许多个发送者发送单一数据包到多个接收者,而不需要分别发送每个数据包,这样可以显著提高网络带宽的利用率。多播地址通常用于诸如在线视频会议、直播视频流等应用场景,在这些场景下,数据包的目标地址不是单一的

【杂记-浅谈PPP协议】

PPP协议 一、PPP协议概述二、PPP协议组成三、PPP协议的特点、优势、缺点四、PPP协议的应用场景 一、PPP协议概述 PPP,Point-to-Point Protocol,即点到点协议,是一种数据链路层协议,主要用于在两点间的串行连接上传输数据。它不仅支持异步和同步传输,还能封装多种网络层协议,如IP、IPX等,这使得PPP成为一个通用的数据链路层协议。 二、PPP协

【杂记-浅谈如何根据优先级、开销值、子网掩码进行路由选择】

如何根据优先级、开销值、子网掩码进行路由选择 一、路由选择概述二、路由选择参考的要素1、优先级2、开销值3、子网掩码长度 三、路由选择过程1、子网掩码长度匹配2、优先级选择3、开销值对比 一、路由选择概述 路由选择的合理性直接影响到网络的性能和稳定性,路由选择通常依赖于路由表,路由表中包含了各种路由信息,如优先级、开销值和子网掩码长度等属性,这些属性共同决定了路由的选择和数据包