分类 技术前沿 下的文章 - 六币之门
首页
视频教程
网站导航
活动日历
关于我们
用户投稿
推荐
新闻动态
搜 索
1
融资周报 | 公开融资事件11起;加密技术公司Toposware完成500万美元融资,Polygon联创参投
107 阅读
2
六币日报 | 九只比特币ETF在6天内积累了9.5万枚BTC;贝莱德决定停止推出XRP现货ETF计划
73 阅读
3
六币日报 | 美国SEC再次推迟对灰度以太坊期货ETF做出决定;Do Kwon已出黑山监狱等待引渡
68 阅读
4
融资周报 | 公开融资事件27起;L1区块链Monad Labs完成2.25亿美元融资,Paradigm领投
68 阅读
5
【ETH钱包开发06】查询某个地址的交易记录
43 阅读
新闻动态
每日快报
一周精选
融资情况
项目投研
自治组织
数字藏品
去中心化应用
去中心化游戏
去中心化社交
去中心化金融
区块链交易所
科普知识
小白入门
用户手册
开发文档
行业报告
技术前沿
登录
搜 索
标签搜索
新闻
日报
元歌Eden
累计撰写
1,087
篇文章
累计收到
0
条评论
首页
栏目
新闻动态
每日快报
一周精选
融资情况
项目投研
自治组织
数字藏品
去中心化应用
去中心化游戏
去中心化社交
去中心化金融
区块链交易所
科普知识
小白入门
用户手册
开发文档
行业报告
技术前沿
页面
视频教程
网站导航
活动日历
关于我们
用户投稿
推荐
新闻动态
用户登录
登录
找到
109
篇与
技术前沿
相关的结果
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日
7 阅读
0 评论
0 点赞
2023-03-24
区块链技术开发相关资料 - 介绍、教程、项目、资料、应用
原文链接:github.com
2023年03月24日
7 阅读
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日
4 阅读
0 评论
0 点赞
2023-03-24
[译] 使用 Web3 和 Vue.js 来创建你的第一个以太坊 dAPP(第二部分)
原文地址:Create your first Ethereum dAPP with Web3 and Vue.JS (Part 2) 原文作者:Alt Street 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:L9m 校对者:allen, 玉儿 使用 Web3 和 Vue.js 来创建你的第一个以太坊 dAPP(第一部分) 使用 Web3 和 Vue.js 来创建你的第一个以太坊 dAPP(第二部分) 使用 Web3 和 Vue.js 来创建你的第一个以太坊 dAPP(第三部分) 点此在 LinkedIn 分享本文 »欢迎回到这个很棒的系列教程的第二部分,在个教程中我们要亲身实践,创建我们的第一个去中心化应用(decentralized application)。在第二部分中,我们将介绍 VueJS 和 VueX 的核心概念以及 web3js 与 metamask 的交互。如果你错过了第一部分,你可以在下面找到,也请在 Twitter 上关注我们。进入正题:VueJSVueJS 是一个用于构建用户界面的 JavaScript 框架。初看起来,它类似传统的 mustache(译者注:原文为 moustache)模板,但其实 Vue 在后面做了很多工作。<div id=”app”> } </div> var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } }) 复制代码这是一个很基本的 Vue 应用的结构。数据对象中的 message 属性会被渲染到屏幕上 id 为「app」的元素中,当我们改变 message 时,屏幕上的值也会实时更新。你可以去这个 jsfiddle 上查看(开启自动运行):jsfiddle.net/tn1mfxwr/2/。VueJS 的另一个重要特征是组件。组件是小的、可复用的并且可嵌套的小段代码。本质上,一个 Web 应用是由较小组件组成的组件树构成的。当我们着手编写我们前端应用时,我们会愈加清楚。这个页面示例是由组件构成的。页面由三个组件组成的,其中的两个有子组件。状态的整合: Vuex我们使用 Vuex 管理应用的状态。类似于 Redux,Vuex 实现了一个对于我们应用数据「单一数据源」的容器。Vuex 允许我们使用一种可预见的方法操作和提供应用程序使用的数据。它工作的方式是非常直观的。当组件需要数据进行渲染时,它会触发(dispatch)一个 action 获取所需的数据。Action 中获取数据的 API 调用是异步的。一旦取得数据,action 会将数据提交(commit)给一个变化(mutation)。然后,Mutation 会使得我们容器(store)的状态发生改变(alert the state)。当组件使用的容器中的数据改变时,它会重新进行渲染。Vuex 的状态管理模式。在我们继续之前...在第一部分中,我们已经通过 vue-cli 生成了一个 Vue 应用,我们也安装了所需的依赖。如果你没有这样做的话,请查看上面第一部分的链接。如果你正确完成了各项的话,你的目录看起来应该是这样的:新生成的 vue 应用。小提示:如果你要从这里复制粘贴代码段的话,请在你的 .eslintignore 文件中添加 /src/,以免出现缩进错误。你可以在终端中输入 npm start 运行这个应用。首先我们需要清理它包含的这个默认的 Vue 应用。 注解:尽管只有一个路由,但是我们还是会使用 Vue Router,虽然我们并不需要,但是因为这个教程相当简单,我想将其保留会更好。 贴士:在你的 Atom 编辑器右下角中将 .vue 文件设置为 HTML 语法(高亮)现在处理这个刚生成的应用:在 app.vue 中删除 img 标签和 style 标签中的内容。 删除 components/HelloWorld.vue,创建两个名为 casino-dapp.vue(我们的主组件)和 hello-metamask.vue(将包含我们的 Metamask 数据)的两个新文件。 在我们的新 hello-metamask.vue 文件中粘贴下面的代码,它现在只显示了在一个 p 标签内的「hello」文本。 <template> <p>Hello</p> </template> <script>export default { name: 'hello-metamask' }</script> <style scoped> </style> 复制代码现在我们首先导入 hello-metamask 组件文件,通过导入文件将其加载到主组件 casino-app 中,然后在我们的 vue 实例中,引用它作为模板中一个标签。在 casino-dapp.vue 中粘贴这些代码: <template> <hello-metamask/> </template> <script>import HelloMetamask from '@/components/hello-metamask' export default { name: 'casino-dapp', components: { 'hello-metamask': HelloMetamask } }</script> <style scoped> </style> 复制代码现在如果你打开 router/index.js 你会看到 root 下只有一个路由,它现在仍指向我们已删除的 HelloWorld.vue 组件。我们需要将其指向我们主组件 casino-app.vue。 import Vue from 'vue' import Router from 'vue-router' import CasinoDapp from '@/components/casino-dapp' Vue.use(Router) export default new Router({ routes: [ { path: '/', name: 'casino-dapp', component: CasinoDapp } ] }) 复制代码关于 Vue Router:你可以增加额外的路径并为其绑定组件,当你访问定义的路径时,在 App.vue 文件中的 router-view 标签中,对应的组件会被渲染,并进行显示。在 src 中创建一个名为 util 的新文件夹,在这个文件夹中创建另一个名为 constants 的新文件夹,并创建一个名为 networks.js 的文件,粘贴下面的代码。我们用 ID 来代替以太坊(Ethereum)网络名称显示,这样做会保持我们代码的整洁。 export const NETWORKS = { '1': 'Main Net', '2': 'Deprecated Morden test network', '3': 'Ropsten test network', '4': 'Rinkeby test network', '42': 'Kovan test network', '4447': 'Truffle Develop Network', '5777': 'Ganache Blockchain' } 复制代码最后的但同样重要的(实际上现在用不到)是,在 src 中创建一个名为 store 的新文件夹。我们将在下一节继续讨论。 如果你在终端中执行 npm start,并在浏览器中访问 localhost:8000,你应该可以看到「Hello」出现在屏幕上。如果是这样的话,就表示你准备好进入下一步了。设置我们的 Vuex 容器在这一节中,我们要设置我们的容器(store)。首先从在 store 目录(上一节的最后一部分)下创建两个文件开始:index.js 和 state.js;我们先从 state.js 开始,它是我们所检索的数据一个空白表示(Blank representation)。let state = { web3: { isInjected: false, web3Instance: null, networkId: null, coinbase: null, balance: null, error: null }, contractInstance: null } export default state 复制代码好了,现在我们要对 index.js 进行设置。我们会导入 Vuex 库并且告诉 VueJS 使用它。我们也会把 state 导入到我们的 store 文件中。import Vue from 'vue' import Vuex from 'vuex' import state from './state' Vue.use(Vuex) export const store = new Vuex.Store({ strict: true, state, mutations: , actions: }) 复制代码最后一步是编辑 main.js ,以包含我们的 store 文件:import Vue from 'vue' import App from './App' import router from './router' import from './store/' Vue.config.productionTip = false /* eslint-disable no-new */ new Vue({ el: '#app', router, store, components: , template: '<App/>' }) 复制代码干得好!因为这里有很多设置,(所以请)给你自己一点鼓励。现在已经准备好通过 web3 API 获取我们 Metamask 的数据,并使其在我们的应用发挥作用了。该来点真的了!入门 Web3 和 Metamask就像前面提到的,为了让 Vue 应用能获取到数据,我们需要触发(dispatch)一个 action 执行异步的 API 调用。我们会使用 promise 将几个方法链式调用,并将这些代码提取(封装)到文件 util/getWeb3.js 中。粘贴以下的代码,其中包含了一些有助你遵循的注释。我们会在代码块下面对它进行解析:import Web3 from 'web3' /* * 1. Check for injected web3 (mist/metamask) * 2. If metamask/mist create a new web3 instance and pass on result * 3. Get networkId - Now we can check the user is connected to the right network to use our dApp * 4. Get user account from metamask * 5. Get user balance */ let getWeb3 = new Promise(function (resolve, reject) { // Check for injected web3 (mist/metamask) var web3js = window.web3 if (typeof web3js !== 'undefined') { var web3 = new Web3(web3js.currentProvider) resolve({ injectedWeb3: web3.isConnected(), web3 () { return web3 } }) } else { // web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7545')) GANACHE FALLBACK reject(new Error('Unable to connect to Metamask')) } }) .then(result => { return new Promise(function (resolve, reject) { // Retrieve network ID result.web3().version.getNetwork((err, networkId) => { if (err) { // If we can't find a networkId keep result the same and reject the promise reject(new Error('Unable to retrieve network ID')) } else { // Assign the networkId property to our result and resolve promise result = Object.assign(, result, ) resolve(result) } }) }) }) .then(result => { return new Promise(function (resolve, reject) { // Retrieve coinbase result.web3().eth.getCoinbase((err, coinbase) => { if (err) { reject(new Error('Unable to retrieve coinbase')) } else { result = Object.assign(, result, ) resolve(result) } }) }) }) .then(result => { return new Promise(function (resolve, reject) { // Retrieve balance for coinbase result.web3().eth.getBalance(result.coinbase, (err, balance) => { if (err) { reject(new Error('Unable to retrieve balance for address: ' + result.coinbase)) } else { result = Object.assign(, result, ) resolve(result) } }) }) }) export default getWeb3 复制代码第一步要注意的是我们使用 promise 链接了我们的回调方法,如果你不太熟悉 promise 的话,请参考此链接。下面我们要检查用户是否有 Metamask(或 Mist)运行。Metamask 注入 web3 本身的实例,所以我们要检查 window.web3(注入的实例)是否有定义。如果是否的话,我们会用 Metamask 作为当前提供者(currentProvider)创建一个 web3 的实例,这样一来,实例就不依赖于注入对象的版本。我们把新创建的实例传递给接下来的 promise,在那里我们做几个 API 调用:web3.version.getNetwork() 将返回我们连接的网络 ID。 web3.eth.coinbase() 返回我们节点挖矿的地址,当使用 Metamask 时,它应该会是已选择的账户。 web3.eth.getBalance(<address>) 返回作为参数传入的该地址的余额。 还记得我们说过 Vuex 容器中的 action 需要异步地进行 API 调用吗?我们在这里将其联系起来,然后再从组件中将其触发。在 store/index.js 中,我们会导入 getWeb3.js 文件,调用它,然后将其(结果)commit 给一个 mutation,并让其(状态)保留在容器中。在你的 import 声明中增加:import getWeb3 from '../util/getWeb3' 复制代码然后在(store 内部)的 action 对象中调用 getWeb3 并 commit 其结果。我们会添加一些 console.log 在我们的逻辑中,这样做是希望让 dispatch-action-commit-mutation-statechange 流程更加清楚,有助于我们理解整个执行的步骤。registerWeb3 () { console.log('registerWeb3 Action being executed') getWeb3.then(result => { console.log('committing result to registerWeb3Instance mutation') commit('registerWeb3Instance', result) }).catch(e => { console.log('error in action registerWeb3', e) }) } 复制代码现在我们要创建我们的 mutation,它会将数据存储为容器中的状态。通过访问第二个参数,我们可以访问我们 commit 到 mutation 中的数据。在 mutations 对象中增加下面的方法:registerWeb3Instance (state, payload) { console.log('registerWeb3instance Mutation being executed', payload) let result = payload let web3Copy = state.web3 web3Copy.coinbase = result.coinbase web3Copy.networkId = result.networkId web3Copy.balance = parseInt(result.balance, 10) web3Copy.isInjected = result.injectedWeb3 web3Copy.web3Instance = result.web3 state.web3 = web3Copy } 复制代码很棒!现在剩下要做的是在我们的组件中触发(dispatch)一个 action,取得数据并在我们的应用中进行呈现。为了触发(dispatch)action,我们将会用到 Vue 的生命周期钩子。在我们的例子中,我们要在它创建之前触发(dispatch)action。在 components/casino-dapp.vue 中的 name 属性下增加以下方法:export default { name: 'casino-dapp', beforeCreate () { console.log('registerWeb3 Action dispatched from casino-dapp.vue') this.$store.dispatch('registerWeb3') }, components: { 'hello-metamask': HelloMetamask } } 复制代码很好!现在我们要渲染 hello-metamask 组件的数据,我们账户的所有数据都将在此组件中进行呈现。从容器(store)中获得数据,我们需要在计算属性中增加一个 getter 方法。然后,我们就可以在模板中使用大括号来引用数据了。<template> <div class='metamask-info'> <p>Metamask: }</p> <p>Network: }</p> <p>Account: }</p> <p>Balance: }</p> </div> </template> <script>export default { name: 'hello-metamask', computed: { web3 () { return this.$store.state.web3 } } }</script> <style scoped></style> 复制代码太棒啦!现在一切都应该完成了。在你的终端(terminal)中通过 npm start 启动这个项目,并访问 localhost:8080。现在,我们可以看到 Metamask 的数据。当我们打开控制台,应该可以看到 console.log 输出的 —— 在 Vuex 那段中的描述状态管理模式信息。说真的,如果你走到了这一步并且一切正常,那么你真的很棒!这是本系列教程目前为止,难度最大的一部分。在下一部分中,我们将学到如何轮询 Metamask(如:账户切换)的变化,并将在第一部分描述智能合约与我们的应用相连接。以防万一你出现错误,在这个 Github 仓库 的 hello-metamask 分支上有此部分完整的代码不要错过本系列的最后一部分!如果你喜欢本教程的话,请让我们知道,谢谢你坚持读到最后。ETH — 0x6d31cb338b5590adafec46462a1b095ebdc37d50想完成自己的想法吗?我们提供以太坊(Ethereum)概念验证和开发众募。Alt Street —— 区块链顾问:区块链概念验证和代币销售等等... altstreet.io 掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。
2023年03月24日
8 阅读
0 评论
0 点赞
2023-03-24
以太坊智能合约开发试水-开发一个自己的智能合约需要准备什么
准备工作-必备知识智能合约智能合约就是存在于以太坊区块链上的计算机程序(用 Solidity 语言编写),仅在由用户(或其他合约)发出的交易触发时执行(区块链存储的是状态,智能合约是区块链用于状态转换的方式),无法由发起者直接调用 一旦智能合约发布到以太坊,只要以太坊存在,它就会一直在线并运行,就连创作者也无法让它离线 智能合约并不只是一个可以自动执行的计算机程序,也是一个系统参与者,它可以对接收到的信息进行回应,可以接收和储存价值,也可以向外发送信息和价值 智能合约就像一个可以被信任的人,可以临时保存资产,总是按照事先的规则执行操作-可以理解成自动贩卖机 适合场景SoliditySolidity是一种智能合约高级语言,运行在Ethereum虚拟机(EVM)之上 Solidity是以太坊的首选语言 语法接近于Javascript,是一种面向对象的语言 使用Solidity,您可以创建用于投票、众筹、盲拍卖和多签名钱包等用途的合同(程序) 文档 HardhatHardhat是一个编译、部署、测试和调试以太坊应用的开发环境。它可以帮助开发人员管理和自动化构建智能合约和dApps过程中固有的重复性任务,并围绕这一工作流程轻松引入更多功能。 Hardhat内置了Hardhat网络,这是一个专为开发设计的本地以太坊网络。主要功能有Solidity调试,跟踪调用堆栈、console.log()和交易失败时的明确错误信息提示等。 文档 QuickNode高性能以太坊节点服务 使用专用节点以获得更好的区块链访问性能 快捷发布以太坊区块链(帮助广播发布合约和交易,以便快速被挖矿者捕获到,一旦被捕获到,发布和交易行为就会作为合法交易广播到区块链上,链上的所有节点就会就会对自己的数据进行更新) QuikNode支持几乎所有流行的以太坊测试网,这使得开发者在测试网的选择上有了充分的灵活性,可以在自己喜欢的测试网上进行Dapp的测试 官网 Metamask 加密钱包购买、存储、发送和交换代币 MetaMask可作为浏览器扩展程序和移动应用程序提供,为您提供密钥库、安全登录、令牌钱包和令牌交换——管理您的数字资产所需的一切。 保存个人数据 MetaMask在您的设备上生成密码和密钥,因此只有您可以访问您的帐户和数据。您可以选择要分享的内容和保密的内容。 探索区块链应用 MetaMask提供了连接到基于区块链的应用程序的最简单但最安全的方式。在新的去中心化网络上进行交互时,您始终处于控制之中。 相当于你的个人账户 chrome插件示例: GoerliethGoerli 是最活跃的以太坊测试网之一 获取测试以太币,以便进行开发测试 水龙头:goerli-faucet.pk910.de/ ,只要输入你的钱包地址,就可以开始挂机挖矿,可以增加工作数量以提高效率 Gas以太坊的Gas(中文直译:气体),是以太坊上衡量工作量的计量单位,类似于我们每小时用了多少度电用千瓦/小时。 以太坊上产生的各种交易、存储等活动都是需要Gas来推动的,Gas好比是燃料,推动以太坊虚拟机(EVM)来工作。 在Goerli上挖到的测试币就是用来支付这个gas费用,同时智能合约里面也能发起转账 区块交易记录查询官网 查看所有区块和交易(不管是谁的) 查看指定合约发布状态 查看交易记录和交易内容(无需登录,只需要输入地址hash则可以查看) goerli.etherscan.io/address/[合约… 开发过程本地开发智能合约步骤使用hardhat创建项目, 参考文档 创建xxx.sol文件,使用solidity语法进行合约编写,例如我的合约名称为:WavePortal // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.17; import "hardhat/console.sol"; contract WavePortal { //... // 具体实现可参考solidy文档 } 复制代码编写测试js: scripts/run.js(通过hardhat提供的全局对象hre来获取ether环境数据:测试或实际环境) const waveFactory = await hre.ethers.getContractFactory("WavePortal") // 发布,并充值0.001(可用于后续合约内部交易) const waveContract = await waveFactory.deploy({ value: hre.ethers.utils.parseEther("0.001") }) 复制代码运行测试程序 npx hardhat run scripts/run.js 复制代码发布智能合约步骤编写发布js:scripts/deploy.js // 调用智能合约的方法更新任意参数也视为“交易-transaction” // 发布一个智能合约也属于-transaction const mainD = async () => { const [deployer] = await hre.ethers.getSigners() const accountBalance = await deployer.getBalance() console.log('Deploying contracts with account:', deployer.address) console.log('Account balance:', accountBalance.toString()) const waveFactory = await hre.ethers.getContractFactory("WavePortal") const waveContract = await waveFactory.deploy({ value: hre.ethers.utils.parseEther("0.001"), }) await waveContract.deployed() console.log('WavePortal address:', waveContract.address) } const runMainD = async () => { try { await mainD(); process.exit(0) } catch (err) { console.log(err); process.exit(1) } } runMainD(); 复制代码执行发布命令-以下为发布到goerli网络 npx hardhat run scripts/deploy.js --network goerli 复制代码提交修改后的智能合约代码到区块链,尽管只是修改一部分,都相当于是新的一次发布,原来保存在区块内的数据会丢失; 前端需要更新新的区块地址和abi文件(执行发布后生成的json文件) 前端调用连接加密钱包metamask MetaMask会向网页注入一个全局的API变量window.ethereum,可以从用户接入的区块链读取数据,并且能够提示用户签名要提交的交易 通过window.ethereum能获取用户签名的加密钱包账户 引入发布合约生成的ABI json文件 安装引用ethers.js 依赖包 根据合约地址和ABI文件实例化合约,以便调用合约方法 连接到以太坊节点,读取账户地址数据等 一个小demo如果你已经有metamask账户,欢迎访问我的测试Dapp应用: waveportal-starter-project.caryiwong.repl.co/连接钱包,切换到goerli测试网络后就可以跟我打招呼啦~
2023年03月24日
4 阅读
0 评论
0 点赞
2023-03-24
从以太坊Solidity概述以及合约示例开始学习区块链技术吧!
本文正在参加「金石计划 . 瓜分6万现金大奖」 Solidity语言简介solidity是一种静态类型的编程语言,用于开发在以太坊(Ethereum)上运行的智能合约。solidity被编译为可在以太坊虚拟机(EVM)上运行的字节码。以太坊虚拟机(EVM)是智能合约的运行环境。借由solidity,开发人员能够编写出运行在以太坊上的应用程序。当然,目前市面上不止一种智能合约,很多链都有自己的智能合约,他们基本上都是基于solidity衍生出来的。比如波场、sCrypt、币安链等等。solidity是一门专门被设计的 可在以太坊虚拟机上运行的语言。 以太坊简介以太坊(Ethereum)是一个开源的有智能合约功能的公共区块链平台。以太坊平台上面提供各种模块让用户来搭建应用,如果将搭建应用比作造房子,那么以太坊就提供了墙面、屋顶、地板等模块,用户只需像搭积木一样把房子搭起来,因此在以太坊上建立应用的成本和速度都大大改善。以太坊通过一套图灵完备的以太坊虚拟机语言(Ethereum Virtual Machinecode)来建立应用以太坊分层以太坊系统大致可以分为 3 层:应用层、区块链核心层、基础底层。以太坊客户端包含了区块链核心层及基础底层,不同的以太坊客户端通过点对点通信(p2p,peer to peer)通信网络,形成一个以太坊网络。 应用层是用户参与开发的部分,基于区块链网络运行的应用,也称为去中心化应用(DApp),我们在刚接触区块链的时候就可以从这一层出发,学习智能合约,然后使用web3.js和前端交互,就实现了一个简单的DAPP。 注:还有一些东西网上都很多,就不一一赘述了。 合约我们编写合约前需要掌握一些最基本的知识:合约文件的后缀名为.sol。一个solidity 文件可以包含任意数量的合约(contract)定义、import指令和pragma指令。我们也许会好奇,为什么当我们删除第一行注释掉代码的时候会警告,它算是一个许可证,SPDX 许可证列表是 SPDX 规范的一个组成部分,可以看一下这篇文章: 智能合约基础--语法基础 代码示例以及注释 pragma solidity ^0.6.0; //确定运行的版本号 contract SimpleStorage { //合约定义 uint storedData; //声明变量 function set(uint x) public { //set方法 storedData = x; //参数赋值 } function get() public view returns (uint) { //get方法 return storedData; //返回该变量 } } 复制代码注:若有错误,欢迎理性交流!,谢谢!
2023年03月24日
4 阅读
0 评论
0 点赞
2023-03-24
如何实现一个简单的以太坊 - 蒋金洋 | Jeth 第二期
编者按:本文系秘猿科技区块链工程师蒋金洋讲师,在由掘金技术社区主办,以太坊社区基金会、以太坊爱好者与 ConsenSys 协办的《开发者的以太坊入门指南 | Jeth 第二期 - 杭州场》 活动上的分享整理。Jeth 围绕以太坊技术开发主题的系列线下活动。每期 Jeth 会邀请以太坊开发领域的优秀技术团队和工程师在线下分享技术干货。旨在为开发者提供线下技术交流互动机会,帮助开发者成长。本场分享视频回放链接(B 站)我先自我介绍一下,我是秘猿科技区块链工程师蒋金洋,这次的主题是如何实现一个简单的以太坊。我之前从事 Web 开发和云计算的开发,对第一次接触以太坊是在两年,作为技术人员不仅是看重以太坊这种货币,我们更要看重区块链的这一代技术。说实话,加密猫最火的时候我是比较失望,以太坊写的是去中心化的全世界的计算机,但居然有人用来做猫。随着我深入对以太坊的了解和学习,我看到很多 APP 一步一步去履行以太坊的使命,深度使用去中心化的功能,比如 the DAO 这个项目。DAO 这个项目虽然因为智能合约有漏洞挂掉了,但它因为使用智能合约的 DAO 这一功能让我眼前一亮。DAO 是指去中心化的自治组织。在 the DAO 这个项目上面,我用我的私钥可以给这个项目转一笔资金,获得相应的投票权,投票权来表决我的资金投在哪个地方。虽然 DAO 最后也挂掉了,但是它相较于加密猫在技术上跨出了一大步。去中心化交易所去中心化交易所大家或多或少听说过,但是去中心化的交易所原理是用智能合约保证其安全性。我们假设现在有一个设计良好、使用了智能合约的去中心化交易所,理论上面我的资产放在交易所里面交易,可能这个交易所有一部分的中心化的服务帮助我匹配交易的过程,但是这笔钱永远是通过我的私钥以及以太坊智能合约来控制的,这样资产永远在我的手中。智能合约和 Web 3.0通过这些事例来说,我感觉智能合约和以太坊 Web3.0 的概念名副其实。刚才提及的两个例子中有两个特点:资金和机制公开透明,比如 the DAO 这个项目; 给使用者更多权力 我身为一个使用者我可以百分之百控制自己的资金的权利,这在当下的 Web 中心化服务里面是一种奢望。 Web → BlockChainBlockchain区块链是一个 Web3.0 的平台,现在参与到当中,就是在创建下一代开发者使用的平台,这个对于我来说是最大的吸引力。秘猿科技最早听到秘猿科技时,给我留下了深刻的印象,因为这家公司的项目和主要产品都在 GitHub 上开源,包括钱包和区块链浏览器,而且 License 相当得开放。这也意味着我要是使用他们的代码,我不需要支付费用,为了了解这家公司如何运营,我决定加入进去看看。还有一点,我听说秘猿科技他们是被称之为少林寺,我当时在想为什么是少林寺,是不是公司里面没有妹子,都是男的。这个误会很快被揭开:少林寺的寓意就是“天下武功出少林”,秘猿也确实在当下的区块链生态中培养出了一大帮像峨眉、武当这样的门派,为区块链事业做出了自己的贡献。面试:Web → 区块链我去秘猿科技参与面试,当时比较尴尬我是 Web 出身,对区块链中的区块、共识等概念只是有所耳闻但了解不深,所以面试的时候心里没有底。当时我应聘的是 Web 开发的职位,好在我们有试用期,我给自己打气,要是能在试用期内把知识都研究透就可以转到 BlockChain 的开发方向这是我列举 Web 开发和 BlockChain 开发在技术栈上的区别,右侧的也就是你要进入 Web3.0 平台需要的技术。区块链工程师的秘密在我面试的时候,当时的老板提醒我,秘猿科技的区块链工程师之前也是很多都是搞 Web 出身的,有个秘密可以让你很快学会区块链的开发,这个秘密叫做撸链。撸链就是自己做一条区块链出来,我们很多同事做过一些比特币和以太坊的实现,在这个过程中相当于你从 Web 技术栈,走了一条很长的路转到 BlockChain 技术栈,这时你已经做出来区块链了,不必再问自己有没有资格去做区块链。撸链的权衡撸链的好处在可以成为以太坊的专家,我当初下决心要撸链时,选择了第二代区块链的以太坊而没选择第一代的比特币。这个是我们公司的撸链文化,最早开始撸链的是我们的 CEO。我当时问他着手搞以太坊有没有什么价值和意义,因为需要两三个月的时间成本且不一定能搞出来。他告诉我说,撸以太坊是困难模式,他鼓舞我说,如果你能撸出来一块以太坊,代表着你对区块链的理解能达到我们公司 TOP 5的水平。我的考虑是去做还是不去做。老板后来又在公司内说到,谁能实现以太坊,工资翻倍。本着帮助领导分忧,帮助老板花钱的理念,我决定还是要去做以太坊。我刚开始做到现在过了三个月的时间,三个月时间不到给大家展示一下做成什么样子。以下是我的 GitHub 项目主页(https://github.com/ciri-ethereum/ciri)截图:难度曲线在做的过程当中,我有这样的一个难度曲线,一开始是以太坊的 Wiki,在 Wiki 上你可以找到所有的以太坊资料的入口。你要实现以太坊核心的话,需要查阅由以太坊的技术合伙人撰写的以太坊黄皮书,书中你可以看到大量的公式,这个时候你感觉非常非常困难。众所周知,以太坊是一个仍在开发的项目,它没有固定的规范,可以理解为以太坊的规范每天都在变,很多情况下你需要调试你的客户端,这样你才能理解当前的实现。黄皮书是一个巨大的门槛,当你把黄皮书看完后,理解现有的以太坊的实现,剩下的事情还有很多,但难度降低了不少,剩下的花时间即可完成。以太坊测试项目设定链的初始状态我介绍一下这个叫做 以太坊 tests 的 GitHub 项目,刚才我们提到以太坊的规范一直在变动,这个项目是唯一一个在追踪以太坊规范变动的项目。大家看一下项目的目录,频繁更新的也就3-4个目录左右,里面集中几千条测试。下面我简单介绍一些测试:BlockChain 的测试,主要涉及以太坊区块的验证、还有一些比如 POW 的其他测试,这是在测试共识算法。 RLP 测试,RLP 是以太坊的一个编码库,类似于 json 但是以太坊选择 LP 作为格式。 下面给大家展示 tests 这个库怎么运行的,如何确保实现的就是以太坊。设定链的初始状态 它的原理很简单,一开始给我一个 json 格式文件,文件中是它的初始状态。右边图里就是它的格式了,有我们平时可以看到的钱包的地址;balance 是钱包的余额;code 为空的地址代表的是一个钱包,而不是一段合约,如果是合约的话他有一段代码;storage 是我们合约里存储的一些数据。下面这个地址就是真正的一条合约的地址。我会根据这段资料设定链的初始状态,把这一段资料塞进去。输入块数据 第二个部分它会提供一些输入。我举的这个例子是 BlockChain 的,块包括块头和一大堆的 Transaction,这时输入到测试中实现,这时它会根据里面的内容执行相应的合约。检验处理完块后的状态 转账和调用合约在以太坊里面都是以交易的形式呈现的这个过程当中就是相当于一个计算机的初始状态,这个状态要变化,我验证一下变化完的状态跟测试的时候状态是不是一致,如果是一致证明通过这个测试。这样的测试一共有8000多个,我的项目目前现在通过过了5000多个,还有很多以太坊 fork 的规则没有处理,所以剩下的测试应该还是比较容易通过的。其余成果我在 GitHub 上发布了用 Ruby 语言便携的 RLP 编码库,叫做 ciri-rlp。同时我们公司很多后台是用 Ruby 写得,同事用 ciri 库解决了加密问题。如何实现以太坊思考与建议关于以太坊的规范 开源项目如何吸引开发者的思考 如何了解以太坊的规范正如我前面所讲,以太坊目前没有完整的规范,尽管如此以太坊的规范是非常有用的:第一点,你想要实现一个客户端你一定要去了解这个东西;第二点,如果不实现客户端,你想要做以太坊相关的开发,比如说你可能去开发一个 imToken 这样的钱包、区块链的浏览器和其他以太坊周边的东西,你也需要了解以太坊的规范。有时你只是看了 Wiki 和文章整理上的规范,是不足以让你实现这个东西。我以 DevP2P 作为一个例子,它是以太坊的一个底层网络组件,它会以 P2P 的方式跟节点进行连接,与上层应用实现随意通信。我们从这三个地方可能找到寻找 DevP2P 的认证规范。第一个是 Wiki ,它相当于是一个以太坊所有资料的总入口,但在里面可能找不到特别详细的东西。幻灯片右侧截图是 Wiki 上 Libp2p 的介绍,它会告诉你 Libp2p 是什么东西。但这里只是告诉你是什么,没有详细告诉你如何实现。第二张图是 Devp2p 的协议,Libp2p 其实就是 Devp2p,但它没有将非常规范的方式告诉你,所以你只看协议是实现不了。黄皮书实质上是以太坊 EVM 的规范,它里面写的是 EVM 的东西,但网络部分的话在里面是无法找到的。除此之外你还可能找的就是 EIPs,它是一个由社区驱动的以太坊提升提案。如果你发现以太坊做得不好,我可以提升他,你可以先提交一个 EIP,如果官方觉得 EIP不错 会分配 EIP 的编号,社区里的其他成员在里面讨论这个东西,并最终实现这个提案。我们现在以太坊大部分的规范是放在这里,你一定要去找 EIP 的东西。可惜的是,在 EIP 里也没有对 Devp2p 非常详细的规范,这个时候使用从官方的客户端里面去看它的代码并且去调试。这里我们可以使用 Geth 来完成,我当时实现就是利用这个方法一段一段把 Geth 收到的数据一点一点打印出来。然后进行对比。开源项目如何吸引开发者接下来我想分享的是开源的项目如何吸引开发者。开源项目的关键:一堆人做这个项目可以决定这个项目能不能开始,如果想要持续下去,必须让更多人的力量投入到其中,包括以太坊也是如此。这是以太坊官方支持的客户端,py-EVM,另一个是我实现的,Ciri,这个时候我要考虑的是如何增加参与者,这需要各位的帮助。如果各位对实现以太坊感兴趣,想多了解以太坊的原理,最好的方式是自己去实现一下;第二个好的方式大家参与项目一起来做;还有一个就是大家如果不是想了解以太坊,可以帮忙给我的 ciri 项目点赞,这也是对开源项目的一种帮助。降低开发者参与门槛开源方式管理项目 我做的过程当中,我对比下来,我发现有很多东西还是缺乏的.在座的各位都是程序员,如果自己做项目的时候,自己根本不会去写文档,自己也不会考虑项目管理。这时如果想要别人参与到这个项目中,需要让他把你的源代码看一遍了。想到这一点的时候,我一开始就是在 GitHub 的 issue 里在管理这个项目。README 和 Roadmap 如果别人想要参与,可以看到我做了哪些东西,有的东西为什么没有做,现在这个工作进行到哪个地步,包括去写比较详细的 README 和 Roadmap 文档。方便开发者 Setup 我觉得已经超越了很多的开源项目,我做了一个 Docker 镜像给开发者用,如果你的电脑上有 Docker, 可以拿容器试一下是不是真的有五千多个测试可以通过,省去了安装依赖文件的烦恼。总结如果你了解以太坊的规范,或者你要更深入了解以太坊的实现和设计,记住有三个方式:黄皮书,WIKI,EIPs,进一步深入的话还需要用已有的客户端进行调试;第二个思考如何去参与开源项目,保括开源方式和管理项目,提供 readme 和 ROADMAP 文档;第三个是尽量方便开发者了解这个项目。联系方式: jjy@cryptape.com 我的博客: justjjy.com Ciri Ethereum: github.com/ciri-ethere… 我的微信: fweedm 这是我的联系方式,以及我们少林寺的招聘内推,有兴趣的同学留意一下。谢谢大家!
2023年03月24日
5 阅读
0 评论
0 点赞
2023-03-24
实战:以太坊 DApp 开发与构建 - 李明 | Jeth 第二期
编者按:本文系 ConsenSys 中国特约讲师李明,在由掘金技术社区主办,以太坊社区基金会、以太坊爱好者与 ConsenSys 协办的《开发者的以太坊入门指南 | Jeth 第二期 - 杭州场》 活动上的分享整理。Jeth 围绕以太坊技术开发主题的系列线下活动。每期 Jeth 会邀请以太坊开发领域的优秀技术团队和工程师在线下分享技术干货。旨在为开发者提供线下技术交流互动机会,帮助开发者成长。本场分享视频回放链接(B 站)大家下午好!我今天带来的分享是DApp的开发与实践。我们将用40分钟时间从头写一个DApp,学习以太坊智能合约开发。我将通过实践的方式给大家做一个展示,希望大家在短时间内可以从0到1快速地了解以太坊全栈开发的核心知识。首先自我介绍一下,我曾在微软亚研担任了四年半的软件工程师,之后在深圳多翼科技担任研发总监。我在13年的时候第一次比特币,并少量投资。14年是熊市,在发现不能赚钱以后,我开始做量化交易,在国内各个交易所之间做基于统计模型的搬砖套利,为市场提供流动性。15年区块链概念开始爆发,人们发现区块链不只是数字货币,还可以做非常多的应用。这种新的认知引发了我的思考,于是从16年开始我开始研究区块链的共识和智能合约的开发,在这个领域不断探索。今天的分享主要内容如下:从0到1构建一个以太坊DApp Solidity、Web前端语言 重要工具:Remix、Truffle、Ganache、Metamask 今天要讲的 DApp 非常有特点。第一,它是一个非常有用的 App,大家可以发现它可以用来洗碗、买菜、做家务。二是这个 DApp 虽然非常有用,但代码并不长,只有100行多一点,可以比较快速开发完成。最后,虽然这个 DApp 代码不长,但展示了 Solidity 语言的主要特性,甚至包含了一些大家需要注意的安全陷阱,所以希望大家通过这个 DApp 对 Solidity 编程有更多的了解。那今天要讲的 DApp 是什么呢?就是石头剪子布。这是我们平常经常玩的游戏。这个游戏的一个问题是,每个人出拳的速度不一样,我是属于比较笨的人,经常因为被别人看出想要出拳的手势而吃亏。这个问题怎么解决呢?生活中出现了一种非常有意思的方法,就是分歧终端机,出自《非诚勿扰》。它通过外壳把两人的手套起来,俩人出好拳以后同时打开盖子看结果,以避免作弊。网络版的分歧终端机?那这种问题在计算机系统或者是网络系统如何解决呢?这个问题确实有点难。假设我们通过服务器做这个事情,我们如何信任服务器?我们也无法保证服务器是否会作假。但是,这时候如果引入区块链,当我们要使用以太坊上的智能合约来开发这个系统,我们会发现它的一些特性是可以帮助我们解决这个问题的。这就是我们今天要讲的基于以太坊的石头剪子布 DApp。接下来进入 Live Coding 环节,我们将从0到1一起见证 DApp 诞生过程,用到的第一个工具就是 Remix,算得上是以太坊开发的瑞士军刀,它结合开发中的编辑、编译、部署和测试等等功能,我们先从这里开始。编辑注: Live Coding 环节无PPT,请参见 IT 大咖说视频回放(2:56:50——3:48:40),链接: http://www.itdks.com/eventlist/detail/240实战项目 Demo 链接(GitHub):github.com/washingweb/…
2023年03月24日
8 阅读
0 评论
0 点赞
1
2
3
4
...
11