heyuan 发布的文章 - 六币之门
首页
视频教程
网站导航
活动日历
关于我们
用户投稿
推荐
新闻动态
搜 索
1
融资周报 | 公开融资事件11起;加密技术公司Toposware完成500万美元融资,Polygon联创参投
112 阅读
2
六币日报 | 九只比特币ETF在6天内积累了9.5万枚BTC;贝莱德决定停止推出XRP现货ETF计划
76 阅读
3
融资周报 | 公开融资事件27起;L1区块链Monad Labs完成2.25亿美元融资,Paradigm领投
74 阅读
4
六币日报 | 美国SEC再次推迟对灰度以太坊期货ETF做出决定;Do Kwon已出黑山监狱等待引渡
72 阅读
5
【ETH钱包开发06】查询某个地址的交易记录
55 阅读
新闻动态
每日快报
一周精选
融资情况
项目投研
自治组织
数字藏品
去中心化应用
去中心化游戏
去中心化社交
去中心化金融
区块链交易所
科普知识
小白入门
用户手册
开发文档
行业报告
技术前沿
登录
搜 索
标签搜索
新闻
日报
元歌Eden
累计撰写
1,087
篇文章
累计收到
0
条评论
首页
栏目
新闻动态
每日快报
一周精选
融资情况
项目投研
自治组织
数字藏品
去中心化应用
去中心化游戏
去中心化社交
去中心化金融
区块链交易所
科普知识
小白入门
用户手册
开发文档
行业报告
技术前沿
页面
视频教程
网站导航
活动日历
关于我们
用户投稿
推荐
新闻动态
用户登录
登录
找到
1087
篇与
heyuan
相关的结果
2023-03-24
推荐 7 个学习 Web3 的开源资源
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 29 天,点击查看活动详情Web3.0 算是下一个趋势,目前还处于新的阶段并且不断变化中。它提供了开发去中心化应用程序和使用基于区块链的技术所需的工具,还将使用人工智能和机器学习来开发更出色的应用程序。本文收藏了 7 个学习 Web3.0 相关知识的开源资源。1. full-blockchain-solidity-course-py对于 Web3.0 的初学者来说,这事一个很好的资源,这个资源包括 Solidity、区块链和智能合约的知识库,从初学者到专家级的完整课程。它是用 python 编写的。资源地址:github.com/smartcontra…2. ethereumbook书是学习任何东西的最佳资源之一,该存储仓库包含 Andreas M. Antonopoulos 和 Gavin Wood 的“掌握以太坊”书籍,可以免费阅读。这是以太坊、以太坊经典、RootStock (RSK) 和其他兼容的基于 EVM 的开放区块链操作和使用的开发者指南。资源地址:github.com/ethereumboo…3. DeFi开发者路线图该存储仓库提供精选的 Web3.0 开发人员手册,其中包括精选的顶级 DApp 开发工具、资源和使用技巧,其内容涉及区块链、智能合约、DeFi、ENS、NFT、ETH2.0、开发框架(Truffle、Ganache)资源地址:github.com/OffcierCia/…4. ZeroNet如果想要一个真实的示例,那么这算是一个很好的资源。这是一个使用比特币加密和 BitTorrent 网络的去中心化网站,用 Python 编写的。资源地址:github.com/HelloZeroNe…5. Solidity实例如果是 Solidity 新手,那么这是必须了解的资源,该网站包含一些 Solidity 的基本示例。如果不知道什么是solidity,它是一种面向对象的编程语言,可以用来实现跨不同区块链平台的智能合约。资源地址:solidity-by-example.org/6. MetaMask如果使用过加密货币,那么可能已经知道 MetaMask。这个浏览器扩展使浏览支持以太坊区块链的网站成为可能,一个便捷的数字钱包插件。资源地址:github.com/MetaMask/me…7. Rabby这个开源浏览器插件为 Defi 生态系统提供了更加用户友好和安全的多链体验。资源地址:github.com/RabbyHub/Ra…
2023年03月24日
8 阅读
0 评论
0 点赞
2023-03-24
(一)区块链的共识算法:整体介绍 及 分叉 的通俗讲解
作者:林冠宏 / 指尖下的幽灵掘金:juejin.cn/user/178526…博客:www.cnblogs.com/linguanh/GitHub : github.com/af913337456…腾讯云专栏: cloud.tencent.com/developer/u…本文不做一般入门的区块链描述讲解。着重简述讲解:区块链的分叉 共识算法 BTW:本人技术书籍《区块链以太坊DApp开发实战》现已出版并可网购了,适合初中级区块链技术相关研发人员阅读。目录前言 简单过一下区块链 通俗讲解共识 共识算法 PoW 区块链分叉 硬分叉的出现 软分叉的出现 参考 前言由于最近的开发工作是与以太坊公链相关的去中心化交易所,项目两个多月之久,对区块链相关的知识内容了解了一些,故择文以记录之,但求文字通俗易懂,无纰漏。因自身求学过程中所遇坑无数,业内良文亦少之又少,深感朦胧之懂之不爽。此外,亦坚信区块链技术未来必能大放光芒,因现在多应用于虚拟货币,故人谈区块链,内心首想皆炒币相关之内容。简单过一下区块链我们一般意识形态中的 链 是铁链,由铁铸成,一环扣一环。形象地,区块链的也可以这么理解,只不过它不是由铁铸成,而是由拥有一定数据结构的块连接而成,这是一个最简单的雏形见下图通俗讲解共识所谓共识,通俗来说,就是我们大家对某种事物的理解达成一致的意思。比如说日常的开会讨论问题,又比如判断一个动物是不是猫,我们肉眼看了后觉得像猫,其满足猫的特征,那么我们认为它是猫。共识,是一种规则。继续我们的会议例子。参与会议的人,通过开会的方式来达到谈论解决问题。对比区块链中,参与挖矿的矿工通过某种共识方式(算法)来解决让自己的账本跟其他节点的账本保持一致。让账本保持一致的深入一层意思就是,让链中区块信息保持一致。为什么需要共识,不需要可不可以?当然不可以,生活中没了共识的规则,一切乱套。区块链没了共识的规则,各个节点各干各的,失去一致的意义。这两个例子的对应的关系如下:会议的人 = 挖矿的矿工 开会 = 共识方式(算法) 谈论解决问题 = 让自己的账本跟其他节点的账本保持一致 如果你对节点的概念意思不懂,请先理解为矿工,一个节点内部包含很多角色,矿工是其中之一。共识算法目前常见的在区块链中,节点们让自己的账本跟其他节点的账本保持一致的共识方式(算法)有如下几种:PoW,代表者是比特币 (BTC) 弊端: 矿池的出现,一定程度上违背了去中心化的初衷,同时也使得51%攻击成为可能,影响其安全性。 存在巨大的算力浪费,看看矿池消耗大量的电力资源,随着难度增加,挖出的不够付电费 PoS,代表者是以太坊 (ETH),从PoW过度到PoS 弊端: 破坏者对网络的攻击成本很低,拥有代币就能竞争 另外拥有代币数量大的节点获得记账权的概率会更大,会使得网络共识受少数富裕账户支配,从而失去公正性 DPoS,代表者是柚子(EOS) 弊端: 选举固定数量的见证人作为记账候选人有可能不适合于完全去中心化的场景 在网络节点很少的场景,选举的见证人的代表性也不强. PBFT 拜占庭容错,联盟链中常用 弊端: 不适合公有链,适合联盟链 下面通俗讲解下每种共识算法的概念,注意!是概念,非代码层面的详细实现。PoW它的全称是:Proof of Work 工作量证明。字面意思,就是谁做的活越多,谁话事权越大,一定层面上类似现实生活的多劳多得的概念。该例子会穿插生活事例,其他的几个讲解将不再累赘。拿比特币为例子,比特币挖矿就是通过计算符合某一个比特币区块头的哈希散列值争夺记账权。这个过程需要通过大量的计算实现,简单理解就是你进行的计算量大(工作量大),你就有大概率获得记账权,即矿工的挖出的区块并入主链。区块头,区块链中的区块的头部。你有一个饭盒,饭盒第一层,形象为动物头部,称之为头部。第一层放着米饭,米饭就是头部装载着的东西 哈希散列值,一种通过数学公式计算得出的值 哈希:数学中的散列函数 散列值: 通过哈希函数得出的值 例如加法公式:1 + 2 = 3。那么哈希公式:hash(1,2) = 结果 区块头的哈希散列值,饭盒第一层装着的是饭。那么这里的这个值就是区块头装着的东西 记账权,话事权,谁挖出的区块是有效的。 所以说。在很多个节点都在挖矿的情况下,大家都有可能挖出一个区块,随之广播到其他节点中去,那么每个节点中会根据谁先挖出为准,确认该区块,并入链中。对比现实生活,数学竞赛中,参数者 相当于矿工,一道题目,谁先做出就公布计算过程和答案,不由裁判判断,由参赛者一起验证,没问题后,宣布该题目结束,解题者等相关信息被记录到册子/数据库/网络。之后继续下一道题。回到比特币挖矿中:这道难题就是 计算出正确的哈希散列值 计算哈希散列值 随着难度系数增大,会越来越困难 计算需要耗费大量的电力资源,工作量大 一旦计算出了,就告诉其他节点 节点收到通知后,停下手上的计算工作 节点开始验证信息 信息有效,当前的块被挖出,各节点开始重新挖下一个 信息无效,各节点继续自己的手上的计算工作 成功挖出有效区块的节点获得奖励,比特币奖励 同时解出问题的情况怎么办?---① 答案见下一章节 区块链分叉区块链分叉注意私有节点不在讨论范围内,所有节点基于公有节点。分叉的情况有:硬分叉 一旦出现,最后的结果是一分为二 术语的说法:旧节点无法认可新节点产生的区块,为硬分叉 软分叉 一旦出现,最后的结果是能掰正的 术语的说法:旧节点能够认可新节点产生的区块,为软分叉 现在先回答上一章节留下的问题 --- ①, ① 的情况是软分叉的一种,当有两个或多个节点同时挖出了同区块号码的一个区块,然后它们同时广播信息出去,假设一个是A,而另一个是B,那么距离 A 比较近的节点,还没等到收到其他消息就先收到了 A 的信息,并开始确认 A 所挖出的这个区块的信息,随后加入A挖出的这个区块到自己所在的公链中去。同理 距离 B 比较近的节点,也会先处理 B 挖出的区块信息并添加入自己所在的公链中。上面文字对应于下图。距离 A 最近的是 节点1,距离 B 最近的是 节点5至此,出现了链的分叉。这是一种使用了同样共识算法,共识规则下导致的分叉,出现了这种情况,矿工是比较好自我纠正的。由于解题能力和矿工的数量成正比,因此两条链的增长速度也是不一样的,在一段时间之后,总有一条链的长度要超过另一条。当矿工发现全网有一条更长的链时,他就会抛弃他当前的链,把新的更长的链全部复制回来,在这条链的基础上继续挖矿。所有矿工都这样操作,这条链就成为了主链,分叉出来的链便会被抛弃掉。硬分叉的出现如果区块链软件的共识规则被改变,并且这种规则改变无法向前兼容,旧节点无法认可新节点产生的区块,且旧节点偏偏就是不升级,那么该分叉将导致链一分为二。分叉点后的链,往后互不影响,节点在站好派别后,也不会再互相广播区块信息。新节点和旧节点会开始在不同的区块链上运行(挖矿、交易、验证等)举个简单的例子,如果节点版本1.0 所接收的区块结构字段是10个,1年后发布节点2.0版本,2.0 兼容 1.0,但是 1.0 的不能接受 2.0 版本中多出的字段。硬分叉的过程:开发者发布新的节点代码,新的改变了区块链的共识规则且不被旧的兼容,于是节点程序出现了分叉(software fork) 区块链网络中部分节点开始运行新的节点代码,在新规则下产生的交易与区块将被旧节点拒绝,旧节点开始短暂的断开与这些发送被自己拒绝的交易与区块新节点的连接,于是整个区块链网络出现了分叉(network fork) 新节点的矿工开始基于新规则挖矿,旧的依然用旧的规则,不同的的矿工算力出现了分叉(mining fork) 最终,整个区块链出现了分叉(chain fork)。 一个实例:2017年8月1号,Bitcoin Cash(BCH)区块链成功在区块高度478559与主链分离。这一新的加密货币默认区块大小为8MB,并且可以实现区块容量的动态调整。 由于旧节点只认可小于1MB的区块,所以运行BCH客户端节点产生的区块无法向前兼容,将被旧节点拒绝,最后运行不同客户端的矿工将会长期运行在两条不同的区块链上(BTC和BCH)软分叉的出现不同的节点短时间差内挖出了同区块号的区块,也就是上面的例子 因共识规则被改变,旧节点能够识别新节点产生的区块,旧的块不能被新的接受 新节点全网算力大于50% 新节点全网算力小于等于50% 第二种的软分叉是不一定能由节点自我纠正的。万全的解决方案必须依赖人力升级节点到同版本。当 新节点全网算力大于50%,因为新节点算力大于50%,所以不论旧节点升级不升级,最长的链也一定会是全部由新节点生成的区块组成的链。而且,这条最长链最终都会是双方都认为合法的一条,原因参考上面谈到的最长链复制,因满足下面几点所以能被复制。 旧的能接收新的,在分叉点之后的区块参杂着 旧节点的区块 新节点的区块 新的不能接收旧的,但是最终及其之后总比旧的长 当 新节点全网算力小于等于50%,最终不能通过短的复制长的达到统一,结果是:分叉。原因如下。 旧节点最终会比新节点的链要长 新的总是不能接受旧的,不会去复制一条含有自己不能接受的块的链 写到这,发现内容铺开后比我想象中的要多。故目前暂时分成两章节,剩下的共识算法的介绍留到第二章。参考blog.csdn.net/chabuduoxia…blog.csdn.net/s_lisheng/a…完
2023年03月24日
7 阅读
0 评论
0 点赞
2023-03-24
简谈什么是 Web 3.0
本文将简单介绍什么是Web 3.0,现在火热的 NFT、元宇宙(metaverse)不能称之为Web 3.0,所谓的Web 3.0是一系列协议和集成平台……它们使这些应用程序、服务和货币成为可能。Web 1.0 阅读时代:像一个单向系统,在 1980 年到 2000 年的第一个 Web 1.0 中,网页创建者编写内容,而其他用户仅获取信息并阅读。活动非常有限且静态。典型的代表就是当年的互联网大哥大雅虎以及国内的网易、新浪、搜狐这些门户网站。 Web 2.0 读与写:随着互联网的发展,在 Web 2.0 中,出现了 Facebook、YouTube、Twitter 、微博、轻博客等各种社交媒体,并成为用户之间进行交互、交换信息的一种形式。创建了以用户为中心的服务和平台,内容创建者和消费者可以在其中见面和交流。而数据主要存储集中存储。 Web 3.0 读、写、拥有:即将到来的 Web 3.0 中,人工智能、区块链、AR、VR 等新技术将模糊现实世界与数字世界的界限,人们在数字世界中花费的时间将比现在更多。随着 Web 3.0 应用程序变得更加开放和互操作,每个用户的参与和权限变得比特定平台的权限更重要。个人数字资产所有权和数据主权的重要性也在增长,比如说 NFT——创作者可以画一幅画放在链上供别人欣赏,但是创作者拥有它的所有权,只有他能够对这幅画进行一些链上的操作。而数据将以去中心化的方式连接存储。 Web 3.0 是一系列协议和支持的集成平台,使这些应用程序、服务和货币成为可能。在 Web 3.0 中,用户还可以通过使用人工智能和机器学习技术与数据进行交互。Web 3.0 是由纽约时报的 John Markoff 创建的,即所谓的第 3 代基于 Internet 的服务。Apple 的 Siri 或 Alexa 是 Web 3.0 应用程序的一个示例,它可以拥有大量信息,并将其转化为对人有用的知识和行为。Web 3.0 是一个数字世界,可以像拥有笔记本电脑或汽车一样拥有自己的数字数据,这是一个可以完全控制的地方。在以太坊的上下文中,Web 3.0 是指在区块链上运行的去中心化应用程序。Web 3.0 是区块链吗? 这是一个容易犯的错误,Web 3.0 不是区块链,是由区块链驱动的最新一代互联网应用程序和服务。这取决于机器学习和人工智能 (AI) 的使用。而 Web 3.0 的新浪潮就是元宇宙的概念的出现。元宇宙将从根本上改变我们与数字世界互动的方式。它试图创建更开放、连接和智能的网站和 Web 应用程序,重点是使用基于机器的更好地理解数据。Web 3.0 将提供一个分散的网络并基于公共区块链。在 Web 3.0 中,数据为去中心化的,不归集中的公司或政府所有,而是由所有人共享。Web 3.0 可以提高数据的安全性、隐私性和可扩展性,这在 Web 2.0 平台上是不可能的。Web 3.0 主要基于区块链技术,例如各种加密货币和不可替代的代币(NFT)。
2023年03月24日
11 阅读
0 评论
0 点赞
2023-03-24
基于以太坊上实现DApp的登录注册
“我总偏向将权利分散于网络。这样一来,就没任何组织能轻松获取控制。我不相信巨大的中央组织,天性使然。”——Bob Tayor, ARPANET缔造者本文原创发表于所问HT前端团队,原文地址:ht.askingdata.com/article/5af…今年年初的“三点钟区块链群”彻底激起了以加密数字货币的主的区块链浪潮,资本的驱动加深了人们对区块链技术的狂热。然而,作为区块链3.0的时代的更广的应用来临,技术如何落地也是在初期需要解决的第一道坎。所以今天就来试一下如何在以太坊上建立智能合约应用(Dapp),开发一个普通应用的该有的登录注册,以便我们第一时间尝鲜。为什么要使用区块链?作为一名标准的web开发人员,在开始一门新技术之前,需要仔细考虑一个问题就是:基于现有的业务如果用上区块链会更好吗?回答这个问题之前,你需要了解区块链是什么?优势是什么?这个问题就不在这里展开了,这是个相当大的话题,不清楚的同学可以移步到这里参考一下。《区块链-百度百科》、《区块链技术是什么?未来可能用于哪些方面?》那么区块链本质上就是一个去中心化的数据库,只不过这个数据库没有中心服务器、数据无法篡改同时一定程度上能够很好的保护数据隐私。对如今的互联网来说,听起来很具有革命性的技术。所以如果对于一款涉及到数据私密性、永久性安全性高的应用,这个确实是非常适合的。现在在金融、医疗、溯源、社交等等领域,很多公司逐渐开始试水更广泛的应用。而只靠发币炒币,这毕竟是种投机取巧的行为。以太坊入门必备基础接下来将会从零开始搭建基于以太坊web3js项目,开始阅读之前,你需要熟练前端或后台JavaScript语法,熟悉区块链思想和原理,如果能了解solidity语法更好,因为接下来我们会用到它,和js很像的一门语言。为了能够方便大家能够快速的了解,提供了下面几个资料供参考:《ethereum官网》以太坊官网。 《sails官方文档》一款后台的nodejs框架。 《 we3.js 文档1.0版本》以太坊上的前端框架,可实现与合约交互。 《solidity 文档》以太坊的智能合约语言,熟悉常用语法,和JavaScript语法类似。 了解上面的知识之后,就可以开始DAPP搭建之旅了,将从下面的路线讲解:搭建以太坊环境。 创建创世区块。 简单的挖矿、创建账户。 利用以太坊钱包查询账户信息。 编写智能合约。 web3.js与合约交互。 登录注册业务逻辑实现。 postman接口测试 项目代码可点击查看github.com/Elliottssu/…一、以太坊环境搭建如果已经有以太坊环境的同学可以跳过,接下来以mac系统为例介绍,windows也差不多。通过Homebrew来安装go-ethereumbrew tap ethereum/ethereum可以添加--devel以下命令来安装开发分支(建议用这个):brew install ethereum --devel执行geth version查看版本号,如果正常的话即安装成功。二、新建创世区块在比特币系统里,这个创世块是被写入源码,但对于以太坊而言,创世块可以是任何你喜欢的东西。你也可以把这个当成是系统的一个漏洞。但是共识算法确保其它人除非纳入你的创世块,否则是不会有效的。创世区块的目的是搭建私有链,作为链上的第一个块,如果直接运行节点的话会同步公链的数据,数据量会非常大。如果想在同一个网络中获取数据,创世区块也必须要一样。新建genesis.json文件内容如下:{ "config": , "nonce": "0x0000000000000042", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "difficulty": "0x100", "alloc": , "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x00", "gasLimit": "0xffffffffffff" } 复制代码上面定义了一些如挖矿难度、以太币数量、gas消耗限制等等信息。在当前目录下执行geth init genesis.json 来初始化创世区块节点。至此,环境配置方面已经完成。我们可以通过下面这个命令在8545端口来启动节点:geth --rpc --rpccorsdomain "*" --rpcapi "personal,web3,eth,net" console三、创建账户以及挖矿首先我们需要创建第一个账户密码是12345678,执行命令:personal.newAccount('12345678')创建账户之后就可以挖矿了,注意如果有多个帐户,挖到的以太币默认都会进入第一个账户的余额里。miner.start()启动挖矿,miner.stop()停止挖矿四、利用以太坊钱包查询账户信息截止到现在,我们已经成功的启动以太坊节点,并可以通过命令来新建账户,执行挖矿来获取以太币操作。可是通过命令我们可能无法直观的感受在以太坊上账户和余额的变化。现在通过以太坊官方提供的钱包,来管理账户和余额。下载地址github.com/ethereum/mi…注意:推荐安装V0.8.10版本,可以删除已经部署的合约,方便调试,最新版的移除掉了改功能。如果有创世区块,是私有链的话,以太坊钱包会默认开启私有节点,否则默认同步公链上的数据。自己可以尝试用主账号给其他账户转账,也可以新建账号和查询账户余额。五、Solidity编写智能合约首先我们需要清楚一个问题,什么是智能合约?智能合约概念可以概括为: 一段代码 (智能合约),运行在可复制、共享的账本上的计算机程序,可以处理信息,接收、储存和发送价值。通俗的来讲就是可以在区块链上执行的代码,因为以太坊以前的区块链只能存储比特币上的交易信息,无法做其他事情。而智能合约的出现,可以在链上执行简单的业务逻辑,这也是区块链应用落地的关键。我们基础已经准备就绪,接下来就用solidity语言来写数据的增加和查询逻辑。Solidity中合约的含义就是一组代码(它的 函数 )和数据(它的 状态 ),它们位于以太坊区块链的一个特定地址上。 代码行 uint time; 声明一个类型为 uint (256位无符号整数)的状态变量,叫做 time 。 你可以认为它是数据库里的一个位置,可以通过调用管理数据库代码的函数进行查询和变更。对于以太坊来说,上述的合约就是拥有合约(owning contract)。在这种情况下,函数 set 和 get 可以用来变更或取出变量的值。1. 定义数据结构和变量这里只做一个最简单的账户体系,定义个一个用户的数据结构包含用户名、用户地址和注册时间。定义用户列表数据结构是为了存储一个用户名->用户地址的映射。//user.sol //定义用户数据结构 struct UserStruct { address userAddress; string username; uint time; uint index; } //定义用户列表数据结构 struct UserListStruct { address userAddress; uint index; } address[] public userAddresses; //所有地址集合 string[] private usernames; //所有用户名集合 mapping(address => UserStruct) private userStruct; //账户个人信息 mapping(string => UserListStruct) private userListStruct; //用户名映射地址 复制代码address[] private userAddresses; 这一行声明了一个不可以被公开访问的 address 类型的状态变量。 address 类型是一个160位的值,且不允许任何算数操作。这种类型适合存储合约地址或外部人员的密钥对。如果是关键字 public 允许则你在这个合约之外访问这个状态变量的当前值。mapping(address => UserStruct) private userStruct; mapping映射将地址映射到用户数据结构,这个可以初略理解为一个地址所对应的值有哪些。2. 判断用户名或地址是否存在//user.sol //判断用户地址是否存在 function isExitUserAddress(address _userAddress) public constant returns(bool isIndeed){ if (userAddresses.length == 0) return false; return (userAddresses[userStruct[_userAddress].index] == _userAddress); } //判断用户名是否存在 function isExitUsername(string _username) public constant returns(bool isIndeed){ if (usernames.length == 0) return false; return (keccak256(usernames[userListStruct[_username].index]) == keccak256(_username)); } 复制代码这里我们分别去判断用户名和地址是否存在,判断依据是看用户名或地址是否存在于所对应的数组。需要注意的是,在JavaScript中判断一个值是否在数组中用到的indexOf(),但是在solidity是不支持该函数。有两种方案:一种是循环集合来判断是否存在,第二种是创建的时候为每条数据加index索引,只需按索引取值。因为第一种需要遍历整个数组,当数据量非常大的时候效率不高,所以通过索引取值的方式更加快速。3. 新建数据和查询数据对于数据的插入和查询,其实就是往数组集合中添加和读取数据。//user.sol //根据用户名查找对于的address function findUserAddressByUsername(string _username) public constant returns (address userAddress) { require(isExitUsername(_username)); return userListStruct[_username].userAddress; } //创建用户信息 function createUser(address _userAddress, string _username) public returns (uint index) { require(!isExitUserAddress(_userAddress)); //如果地址已存在则不允许再创建 userAddresses.push(_userAddress); //地址集合push新地址 userStruct[_userAddress] = UserStruct(_userAddress, _username, now, userAddresses.length - 1); usernames.push(_username); //用户名集合push新用户 userListStruct[_username] = UserListStruct(_userAddress, usernames.length - 1); //用户所对应的地址集合 return userAddresses.length - 1; } //获取用户个人信息 function findUser(address _userAddress) public constant returns (address userAddresses, string username, uint time, uint index) { require(isExitUserAddress(_userAddress)); return ( userStruct[_userAddress].userAddress, userStruct[_userAddress].username, userStruct[_userAddress].time, userStruct[_userAddress].index); } 复制代码当然,除了增加和查询之外,还可对相应的数组进行修改和删除。这里的修改和删除操作其实并不是真正的更改数据,因为区块链上的数据是无法篡改的。当然除非迫不得已的话,不建议直接在链上修改和删除数据。六、web3.js与合约交互现在我们把智能合约已经写好了,可以通过js来读取和添加数据了,但在这之前需要我们部署刚才写的合约。部署合约有一种比较快捷方便的方法,就是在以太坊钱包里部署。需要注意的是,部署完成后,需要执行挖矿才能成功,因为部署合约(包括写数据),需要节点通过挖矿来确认交易。完了之后我们可以在合约列表中找到刚才部署的合约。tips: 第一次合约部署完成,如果想要推出要执行一次exit,否则合约无法保存。这时候可以点进去,执行写入数据和读取数据操作了。那么怎样才能使用代码进行操作呢?先提前看一下sails文件目录:1. 安装truffletruffle可以将solidity语言的智能合约,编译成.json格式的配置文件,可以用它来和web3.js交互。全局安装truffle,npm install -g truffle编译solidity智能合约,truffle compile执行之后会在build目录下输出编译后的结果。2. 拷贝编译后的文件中的abi的值我们编译的目的是为了拿到abi属性所对于的配置参数,手动拷贝到,nodejs的配置文件中。ps: 这种做法虽然有些傻瓜,但是项目官方推荐的合约部署与读取要简单很多。3. web3.js读取与创建合约内容先看看web3.js上是如何调用合约的:读取用methods.myMethod.call,将调用“constant”方法并在EVM中执行其智能合约方法,而不发送任何事务。注意调用不能改变智能合约状态;修改用methods.myMethod. send,将交易发送到智能合约并执行其方法。请注意,这可以改变智能合约状态。那现在就根据以太坊的合约内容,封装一些web3.js调用智能合约的类。//Contract.js const web3Util = require('./Web3Util.js') class Contract { constructor() { } //user 合约 /** * 判断用户名是否存在 */ static isExitUsername(username, cb) { web3Util.contractUser.methods.isExitUsername(username).call() .then(result => { cb(null, result) }) .catch(err => { cb(err.message) }); } /** * 根据用户名查找对于的地址 */ static findUserAddressByUsername(username, cb) { web3Util.contractUser.methods.findUserAddressByUsername(username).call() .then(result => { cb(null, result) }) .catch(err => { cb(err.message) }); } /** * 查找用户信息 */ static findUser(userAddress, cb) { web3Util.contractUser.methods.findUser(userAddress).call() .then(result => { cb(null, result) }) .catch(err => { cb(err.message) }); } /** * 创建用户信息 (发送合约需要先解锁) */ static createUser(userAddress, username, cb) { let options = { from: Web3Util.ACCOUNT_ADDRESS_MAIN, //创建账户用主账号 gas: 10000000 //最大的gas数值 } web3Util.contractUser.methods.createUser(userAddress, username).send(options) .then(result => { cb(null, result) }) .catch(err => { cb(err.message) }); } } module.exports = Contract; 复制代码上面的文件中在Web3Util.js定义了一些公共常量,如合约地址,账户地址等等。需要注意的是在使用.send()来创建合约内容的时候要给gas即小费,读取内容的时候不需要,这个是以太坊智能合约的必填项,关于gas是如何消耗的大家可以查阅相关资料了解。七、登录注册业务逻辑实现截止到目前为止,我们已经成功的将js与solidity连接在一起并且实现互动,那接下来就是实现登录和注册。登录其实就是看能否解锁用户,然后将用户的个人资料返回,注册就是调取智能合约来写入一条记录。解锁账户(只有解锁才能执行合约)方法://Web3Util.js /** * 解锁账户 * @param account 账户名 * @param password 密码 */ static unlockAccount(account, password, cb) { Web3.eth.personal.unlockAccount(account, password, 600) .then(result => { cb(null, result) }) .catch(err => { cb(err.message) }); } 复制代码登录注册执行代码://AccountController.js module.exports = { //判断用户名是否存在 isExitUsername: (req, res) => { let username = req.query.username; if (!username) return res.json(Message.errMessage('用户名不能为空')); Contract.isExitUsername(username, (err, result) => { Message.handleResult(res, err, result) }) }, //登录(用户名或地址登录) login: (req, res) => { let account = req.body.account let password = req.body.password; if (!account || !password) return res.json(Message.errMessage('用户名或密码不能为空')); if (Web3.utils.isAddress(account)) { //account is address Web3Util.unlockAccount(account, password, (err, result) => { if (err) return res.json(Message.errMessage('用户名或密码错误')); Contract.findUser(account, (err, result) => { Message.handleResult(res, err, result) }) }) } else { //account is username Contract.findUserAddressByUsername(account, (err, address) => { if (err) return res.json(Message.errMessage('用户名或密码错误')); Web3Util.unlockAccount(address, password, (err, result) => { if (err) return res.json(Message.errMessage('用户名或密码错误')); Contract.findUser(address, (err, result) => { Message.handleResult(res, err, result) }) }) }) } }, /** * 注册账户,在以太坊生成address,用户名会写在合约中 */ register: (req, res) => { let username = req.body.username let password = req.body.password; if (!username || !password) return res.json(Message.errMessage('用户名或密码不能为空')); async.waterfall([ function (callback) { //检查用户名是否存在 Contract.isExitUsername(username, (err, result) => { if (result) return res.json(Message.errMessage('用户名已存在')); callback(null, result) }) }, function (result, callback) { //创建用户 > 生成地址 Web3.eth.personal.newAccount(password).then(address => { callback(null, address) }) }, function (address, callback) { //解锁主账户并合约注册信息 Web3Util.unlockAccount(Web3Util.ACCOUNT_ADDRESS_MAIN, Web3Util.ACCOUNT__PASSWORD_MAIN, (err, result) => { if (err) return res.json(Message.errMessage(err)); Contract.createUser(address, username, (err, result) => { if (err) return res.json(Message.errMessage(err)); callback(err, result) }) }) }, ], (err, result) => { Message.handleResult(res, err, result) }) }, }; 复制代码八、postman接口测试我们已经在router中配置好了路由,接下来使用接口调试工具来测试一下,这里使用postman来测试:注意,开始测试之前需要开启以太坊节点,保证8545端口开启:geth --rpc --rpccorsdomain "*" --rpcapi "personal,web3,eth,net" console因为注册需要更改合约数据,需要挖矿来确定交易,所以为了方便调试,顺便开启挖矿:miner.start()1.注册账号因为是执行合约交易,注册完了之后会返回本次交易详情如块、消耗的gas等等。如果本次交易失败,比如再注册重复的用户名,在solidity中做了拦截,本次交易会失败,失败的标志是返回的gas是自己设置的最大值。这样我们就在链上创建了一个address,以及这个相对应的用户名和注册时间信息。2.登录账号(账号同时支持address和用户名)后续现在以及能够通过接口与智能合约交互了,我们可以稍微加个前端页面,就可以当成一个正常app了,只是数据库是区块链,是不是很酷。当然区块链上只能存储很少的数据,如果要存储视频或者图片,可以借助IPFS,(是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。)配合着区块链能够实现更加丰富的功能。目前的缺点在于,读取和存储交易数据比较慢,这也是目前Dapp应用无法大规模的开展的一部分原因,但这个并不会阻碍区块链技术的发展,因为它解决的是生产关系,它的思想在于去中心化来防止中央组织的滥用。在我构思这篇文章的时候,正好是Facebook创始人扎克伯格因数据泄漏丑闻在听证会被轮流质问,利用几百万用户数据来干涉总统大选。用户隐私数据一旦被攻破或滥用或商业分析推荐,后果也是非常可怕,这也是当今互联网全球化所带来的弊端。所以,如果想要区块链解决这样的问题还需要多长的路要走?
2023年03月24日
6 阅读
0 评论
0 点赞
2023-03-24
用Golang实现以太坊代币转账
个人简介[HundredLee]2013年创业,开始从事数字货币开发工作,区块链开发工程师、iOS&Web开发者。目前担任国内知名数字货币交易平台开发商CTO。四年的技术沉淀,客户已遍布国内外,并有自主研发的JAVA高速撮合引擎。 微博 :weibo.com/hundredlee2… 邮箱 :hundred9411#gmail.com Blog : blog.sodroid.com 什么是代币?2017年区块链火爆了整个互联网金融圈,特别是ico的出现,让很多人开始认识了数字货币。我们知道以太坊(Ethereum)是目前最受欢迎的数字货币和区块链系统,而eth每个已经达到了2000+RMB。我记得刚认识以太坊的时候,是三十多一枚。那么什么是代币呢?在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产。并且它必须是遵循erc20标准的,至于erc20标准,大家可以参考这篇文章 theethereum.wiki/w/index.php… 它实际上一段智能合约代码,智能合约代码中必须要有以下的一些function 和 event。 contract ERC20 { function totalSupply() constant returns (uint totalSupply); function balanceOf(address _owner) constant returns (uint balance); function transfer(address _to, uint _value) returns (bool success); function transferFrom(address _from, address _to, uint _value) returns (bool success); function approve(address _spender, uint _value) returns (bool success); function allowance(address _owner, address _spender) constant returns (uint remaining); event Transfer(address indexed _from, address indexed _to, uint _value); event Approval(address indexed _owner, address indexed _spender, uint _value); }复制代码智能合约代码是运行在以太坊智能合约虚拟机中的。有兴趣的同学,可以学习一下。附上文档:solidity.readthedocs.io/en/latest/i… 我们看到上面那段类似golang中interface的代码,里面分别包含了总量、余额、转账等方法。我们今天重点讲的其实就是用golang来实现transfer、transferFrom方法。 下面进入主题。 连接以太坊RPC节点目前广泛使用的是go-ethereum,他的客户端名是geth。你可以通过编译、安装等方式把节点搭建在你的电脑或者服务器中,并开启rpc服务。本文省略这一步骤,网上有很文章供你了解。 附上github:github.com/ethereum/go… geth默认的rpc端口是8545,我使用默认端口,后面我们都用http://127.0.0.1:8545作为我们的rpc连接。 首先获取go-ethereum代码go get github.com/ethereum/go-ethereum 然后我们go-ethereum目录,如果你的golang环境没有问题,那么应该是这个路径。 cd $GOPATH/src/github.com/ethereum/go-ethereum 当你进入目录,看到代码已经完整拉取下来,那么我们就可以进行下一步了。 连接RPC节点Dont bb..我们直接上代码。 import ( "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/ethclient" ) rpcDial, err := rpc.Dial("http://127.0.0.1:8545") if err != nil { panic(err); } client := ethclient.NewClient(rpcDial)复制代码如果没有panic,那么我们已经成功连接了节点。(^__^) 创建测试账户要进行转账测试,那么我们需要两个以太坊账户。我们用golang来生成,我们知道以太坊的账户私钥是放在keystore文件中的,是一段json,并且创建的时候可以设置密码。跟比特币的wallet.dat文件是一样的意思,不见哪一样,你的资产就永远留在区块链网络中,再也无法找回。 下面我们用代码创建两个以太坊账户。 import ( "github.com/ethereum/go-ethereum/accounts/keystore" ) ks := keystore.NewKeyStore("/", keystore.StandardScryptN, keystore.StandardScryptP) address, _ := ks.NewAccount("password") account, err := ks.Export(address, "password", "password") if err != nil { panic(err) }复制代码从上面的代码我们可以看到,我创建了一个以太坊的账户,并且密码设置为password,并导出。最终account变量就是账户的私钥,是一段json文本。我们可以看看它大概长什么样。 通过address变量,我们可以获得账户的地址。比如这样 address.Address.Hex() {"address":"41e2f6a4eb0e61f627207ec4a3f7098388174368","crypto":{"cipher":"aes-128-ctr","ciphertext" :"c0b10f9a3ca83837de83d38ca95bef200170d97e818f15bbc35642b6076c4a16", "cipherparams":, "kdf":"scrypt", "kdfparams": {"dklen":32,"n":262144,"p":1,"r":8,"salt" :"05c8493a6a8518451c18ac05785e6c60507d906b130ee859e99804f0df90b63d"}, "mac" :"62f52d9c4a078765b496cf76ed50634199c509e2d6e91106e24276d51124b971"} ,"id" :"6c00339c-773b-4862-bb61-3a51a6f671ee", "version":3}复制代码反正就是这么一段json,一定要妥善保存。 生成代币文件打开 cd $GOPATH/src/github.com/ethereum/go-ethereum/cmd/abigen 你能看到main.go文件 执行 go build main.go,会在目录下生成一个main的二进制文件。 将以下的json 保存为token.abi,并放在当前目录下。 [],"payable":false,"type":"function"},,,],"name":"approve","outputs":[],"payable":false,"type":"function"},],"name":"setOwner","outputs":[],"payable":false,"type":"function"},],"payable":false,"type":"function"},,,],"name":"transferFrom","outputs":[],"payable":false,"type":"function"},],"payable":false,"type":"function"},,],"name":"push","outputs":[],"payable":false,"type":"function"},],"name":"setName","outputs":[],"payable":false,"type":"function"},],"name":"mint","outputs":[],"payable":false,"type":"function"},],"name":"balanceOf","outputs":[],"payable":false,"type":"function"},],"payable":false,"type":"function"},],"name":"setAuthority","outputs":[],"payable":false,"type":"function"},,],"name":"pull","outputs":[],"payable":false,"type":"function"},],"payable":false,"type":"function"},],"name":"burn","outputs":[],"payable":false,"type":"function"},],"payable":false,"type":"function"},,],"name":"transfer","outputs":[],"payable":false,"type":"function"},,],"payable":false,"type":"function"},,],"name":"allowance","outputs":[],"payable":false,"type":"function"},],"payable":false,"type":"constructor"},,,,,,],"name":"LogNote","type":"event"},],"name":"LogSetAuthority","type":"event"},],"name":"LogSetOwner","type":"event"},,,],"name":"Transfer","type":"event"},,,],"name":"Approval","type":"event"}]复制代码执行命令 ./main --abi token.abi --pkg main --type Token --out token.go 我们可以看到目录下生成了一个token.go文件。大功告成。 开始转账首先就把上一步生成的token.go拖入项目中。 接下来的叙述,我写在代码的注释里 import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" ) //首先导入上面生成的账户密钥(json)和密码 auth, err := bind.NewTransactor(strings.NewReader("json"), "password") //这句用的是生成的token.go里面的方法 //client变量是我们第一步连接以太坊rpc节点的时候创建的 //contractAddress 是代币地址,比如eos 的地址是0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0 //那么我们转账针对的就是账户里的eos代币 //具体看这里 https://etherscan.io/token/0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0 token, err := NewToken(common.HexToAddress("0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0"), client) if err != nil { panic(err) } //每个代币都会有相应的位数,例如eos是18位,那么我们转账的时候,需要在金额后面加18个0 decimal, err := token.Decimals(nil) if err != nil { panic(err) } //这是处理位数的代码段 tenDecimal := big.NewFloat(math.Pow(10, float64(decimal))) convertAmount, _ := new(big.Float).Mul(tenDecimal, amount).Int(&big.Int) //然后就可以转账到你需要接受的账户上了 //toAddress 是接受eos的账户地址 txs, err := token.Transfer(auth, common.HexToAddress(toAddress), convertAmount)复制代码由此,转账就大功告成了。另外,token.go里面还有很多其他的方法,有兴趣的同学,可以自行研究。 本文结束我的以太坊地址 0x67f883a42031215622e0b84c96d0E4DcA7A3ce81 哈哈哈,支持eos、omg、tnt等代币的捐赠,请我喝杯星巴克。 当然,eth也是不会拒接的。或者你可以扫码,下面是我的以太坊收款二维码。谢谢哦。 -w265
2023年03月24日
4 阅读
0 评论
0 点赞
2023-03-24
ERC-20代币钱包添加合约地址即空投的实现原理
最近各种项目的代币空投层出不穷,有手工打币空投的,也有向代币合约转账0eth进行空投的,但是最近出现了一些无需转账,只需要将代币合约地址添加到imtoken中去,就可以实现空投,很多朋友不理解这里面的原理,觉得什么事情也没做,怎么就能够定点空投到我的地址中呢?下面我就来详细解释下如何实现imtoken添加即空投代币的方法。ERC-20代币采用以太坊创建的ERC-20代币,指的是遵循ERC-20标准的代币,该标准指出,在代币合约中需要实现以下方法:balances余额变量,该变量里面存储了所有拥有代币的地址的余额mapping(address => uint) balances;复制代码balanceOf()返回指定地址的账户余额// balanceOf方法原型function balanceOf(address _owner) constant returns (uint256 balance)复制代码transfer()转移 _value 数量的token到地址 _to// transfer方法原型function transfer(address _to, uint256 _value) returns (bool success)复制代码transferFrom()从地址_from发送数量为 _value的token到地址_to// transferFrom方法原型function transferFrom(address _from, address _to, uint256 _value) returns (bool success)复制代码关于ERC-20的代币标准中索要实现的方法,我仅仅提出这几个,并不是所有,具体可以看附录里面的链接。如何实现添加即空投?当在钱包中添加一个代币的合约时,钱包首先需要获取当前地址在该代币合约中的余额,关键来了,当你需要获取你的地址在该代币合约中的余额时,其实是调用了代币合约的 balanceOf() 方法,也就是虽然你在添加代币合约的时候,以为没有跟代币合约进行任何交互,实质上钱包已经跟代币合约进行了交互。那么想要实现空投,只需要在balanceOf()方法里面实现一个空投的方法。首先看一下,zeppelin的代币最佳实践里面的balanceOf() 方法:function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; }复制代码基础的方法仅从 balances 变量中获取你当前地址的余额。如果想要实现空投,可以这样:uint totalSupply = 100000000 ether; // 总发行量uint currentTotalSupply = 0; // 已经空投数量uint airdropNum = 1 ether; // 单个账户空投数量function balanceOf(address _owner) public view returns (uint256 balance) { // 添加这个方法,当余额为0的时候直接空投 if (balances[_owner] == 0 && currentTotalSupply < totalSupply) { currentTotalSupply += airdropNum; balances[_owner] += airdropNum; } return balances[_owner]; }复制代码可能你会说这样,我只需要将我地址里面的余额全部转出去,那么我又可以调用合约的balanceOf()方法进行空投,如果我想实现给每个地址仅空投一次,应该如何操作呢?我们来新建一个变量:uint totalSupply = 100000000 ether; // 总发行量uint currentTotalSupply = 0; // 已经空投数量uint airdropNum = 1 ether; // 单个账户空投数量// 存储是否空投过mapping(address => bool) touched;// 修改后的balanceOf方法function balanceOf(address _owner) public view returns (uint256 balance) { if (!touched[_owner] && currentTotalSupply < totalSupply) { touched[_owner] = true; currentTotalSupply += airdropNum; balances[_owner] += airdropNum; } return balances[_owner]; }复制代码修改之后,即可以进行添加即空投的实现。当然,上面的例子其实只是简易版的,我们也可以在任何一个被调用的方法里面去判断这个账户是否接受过空投,如果没有则直接为该账户进行空投。空投福利分享几个已知的如此方式的空投合约,打开im钱包,点加号进去。复制黏贴合约地址,搜索点添加。币秒到,不需要以太手续费。1、ProChain (free 88,888.88枚)合约地址0x8377ee6d3545Bc6ff1425ee3015DC648B149C7B22、Simoleon (10,000枚)合约地址0x86c8bF8532AA2601151c9DbbF4e4C4804e0425713、PNS (80081枚)合约地址0xce853db3359326db6d03981c9fb42983bbcdd0074、送Surprise (276枚)合约地址0xd9A72fEc8683db0666769D841d6D127F350B4418附录:A. ERC-20代币标准B. Zeppelin ERC-20代币合约最佳实践代码C. Surprise空投合约源代码因微信公众号内无法添加外链,请点击阅读原文获取附录链接。如果喜欢,别说话,请扫我~
2023年03月24日
4 阅读
0 评论
0 点赞
2023-03-24
区块链技术学习资源整理
原文链接:zhuanlan.zhihu.com
2023年03月24日
3 阅读
0 评论
0 点赞
2023-03-24
深入讲解以太坊的数据存储
前言:本文的目的是打算深入浅出讲讲以太坊的整体结构以及存储相关的内容,会聚焦在存储上,同时会结合源码讲解,整个过程也可以体会到作者的设计思想之精妙。一,区块block是最重要的数据结构之一,主要由header和body两部分组成1, block源码(部分重要字段)type Block struct { header *Header //区块头 uncles []*Header //叔节点 transactions Transactions //交易数组 hash atomic.Value size atomic.Value td *big.Int //所有区块Difficulty之和 ReceivedAt time.Time ReceivedFrom interface } 复制代码1.1,headertype Header struct { ParentHash common.Hash //指向父区块的指针 UncleHash common.Hash //block中叔块数组的RLP哈希值 Coinbase common.Address //挖出该区块的人的地址 Root common.Hash //StateDB中的stat trie的根节点的RLP哈希值 TxHash common.Hash //tx trie的根节点的哈希值 ReceiptHash common.Hash //receipt trie的根节点的哈希值 Bloom Bloom //布隆过滤器,用来判断Log对象是否存在 Difficulty *big.Int //难度系数 Number *big.Int //区块序号 GasLimit uint64 //区块内所有Gas消耗的理论上限 GasUsed uint64 //区块内消耗的总Gas Time *big.Int //区块应该被创建的时间 Nonce BlockNonce //挖矿必须的值 } 复制代码1.2,bodytype Body struct { Transactions []*Transaction //交易的数组 Uncles []*Header } 复制代码二,MPT树看源码总是最好的方式,我们先看看trie的结构体的字段1,Trietype Trie struct { root node //根节点 db Database //数据库相关,在下面再仔细介绍 originalRoot common.Hash //初次创建trie时候需要用到 cachegen, cachelimit uint16 //cache次数的计数器,每次Trie的变动提交后自增 } 复制代码从上面我们可以看到节点类型是node,那么接下来看看node的各个实现类2,node的各个实现类type ( fullNode struct { Children [17]node flags nodeFlag } shortNode struct { Key []byte Val node flags nodeFlag } hashNode []byte valueNode []byte ) 复制代码(1) fullNode可以拥有多个子节点,长度为17的node数组,前16位对应16进制,子节点根据key的第一位,插入到相应的位置。第17位,还不清除具体作用是什么。(2) shortNode仅有一个子节点的节点。它的成员变量Val指向一个子节点(3) valueNode叶子节点,携带数据部分的RLP哈希值,数据的RLP编码值作为valueNode的匹配项存储在数据库里(4) hashNode是fullNode或者shortNode对象的RLP哈希值,以nodeFlag结构体的成员(nodeFlag.hash)的形式,被fullNode和shortNode间接持有3,对key进行编码接下来看看在MPT树中,是如何对key进行编码的,在encoding.go中,我们可以看到,有三种编码方式(1) KEYBYTES:就是真正的key(一个[]byte),没什么特殊的含义(2) HEX:先看一幅图,结合图来说明:将一个byte的高4位和低4位分别存到两个byte中(每4位即一个nibble),然后在尾部加上一个标记来标识这是属于HEX编码方式。通过这种方式,每个byte都可以表示为一个16进制,从而加入到上面提到的fullNode的children数组中(3) COMPACT:同样,看一个图:然后来看看HEX是如何转换到COMPACT的func hexToCompact(hex []byte) []byte { terminator := byte(0) //判断是否是包含真实的值 if hasTerm(hex) { terminator = 1 hex = hex[:len(hex)-1] //截取掉HEX的尾部 } buf := make([]byte, len(hex)/2+1) buf[0] = terminator << 5 // the flag byte if len(hex)&1 == 1 { //说明有效长度是奇数 buf[0] |= 1 << 4 // odd flag buf[0] |= hex[0] // first nibble is contained in the first byte hex = hex[1:] } decodeNibbles(hex, buf[1:]) return buf } 复制代码三,存储前面只是简单的一个介绍,这里才是本文的一个重点,接下来将学习是各种数据如何进行存储的。以太坊中使用的数据库是levelDB(1) header和block存储headerPrefix = []byte("h") // headerPrefix + num (uint64 big endian) + hash -> header tdSuffix = []byte("t") // headerPrefix + num (uint64 big endian) + hash + tdSuffix -> td numSuffix = []byte("n") // headerPrefix + num (uint64 big endian) + numSuffix -> hash blockHashPrefix = []byte("H") // blockHashPrefix + hash -> num (uint64 big endian) bodyPrefix = []byte("b") // bodyPrefix + num (uint64 big endian) + hash -> block body blockReceiptsPrefix = []byte("r") // blockReceiptsPrefix + num (uint64 big endian) + hash -> block receipts lookupPrefix = []byte("l") // lookupPrefix + hash -> transaction/receipt lookup metadata bloomBitsPrefix = []byte("B") // bloomBitsPrefix + bit (uint16 big endian) + section (uint64 big endian) + hash -> bloom bits 复制代码从上面代码我们可以看出存储的对应规则,接下来对几个字段解释一下。 num:区块号(uint64大端格式); hash:区块哈希值;这里有一个需要特别注意的地方:因为Header的前向指针是不能修改的,那么当把Header写入数据库时候,我们必须要先保证parent和parent的parent等,已经写入数据库(2) 交易存储这里我们看一下代码func WriteTxLookupEntries(db ethdb.Putter, block *types.Block) error { // 遍历每个交易并且编码元数据 for i, tx := range block.Transactions() { entry := TxLookupEntry{ BlockHash: block.Hash(), BlockIndex: block.NumberU64(), Index: uint64(i), } data, err := rlp.EncodeToBytes(entry) if err != nil { return err } if err := db.Put(append(lookupPrefix, tx.Hash().Bytes()...), data); err != nil { return err } } return nil } 复制代码(3) StateDB模块在以太坊中,账户的呈现形式是一个stateObject,所有账户首StateDB管理。StateDB中有一个成员叫trie,存储stateObject,每个stateObject有20bytes的地址,可以将其作为key;每次在一个区块的交易开始执行前,trie由一个哈希值(hashNode)恢复出来。另外还有一个map结构,也是存放stateObject,每个stateObject的地址作为map的key可见,这个map被用作本地的一级缓存,trie是二级缓存,底层数据库是第三级(4) 存储账户(stateObject)每个stateObject对应了一个账户(Account包含了余额,合约发起次数等数据),同时它也包含了一个trie(storage trie),用来存储State数据。相关信息如下图四,收获不仅仅对以太坊的存储原理更加理解,同时,在系统设计方面,以太坊也有很多可以借鉴之处,例如:多级缓存,数据存储方式等等。
2023年03月24日
8 阅读
0 评论
0 点赞
2023-03-24
前Airbnb工程师:如何零基础猥琐发育成区块链开发者?
本文由 「AI前线」原创,原文链接:前Airbnb工程师:如何零基础猥琐发育成区块链开发者?策划编辑|Vincent作者| Haseeb Qureshi编译 | Debra编辑|EmilyAI 前线导读:"加密货币、ICO、互联网催生的金钱产物——所有些东西可真太他妈的让人兴奋了,而你这个开发者是不是也坐不住了,也想拥抱这场疯狂的盛宴?但你应该从哪里开始做起呢?很高兴你跟我志同道合,都对这个领域超级感兴趣。但是,我猜你可能发现自己目前处于困惑的处境,因为在区块链飞速发展的时代,你还没有明确的渠道来学习相关知识。自从我离开 Airbnb,全职投入到区块链工作以后,很多人都问我是如何这个领域的。这是我的这份“权威”但不完整的指南,希望能够帮助你进入区块链开发领域。"本指南将分为十个部分:为什么要学习区块链开发?先决条件比特币的理论基础建立一个自己的区块链以太坊和智能合约编程智能合约安全性脱离辅助轮创建自己的项目探索区块链社区找到一份工作为什么要学区块链开发?在回答这个问题之前,我先给大家提个醒:区块链现在是一个被过分高估的领域。这样的价格不可持续,并且终将在某一天彻底崩盘。这一切都发生过,并可能再次发生。但是如果你长期在这个领域工作,你得学会排除价格的干扰。用 Emin Gun Sirer 的话来说就是,“价格是加密货币中最无趣的部分”。区块链是非常重要的技术,且毫无疑问将改变世界。如果你还不确定,我无法告诉你是不是应该到这个圈子里来。但是当初说服我进入这个圈子有五个理由:现在还早。比特币十年前就出世了,但在近十年才火起来,特别是随着 2015 年以太坊的推出。这个领域的大多数新公司和创意都建立在以太坊的基础之上,虽然以太坊现在仍很不成熟。所以,即使你从现在开始学习,你也可以在几年内成为世界级的专家。因为做这个的人不多,所以追上队伍不是很难。这就跟 20 世纪晚期才开始学深度学习的专家一样。这个领域还没有一个完善的人才培养渠道。大多数最优秀和最聪明的学生都专注于机器学习,网络编程或游戏开发。当然,区块链在公共话语中变得越来越有吸引力,但它仍然是可以促进你职业发展的诡异而具有颠覆性的话题。早期,区块链完全是密码发烧友、偏执狂和陌生人的专属领地,直到最近这种情况才发生变化。作为一个好奇而思想开放的开发者,相信你会为这个领域带来很多价值。大部分创新发生在学术界之外据我所知,中本聪不是一名学者。没有大学或机构开设连贯的区块链课程。这个领域的创新大部分是由爱好者、企业家和独立研究人员引领的。几乎所有你需要知道的东西都是在白皮书、博客文章、公共渠道和开源软件中可以找到。你需要做的,就是撸起袖子,开干!对人才的需求远远超过供给。在这个领域没有足够的开发人员,他们不能很快地得到训练。每个公司都在竞相聘请区块链人才,而项目人员应该是最能切身感受到人才稀缺的人。很多顶级公司因报酬不够有吸引力而留不住人才,因为他们的选择太多了。如果你掌握了一些技巧,就很容易找到工作。加密货币真的很酷。世界上还有什么工作可以造出像密码保护、去中心化货币这些科幻电影里才会出现的东西?这就像狂野的西部大开发一样,好的和坏的后果都有。这个领域将会更加透明,相关监管也会越来越完善。但毫无疑问,加密货币是你现在可以从事的最具创新性的领域之一。Naval Ravikant 在最近的一次采访中说道:成功的关键是能带给社会一些它想要,但是却不能独立获取的东西。学校里是学不到这些东西的,否则早就全球供应了。所以,你应该创造别人都不会的东西。目前,区块链是一个全新的,世人对之知之甚少的新事物,如果你成功地建立了去中心化技术的未来,世界绝对不会亏待你。先决条件我建议在你在深入这个领域之前了解一些基础知识。区块链建立在数十年的计算机科学、密码学和经济学研究之上,中本聪是一个叛徒,但即使是他也很了解区块链的历史。为了理解区块链的工作原理,您需要了解它们的构建块——区块链出现之前还出现过那些东西,以及为什么这些东西不起作用。以下是我们需要熟悉的先决条件,按照重要性依序排列。请注意,这些链接只是一个起点,这些话题你还需要做进一步的了解。计算机科学数据结构您需要熟悉主要数据结构的特征和复杂性保证:链接列表,二叉搜索树,哈希映射和图片(特别是在区块链中突出显示的有向非循环图)。它有助于从头开始构建区块链,以便更好地了解其工作原理和属性。加密密码学是加密货币的同名物和基础。所有加密货币都使用公钥 / 私钥加密作为身份和身份验证的基础。我建议您学习 RSA(很容易学,不需要非常好的数学背景),然后再学习 ECDSA。椭圆曲线密码术需要更多的抽象数学知识,虽然你不需要理解所有的细节,但要知道这是在大多数加密货币中使用的密码术,包括比特币。另一个重要的密码原语是密码哈希函数(cryptographic hash function)。这些可以用来构建承诺协议(Commitment scheme),这是建立 Merkle 树的构建块。 Merkle 树使 Merkle 证明(Merkle proofs)成为区块链用于可扩展性的关键优化之一。分布式系统这里是几本讲解分布式系统的很好的教科书,但它涉及范围广泛,也很难学。分布式系统对区块链的推理至关重要,所以在开始区块链编程之前,你必须有一点这方面的基础知识。当你的工作不仅在一台机器上进行时,你必须开始推理一致性和共识。你需要了解线性化( linearizable)和最终一致性(eventual consistency)模型之间的区别,容错一致性算法(如 Paxos 和 RAFT)的保证,以及分布式系统中推理时间上的难题,和安全与生存之间的权衡。在这些背景知识的帮助下,你才能够理解拜占庭容错共识(Byzantine fault-tolerant consensus,公共区块链的基本安全要求)方面的困难。您还需要了解 PBFT,这是第一个提供拜占庭式容错共识的可扩展算法之一。PBFT 是许多非证明区块链共识算法的基础。同样地,你不需要了解 PBFT 正确性的细节,只需要了解总体思路和安全保证即可。理解分布式数据库的传统方法(核心,因为区块链毕竟是数据库)也是非常有用的。你还需要了解一下分片(例如通过一致性哈希,Consistent hashing),leader-follower replication 和基于法定人数的提交(quorum-based commits),以及分布式哈希表(DHT),如 Chord 或 Kademlia。网络区块链的分布式主要来源于其对等网络拓扑结构。因此,区块链是过去的 P2P 网络的直接产物。要理解区块链通信模型,您需要了解计算机网络的基础知识:这意味着你需要知道 TCP vs UDP、数据包模型、IP 数据包,以及 Internet 路由的工作原理。公共区块链通常使用 Flooding 八卦协议来传播消息。了解从 Napster 到 Gnutella,BitTorrent 和 Tor 等 P2P 网络设计的历史对你来说是有益的。区块链有自己的地位,但吸取了这些网络的设计经验。经济学加密货币本质上是跨学科的,这也它之所以迷人的一部分原因。除了计算机科学、密码学和网络之外,它们还与经济学有着千丝万缕的关系。加密货币可以通过其经济结构获得许多安全属性,通常被称为隐密经济学(cryptoeconomics)。因此,经济学对理解加密货币来说至关重要。博弈论博弈论在加密货币经济学中扮演着最重要的角色,即对多个代理人之间的收益和激励的研究。你不需要对此有深入了解,但需要了解博弈论分析的基本工具,以及如何使用它们来分析一次和迭代游戏中的激励。关于博弈论,您需要了解两个关键概念,即纳什均衡(Nash equilibria )和谢林点(Schelling points),因为它们在隐含经济分析中占有突出的作用。宏观经济学加密货币不仅仅是协议,其也是一种货币形式。因此,它会受到宏观经济法(如果可以称之为法律)的限制。加密货币受到不同货币政策的影响,并会对通货膨胀和通货紧缩作出可预测的回应。你应该了解这些过程,以及它们对消费、储蓄等方面的影响。另一个有价值的经济学概念是货币流通速度,因为其会影响货币价值。个体经济学加密货币也与市场息息相关,这就需要了解微观经济学。你需要对供求曲线有非常敏锐的直觉,并具备推理竞争和机会成本(经常被用于加密货币挖掘)的能力。对于许多硬币分配和隐含经济系统,拍卖理论(auction theory)尤其重要。现在,你已经掌握了基本理论,开始进入区块链开发吧。比特币的理论基础2008 年 10 月,中本聪(Satoshi Nakamoto)发表了一篇白皮书,论述了分散数字货币的协议。他把这个协议称为比特币。在了解区块链背后的重要思想之前,您必须从比特币开始,了解 Satoshi 最初的初衷。首先,我建议您对工作证明(proof-of-work)和 fork choice rule(也被称为中本聪共识)有所了解,从这里开始:视频链接:v.qq.com/x/search/?q…我建议你多看一些视频解说,让这个想法在你的脑海里生根发芽:视频链接 2:www.youtube.com/watch?v=bBC…有了对于区块链的直觉之后,本文将对比特币的关键组成部分进行更深入的端到端的阐述。建立一个自己的区块链现在是时候构建您自己的基于工作量证明的区块链了。别担心,其实听起来难做起来容易,这里是一些很好的资源。首先,我开了一个视频讲座,讲解如何用 Ruby 做这件事情(即使你不是 Ruby 程序员,我也建议你看看):资源链接:github.com/Haseeb-Qure…在这里你还可以找到其他用各种编程语言编写的区块链应用。继续构建自己的模型。当你做到这一点时,你应该已经很好地掌握了如何在区块链(比特币)上创建一个简单的支付应用程序。你现在也应该有足够的背景知识,能够阅读和理解原来的比特币白皮书。要了解比特币挖掘的经济学和机制,我建议观看普林斯顿关于比特币和加密货币的比特币挖掘讲座。现在,你应该已经达到了了解比特币 header,并知道每个组件含义的水平。您还可以使用比特币区块浏览器,探索原始比特币交易。现在是研究比特币和加密货币历史的好时机。以下加州大学伯克利分校的视频做了很好的概述。视频链接:youtu.be/apYieuvnUaE一些额外的资源:比特币的学术先驱比特币机制:UTXOs 和比特币脚本(比特币脚本不是非常重要,大致知道它能做什么即可)比特币 forks 指南软分叉和矿工信号双重打击,51%的攻击和自私的开采重播攻击比特币可扩展性问题,这是比特币生态系统中大部分争议的来源。你应该知道为什么比特币人会对块的大小有很多争议。隔离的证人,也就是 SegWit,不是必须了解,但会经常出现。闪电网络(Lightning Network)是比特币更重要的拓展解决方案之一,也推广到其他区块链比特币完整节点,比特币费用统计,图表,图表和其他图表比特币能源消耗指数(在发布时,比特币开采能源消耗量相当于秘鲁全国)Gwern 对比特币龌龊之处作了深刻的论述如果你想更深一步了解,可以参考 Jameson Lopp 关于比特币资源的资源。以太坊和智能合约编程现在,您已经构建了自己的区块链,知道比特币的动态,现在是研究以太坊的时候了。理解区块链和工作量证明如何在对等网络内实现分布式拜占庭式容错共识。但支付网络只是你可以应用区块链的应用程序之一。在 2013 年,以太坊的创始人 Vitalik Buterin 问道:将区块链应用到分布式计算机上会怎样?在以太坊上,你花钱让矿工在这个分布式虚拟机上运行自己的程序。这意味着您可以使用图灵完整编程语言(不同于比特币脚本)执行任意计算。显然,这包括所有的支付程序,因此以太坊比特币的功能更强大,并做了进一步创新。其后是智能合约,即在此类虚拟机上运行的程序的名称。智能合约可以根据程序的执行直接与区块链的数字货币进行交互。换句话说,您可以创建自动执行的金融合同。这是一个疯狂的想法,用这个编程模型,你几乎可以做到所有科幻作品中的事情。以太坊掀起了 ICO 和区块链开发的浪潮。它是排在比特币后面的第二大加密货币,它的开发者是排名第三的加密货币币种的 10 倍之多。它拥有最强大的开发团队,最成熟的工具,大多数 ICO 和项目都与其相关,且最被业内看好。如果你正在做区块链开发工作,你很可能将会为以太坊智能合约编写代码。(即使无志于此,了解一下这个领域的趋势也无妨。)首先,关于高层次以太坊的详解:视频链接:www.youtube.com/watch?v=mCz…以太坊背后的思想也催生了一波隐性经济学的创新浪潮。你应该接触一下 DAO 的思想。好吧,幻想告一段落,让我们来深入了解背后的技术吧。Preethi Kasireddy 关于以太坊黄皮书和内部结构概览介。以太坊使用的是账户模式而不是比特币的 UTXO 模式,您很快就会明白为什么这会使编写智能合约变得更容易。与任何技术一样,了解以太坊的最好方法是创建一些小型项目。以太坊的主要编程语言是 Solidity,它是一种静态类型的 JavaScript-esque 语言,实话说有很多缺点和设计问题。像 Viper 这样的更强大的语言可以在推出之后取代它,但目前,Solidity 是智能合约编程的通用语言。这基本上是以太坊的 JavaScript,所以你需要学会它(和它的陷阱)。第一次接触 Solidity 开发时,我建议您通读所有的 CryptoZombies 教程。这些是高质量的 Codecademy-esque 教程,可以学到 Solidity 编程的基础知识。现在,你的胃口被吊起来了,是时候自己开发了。入门以太坊的课题是构建一个兼容 ERC-20 的令牌。我推荐这本指南作为你完成任务的指导教程。Remix 是一个浏览器中的 Solidity 编辑器和编译器, 它基本上是以太坊开发的辅助轮,所以我建议把 Remix 中的其他练习都做一遍。设置一个本地区块链以了解以太坊工具也值得一试。本教程很好地介绍了一个端到端的区块链堆栈,并对这些堆栈进行了解释。接下来,我建议你创建一个投票系统,称之为以太坊的 Todo。 Karl Floersch 的教程讲解了如何建立一个安全的提交显示投票系统。很好,现在该中期考试了:创建一个安全的投币游戏,两个玩家可以安全地进行投掷硬币游戏。这次没有教程,自己动手做吧。在这个过程中要考虑到可能发生的攻击,如 玩家如何作弊?你能确保他们坦诚相待吗?这里有一些提示。智能合约的安全性对于区块链开发来说,保证安全性是绝对必要的。智能合约一直被灾难性的黑客攻击,包括 DAO、Parity Wallet,以及 Parity Wallet hack 2(现在竟然还有他们自己的 T 恤衫)威胁着。如果你打算编写生产智能合约,你必须把这三个黑客透彻地分析一遍。然而事实上,智能合同很难尽善尽美。虽然编程工具链的改进让黑客更难实施攻击,但编程员会不可避免地犯错误。智能合约编程过程中还会犯许多微妙的错误,例如抢先交易或安全随机生成。作为一名智能合同开发人员,您必须把安全性放在第一位,所有处理大量资金流动的代码都应该通过像 Oyente 或 Securify 这样的静态分析器来进行,并进行彻底的测试,然后由有经验的智能合约审计师进行审计。为了结果更可靠,您还可以使用 OpenZeppelin 开源合同等预审组件。为了加强安全性,我建议您使用 OpenZeppelin 的 Ethernaut,在这个游戏中您可以找到攻击智能合约黑客的漏洞,这对你防范攻击有很重要的参考价值。Phil Daian 发起了一项有名的智能合约黑客挑战赛,叫做 Hack This Contract。在这之后,我强烈建议阅读由 ConsenSys 编写的“智能合同最佳实践(Smart Contract Best Practices)”。预计你将会在智能合约编程生涯中多次重温这个文档。由安全专家推荐的参考书目也值得你进一步阅读。脱离辅助轮如果你已经做到了这一点,现在就应该已经做好了通过 Remix 的准备,并可以开始正式使用 Solidity 开发堆栈了。大多数开发人员推荐使用 VSCode 或 Atom 作为文本编辑器,因为它们的 Solidity 插件相当完善。为了与本地区块链进行交互,你需要使用 Ganache(以前称为 TestRPC),以及用于测试(基于 JS 的)和配置构建管道的 Truffle 框架。现在是研究 IPFS 的好时机,您可以将其作为一个比以太坊成本便宜很多的分布式存储库。以下是创始人 Juan Benet 的简短说明:youtu.be/skMTdSEaCtA在与以太坊和和 IPFS 完整节点交互方面,大多数开发人员推荐使用 Infura。在以太网络上,Etherscan 和 ETH 加油站可以提供有用的实时统计数据。完成 Web3 堆栈设置后,尝试部署一个端到端的 Dapp(分散式应用程序)。本教程是一个使用 Node 和 Postgres 作为后端的完整堆栈概览,另外,本教程演示如何使用 IPFS 作为持久层来创建完全分散的应用程序。创建自己的项目现在,你应该对大部分技术比较熟悉了,剩下的就是开始构建项目,并深入到区块链社区。首先,开始创建自己的项目。如果有一些很棒的想法让你兴奋,那就去实现它,然邀请朋友来攻击它!如果你还没有好的想法,还有很多高质量的开源项目可以练手。OpenZeppelin 是创建智能合约不错的选择。此外,我建议你最好选择一个你热衷的开发项目,进入他们的 Slack 或 Rocketchat,告诉他们你做一些贡献,让他们给你分配一些小任务,,或者在他们的 Github 上发现未解决的问题。请注意,虽然我一直专注于协议和智能合约开发,但区块链公司需要 Web 开发人员来构建其核心功能。这些角色通常需要与区块链进行交互,所以你对于区块链模型应该有所了解。但是对于区块链初创公司的许多工程师来说,他们的大部分工作是构建一个 Python 网络服务器,或者设计一个 React 前端,与区块链互动可能只是这项工作的一小部分。您不必专注于智能合约开发,因为实际上这只是区块链工程的一部分。除开源贡献之外,还有许多区块链黑客竞赛不断涌现。大多数项目都有一个你可以加入的免费的公共 Slack,以及一个非常活跃的以太坊 Gitter 社区。当你深入到这个领域时,你最终会在 Telegram、Gitter 等场所发现志同道合的伙伴,一起学习进步。区块链社区真正去了解区块链世界的最好方法就是沉浸其中,阅读和聆听最聪明的人,尤其是他们过去写过的东西。这一直是我尝试进入一个新领域时的策略,对我来说也是回报丰厚。虽然好的区块链内容很多,但同时也有很多废话。以下是我推荐的学习社区。媒体我推荐三个很棒的播客,分别是 Software Engineering Daily Blockchain interviews,很多关于科技和加密货币的介绍和指导。其次是 Epicenter 和 Unchained,相信你听过之后会去翻已经播过的节目来听。另一个有趣的技术播客是 Conspiratus。此外还有几个很好的 Youtube 频道(尽管 Youtube 上有很多垃圾),如 Ethereum Foundation ,并观看 Devcon3 演示文稿。伯克利的区块链课程记录了他们的许多讲座,其中大部分都是很棒的技术概述。另外还有 Decypher Media、Jackson Palmer 等技术频道。在线阅读区块链发烧友通常在两个地方发表他们的意见:Reddit 和 Twitter。Reddit 上的大多数用户质量不高,大多是一些废话。r/Ethereum 上的内容一贯质量不错(对于特定的加密货币,还有一些了解透彻的用户)。然而,这些人大多数是投资人,别太关注他们说了啥。远离比特币相关的用户,比特币社区在圈子里臭名昭著,人人敬而远之。Twitter 更是鱼龙混杂。无论如何,大多数区块链人都活在 Twitter 的世界里。根据我的经验,这里的区块链人有五种类型:开发者、企业家、记者、商人,以及“思想领袖”。对于这些人,我建议你远离“思想领袖”,企业家无所谓,记者通常只关注重大消息,除非你是个商人,否则对于开发者来说,这些消息只会让你分心。最应该关注的是真正的开发者。目前,他们是最重要,也是正在推动技术的发展的群体。以下是特定类型的代表人物:开发者Vitalik Buterin,以太坊Zooko Wilcox,ZCashNick Szabo,智能合约的发明者弗拉德 Zamfir,以太坊Marco Santori,Cooley LLPRiccardo“fluffypony”Spagni,MoneroMatt Liston,Gnosis企业家Balaji Srinivasan,Earn.comErik Voorhees,变形投资者Naval Ravikant,MetaStableAri Paul,Blocktower CapitalLinda Xie, Scalar CapitalChris Burniske,Placeholder记者Tuur Demeester,Adamant ResearchLaura Shin,福布斯(你也可以关注我,虽然我绝对不在这个名单之列。)我建议你最好尽可能少关注 Twitter 和 Reddit,只关注一些新闻速递了解最新消息就足够了,比如 Inside Bitcoin、Token Economy 、 Week in Ethereum.除此之外,您不需要实时监控最新新闻,而应该专注于项目创建和学习。以下使一些好的技术博客:Vitalik Buterin,网站上有很棒的区块链和密码经济分析(阅读所有他以前的博客文章,Vitalik 被普遍认为是一代区块链人的思想家)Hacking,Distributed,由康奈尔大学研究人员进行区块链安全分析Unenumerated,尼克·萨博(Nick Szabo)的博客文章,论述加密货币在社会中作用的文章Money Stuff:马特•莱文(Matt Levine)的 Bloomberg Syndication,深入分析市场、金融和区块链新闻Vlad Zamfir 对国有和公共区块链持温和谨慎的态度Chris Burniske 撰写了一系列关于如何评估加密资产的高质量博客文章Jameson Lopp 从区块链生态系统软件工程师的角度出发,撰写了一系列伟大的技术文章Tim Swanson 的 Great Wall of Numbers 对区块链狂潮进行了清醒而条理清晰的解构,特别是在企业领域(你也可以阅读我的博客,再次声明,虽然我仍不在这个名单之列。)书籍和课程如果你想要更加系统地学习区块链,就需要看一些高质量的书籍和课程。区块链最好的教科书是 Bitcoin and Cryptocurrency Technologies (内含普林斯顿 Coursera 课程)。在这个领域,其他的书籍我只推荐 Andreas Antonopoulos 和以太坊创始人的 Gavin Wood 共同撰写,O'Reilly 出版的 Mastering Bitcoin。非技术书我推荐 Nathaniel Popper 的 Digital Gold。几乎所有值得阅读的东西都是在博客上,而不是在书本上,因为这个领域正在飞速发展,最重要的人物很少有时间写书,而且书本在发行时经常已经过时了。你还可以通过一些高质量的课程来系统学习。这是一些普林斯顿 Coursera 课程(Youtube 上也有视频)和加州大学伯克利分校的一些讲座链接。对于那些想要进入智能合约开发的人们,Consensys Academy 的课程也不错。我还在旧金山的布拉德菲尔德计算机科学学院为软件开发人员教授为期 4 周的加密货币研讨会。如果你是旧金山的软件工程师,想要了解更多关于加密货币背后的理论和实践的知识,可以来听一听。找工作正如我之前所说的,区块链初创公司正在疯狂地招聘人才。如果你真的做到了以上我所说的,甚至只做到了一半,那么你已经能够在这个领域有所作为了。 AngelList 在如何在密码空间找到工作做了一个很好的写作。这里是几个不错的区块链相关工作发布区:AngelList 加密启动BlockchainJobzEthereum JobsBe in Crypto区块链工作委员会Crypto Jobs ListGoogle(区块链搜索查询)ConsenSys Jobs(旗下有很多以太坊创业工作室)我知道一些特别有前途的区块链初创公司正在招聘开发人员:0X达摩实验室Civic市场上还有一些大公司在招聘开发人员:Coinbase,加密界的 Google,一直在疯狂招聘Stellar 和 Ripple,如果你想做对企业友好的加密货币,它们不错的选择Square 已经整合了一些区块链,但不知道他们是否在进行外部招聘IBM、Visa 或 JP 摩根但是在我看来,选择进哪一家公司最好是因为对某一个项目感兴趣,并可以直接参与开发。大多数区块链团队都愿意为合适的人才进行远程招聘。许多开发者可以通过 Twitter,Github 或公共 Slack 渠道,展示自己的技术能力,并表现出一定的主动性,他们会给人留下深刻的印象。这就是我为对你的建议,完成这些之后,我相信你会比我走的更远。兔虫洞我向你展示的这些仅仅是一个开端。加密货币仍然处于起步阶段,我真的相信这是一个值得投入的,发展最迅速的领域。我相信这个指南在一年之内就会过时,当你进入这个领域时还需要不断探索,不断进步,不断学习。更多干货内容,可关注AI前线,ID:ai-front,后台回复「AI」、「TF」、「大数据」可获得《AI前线》系列PDF迷你书和技能图谱。
2023年03月24日
5 阅读
0 评论
0 点赞
2023-03-24
区块链技术开发相关资料 - 介绍、教程、项目、资料、应用
原文链接:github.com
2023年03月24日
8 阅读
0 评论
0 点赞
1
...
75
76
77
...
109