Pages

Monday, 26 July 2021

开源免费的去中心化数据库gun

 GUN(详情请见http://gun.eco)是一个开源免费的去中心化数据库,内置网络安全协议,其数据是有安全保障的。接下来我将演示如何用GUN简便地创建去中心化应用程序。首先,我们可以把两个浏览器看作两台设备,只需输入单词“Hello World”并在两个设备间进行运算,就能创建“Hello World”应用程序。你可能觉得,制作去中心化的应用程序一定需要复杂的代码,或一些特殊软件之类的;但对我来说,设计一个容易上手的工具至关重要。例如,这个名为“being paste tool”(图三)去中心化的应用只有17行代码。我选用的javascript前端工具是jQuery,除此之外,你也可以用其他javascript前端工具替代它。因为我已经在我的电脑本地安装了GUN,所以我可以直接在代码中引用(reference)它。

要启动名为GUN的数据库,首先要确保它连接到网络中的各个节点。例如,因为GUN可以在用户电脑上和手机上运行,我的电脑本身首先就可以是一个结点。你可能认为GUN结点就像一种比特币节点,但其实,因为使用CRDT算法的GUN设备负担很小(lightweight)且容易扩展规模,所以它不存在正在运行的工作量证明。此外,我们还可以连接到互联网上其他的节点,例如你朋友的笔记本电脑——如果你知道他的IP地址的话。但是因为互联网防火墙,通常我们不能在没有“协调结点(Coordinating Peer)”的情况下直接与其他计算机对话。

“协调节点”或者所谓的“中继点(Relay Peer)”不是中心化的。任一GUN节点都是中继点,包括其他浏览器。在MASK.IO造成的大量的网络流量拥堵的故事中,浏览器将所有数据中继回其他多个中继点,这些中继点由于数据暴增产生了拥堵。有机会我会把这则有趣的故事再细细告诉大家,但总而言之,这些中继点中因为互联网防火墙会自动连接到其他节点,如果你有两个浏览器,可以将这两个浏览器通过web rtc彼此连结。Web rtc是一种“浏览器到浏览器”的技术,也是其他使用网络接口连接两个浏览器的技术通过中继点。总之,我们可以把中继点视为WiFi路由器,WiFi路由器获取信息,将信息沿正确方向传递。如果你只有一个路由器,那么它就是中心化的,但是如果你有很多的话,它就是去中心化的。在去中心化的系统中,任何节点都可以掉线,即使掉线,系统的其余部分仍可以正常工作。总之,我们的第一步是连接到一个去中心化网络,而下一个步则是交互代码。

这个例子中,我使用的是jQuery,它会捕捉到文本区域内发生的所有更改。当有人输入一条新消息时,它不会要求我们去数据库中查找,而是查找“测试”记录(“test record”)后遍“测试”记录并获得“paste”属性 。我们正在尝试构建一个简单的复制粘贴工具,它可以让我们轻松地在不同的设备上复制信息。一旦进入了我们想要放在GUN数据库记录内的数据,一旦我们在所有连接了去中心化应用的计算机上调用下一行,所有设备都将自动被调用。他们会说:“嘿,我想听从对应粘贴连接测试的所有数据变化”。那么,我们就可以将接收到的数据通过去中心化网络进行同步,再将其放回文本区——创建一个分散的应用程序就是这么简单。

接下来,我要在这里创建一个用户。用户注册后我的后台出现了任务清单,一旦我添加待办事项,它就会自动识别,让同一帐户下的其他登录用户后台也出现该待办事项。这真是太棒了!因为,请看,密码错误就不能登录该系统,而用不同的用户登录则会得到一个不同的用户列表。也许我们都以为创建一个像这样的去中心化应用程序非常困难和复杂,但它其实只包含52行代码。如果你使用 UI 库,代码可能会更少。在这个新的 UI 库(图五)中,有一些基本的 HTML用于创建和登录用户的登录表单,以及用于输入待办事项的表单,也有我想要展示的列表。这里现在包含了GUN,也包括了SEA——它代表安全,加密,授权。SEA包含的代码让我们只需几行代码就可以创建经过加密验证的端对端加密用户。

我们现在再过一遍像之前那样初始化数据库。gun.user(图六)提供了一个我们能使用的账户。当有人点击注册表单时,屏幕会显示“创建一个新用户”。我们通过了这个用户名和密码——这可能会让很多习惯在其他系统中使用区块链的人感到有些困惑,因为大家都认为用户名和密码是不安全的,你是对的,它们是不安全的;然而这种技术非常酷的一点是,它在加密安全的基础上为你创建了一个公钥,它是加密且安全的。然后,系统尝试将其与正常的用户名和密码组合进行分别的关联。

我们保证安全的方法是记录密码。拿到密码后,我们使用三种加密方法来确保它受到保护。有一种名为PBDK2的算法,它会使用一个普通密码并将其与salt结合。生成此密钥需要大量的时间和计算机资源,这就是现在用来加密的密码,类似于对称加密中的AES密钥(图七)或非对称加密中的私钥。PBDK2接受任何正常的,我们认为不安全的密码,它对它们进行运算,以创建用于保护和登录到我们系统密钥的加密安全系统。之所以说它安全,是因为如果黑客试图使用gas暴力攻击我们的系统 ,他们将花费50到100年的时间来猜出这个密码。因为在额外的时间里,系统为每一个gas增加了额外的工作量。我们制作了一个卡通视频来展示这些加密算法是如何工作的,你可以去gun.eco/docs/SEA查看视频。

然后是快速查看此应用程序的案例“user.auth”,它有登录功能。现在我们想要通过用户名和密码登录到我们中心化的加密安全帐户,所以在登录后,我们要隐藏我们的登录表单。你可以通过.map转换数据来得到.map待办事项列表,但我们希望保持数据不变,将其传递给UI输出并显示到屏幕上。当用户提交待办事项(To Do)时,我们希望确保找到该用户,访问该数据库上的“Set”属性或“To Do”属性,然后我们可以“set”这些内容。“set”像数学集合(mathematical set),它的工作原理就像一张桌子或一个集合体,我们可以把一个项目或某组东⻄添加到表中。只需53行代码,你就可以创建加密安全的多用户协同应用。


最后我想展示的是克隆TikTok项目。我现在要把“A Big Bunny”这支视频放进数据库里,它不仅可以在标签上同步,还可以拖放视频、照片和歌曲到数据库中,在应用程序之间同步。你可能认为这个简单的例子要求大量的代码,但其实只需34行代码就可以实现它。大家可以在我们的网站和Github上和我们讨论这个项目。

总而言之,我们已经回顾和演示了加密算法的运作,解释了这项技术背后算法。最后,我还想说一说我们未来的发展方向。既然我们已经创建了一个可扩展到数千万用户的去中心化网络,现在急需被关注的就不只是技术,还有系统的心理学或经济学。我们的计划是创造一系列电子游戏,让人们在一种新型的社交网络上一起玩。这一系列的电子游戏本身将会是去中心化的。如果你有兴趣帮助我们构建去中心化网络的未来并参与其中,就请加入我们的社区吧!

谢谢!我是Mark Nadal,GUN数据库的作者和创建者。作为一家试图为每个人创造更好的去中心化未来的公司,我们希望创造一个全新的纪元。谢谢各位!

from https://www.caa-ins.org/archives/7511

-----

https://gun.eco/

https://gun.eco/docs/

https://gun.eco/docs/SEA

https://github.com/amark/gun

------

An open source cybersecurity protocol for syncing decentralized graph data.

gun.eco/docs

GUN is an ecosystem of tools that let you build community run and encrypted applications.

Currently, Internet Archive and HackerNoon run GUN in production.

Decentralized alternatives to ZoomRedditSlackYouTubeWikipedia, etc. have already pushed terabytes of daily P2P traffic on GUN. We are a friendly community creating a free fun future for freedom:

The ecosystem is one nice stack of technologies that looks like this: (names -> use case)

For now, it is best to start with GUN and just use it to learn the basics, since it is so easy: (or want to read more? Skip ahead to the "What is GUN?" section.)

Quickstart

  • Try the interactive tutorial in the browser (5min ~ average developer).
  • Or npm install gun and run the examples with cd node_modules/gun && npm start (5min ~ average developer).

Note: If you don't have node or npm, read this first. If the npm command line didn't work, you may need to mkdir node_modules first or use sudo.

<script src="https://cdn.jsdelivr.net/npm/gun/gun.js"></script>
<script>
// var Gun = require('gun'); // in NodeJS
// var Gun = require('gun/gun'); // in React
var gun = Gun();

gun.get('mark').put({
  name: "Mark",
  email: "mark@gunDB.io",
});

gun.get('mark').on(function(data, key){
  console.log("update:", data);
});
</script>
  • Or try something mind blowing, like saving circular references to a table of documents! (play)
var cat = {name: "Fluffy", species: "kitty"};
var mark = {boss: cat};
cat.slave = mark;

// partial updates merge with existing data!
gun.get('mark').put(mark);

// access the data as if it is a document.
gun.get('mark').get('boss').get('name').once(function(data, key){
  // `val` grabs the data once, no subscriptions.
  console.log("Mark's boss is", data);
});

// traverse a graph of circular references!
gun.get('mark').get('boss').get('slave').once(function(data, key){
  console.log("Mark is the slave!", data);
});

// add both of them to a table!
gun.get('list').set(gun.get('mark').get('boss'));
gun.get('list').set(gun.get('mark'));

// grab each item once from the table, continuously:
gun.get('list').map().once(function(data, key){
  console.log("Item:", data);
});

// live update the table!
gun.get('list').set({type: "cucumber", goal: "scare cat"});

Want to keep building more? Jump to THE DOCUMENTATION!

What is GUN?

First & foremost, GUN is a community of the nicest and most helpful people out there. So I want to invite you to come tell us about what you are working on & wanting to build (new or old school alike! Just be nice as well.) and ask us your questions directly. :)

On that note, let's get some official shout outs covered first:

Support

Thanks to:

Robert HeesselsLorenzo ManganiNLnet FoundationSam LiuDaniel DombrowskyVincent WooAJ ONealBill OttmanMike LangeSean MathesonAlan MimmsDário FreireJohn WilliamsonRobin BronElie MakhoulMike StaubBradley MatusiakJeff CookNicoAaron Artille

History

GUN was created by Mark Nadal in 2014 after he had spent 4 years trying to get his collaborative web app to scale up with traditional databases.

After he realized Master-Slave database architecture causes one big bottleneck, he (as a complete newbie outsider) naively decided to question the status quo and shake things up with controversial, heretical, and contrarian experiments:

The NoDB - no master, no servers, no "single source of truth", not built with a real programming language or real hardware, no DevOps, no locking, not just SQL or NoSQL but both (all - graphs, documents, tables, key/value).

The goal was to build a P2P database that could survive living inside any browser, and could correctly sync data between any device after assuming any offline-first activity.

Technically, GUN is a graph synchronization protocol with a lightweight embedded engine, capable of doing 20M+ API ops/sec in just ~9KB gzipped size.

Documentation

API reference

Tutorials

Examples

GraphQL

Electron

React & Native

Vue

Svelte

Webcomponents

CAP Theorem Tradeoffs

How Data Sync Works

How GUN is Built

Crypto Auth

Modules

Roadmap

This would not be possible without community contributors, big shout out to:

ajmeyghani (Learn GUN Basics with Diagrams)anywhichway (Block Storage)beebase (Quasar)BrockAtkinson (brunch config)Brysgo (GraphQL)d3x0r (SQLite)forrestjt (file.js)hillct (Docker)JosePedroDias (graph visualizer)JuniperChicago (cycle.js bindings)jveres (todoMVC)kristianmandrup (edge)Lightnet (Awesome Vue User Examples & User Kitchen Sink Playground); lmangani (Cytoscape VisualizerCassandraFastifyLetsEncrypt)mhelander (SEA)omarzion (Sticky Note App); PsychoLlama (LevelDB); RangerMauve (schema)robertheessels (gun-p2p-auth)rogowski (AXE)sbeleidysbiaudet (C# Port)Sean Matheson (Observable/RxJS/Most.js bindings)Shadyzpop (React Native example)sjones6 (Flint); RIP Stefdv (Polymer/web components)zrrrzzt (JWT Auth)xmonader (Python Port);

I am missing many others, apologies, will be adding them soon! This list is infintiely old & way out of date, if you want to be listed in it please make a PR! :)

Testing

Tests may be run with npm test. Tests will trigger persistent writes to the DB, so subsequent runs of the test will fail. You must clear the DB before running the tests again. This can be done by running the following command in the project directory.

rm -rf *data*

Additional Cryptography Libraries

These are only needed for NodeJS & React Native, they shim the native Browser WebCrypto API.

If you want to use SEA for User auth and security, you will need to install:

npm install text-encoding @peculiar/webcrypto --save

Please see our React Native docs for installation instructions!

Then you can require SEA without an error:

var GUN = require('gun/gun');
var SEA = require('gun/sea');

Deploy

Note: The default examples that get auto-deployed on npm start CDN-ify all GUN files, modules, & storage.

To quickly spin up a GUN relay peer for your development team, utilize ZeetHerokuDocker, or any variant thereof DokkuFlynn.ionow.sh, etc. ! Or use all of them so your relays are decentralized too!

Zeet.co

Deploy

Heroku

Deploy

Heroku deletes your data every 15 minutes, one way to fix this is by adding cheap storage.

Or:

git clone https://github.com/amark/gun.git
cd gun
heroku create
git push -f heroku HEAD:master

Then visit the URL in the output of the 'heroku create' step, in a browser.

Now.sh

npm install -g now
now --npm amark/gun

Then visit the URL in the output of the 'now --npm' step, in your browser.

Unubo

Fork this GUN repo (Unubo only deploys from your own GitHub repo's).
Add a Node.js app, select your GUN fork, set npm start start as the command and deploy.

From the experience of genderev, this only works if you set your country to the United States.

Visit the deployed app by following the 'view app' button, in your browser.

Docker

Warning: Docker image is community contributed and may be old with missing security updates, please check version numbers to compare.

Docker Automated buil  Docker Pulls Docker Stars

Pull from the Docker Hub . Or:

docker run -p 8765:8765 gundb/gun

Or build the Docker image locally:

git clone https://github.com/amark/gun.git
cd gun
docker build -t myrepo/gundb:v1 .
docker run -p 8765:8765 myrepo/gundb:v1

Or, if you prefer your Docker image with metadata labels (Linux/Mac only):

npm run docker
docker run -p 8765:8765 username/gun:git

Then visit http://localhost:8765 in your browser.

from https://github.com/amark/gun

No comments:

Post a Comment