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-25
六币日报 | 美国SEC向Coinbase发出韦尔斯通知;Telegram现已支持用户在聊天中发送USDT
今日要闻提示:1.美国SEC向Coinbase发出韦尔斯通知,称其可能违反证券法2.美国SEC起诉孙宇晨,指控其出售未注册证券和操纵市场3.新沂市检察院对Ubank“炒币”骗局提起公诉,涉及传销交易量超100亿元4.FTX将从Modulo Capital收回超过4亿美元,双方已达成和解协议并待法院批准5.Telegram现已支持用户在聊天中发送USDT6.Kraken:将从3月27日起暂停ACH存取款功能7.数据:Coinbase CEO及其他高管过去30天已抛售价值740万美元的股票8.Delphi Digital:Arbitrum分配模型中有超13.5万个女巫钱包监管消息美国SEC向Coinbase发出韦尔斯通知,称其可能违反证券法据官方消息,Coinbase表示已经收到美国证券交易委员会(SEC)的“韦尔斯通知”,调查对象涉及Coinbase上线的部分数字资产、质押服务Coinbase Earn、Coinbase Prime和Coinbase Wallet。Coinbase表示,韦尔斯通知中并没有提供很多信息。SEC工作人员只是表示,已经发现了潜在的违反证券法的行为。Coinbase要求SEC指出其平台上线的哪些资产可能是证券,但遭到SEC拒绝。在SEC今天发出通知之前,Coinbase在过去几个月里向SEC提供了多项关于注册的建议,但SEC最终都拒绝回应。Coinbase重申,不会上线证券,也不会向客户提供证券产品。Coinbase首席法务官Paul Grewal表示:“如果有必要,我们欢迎法律程序,以提供我们一直倡导的透明度,并证明SEC在涉及数字资产的问题上存在不公平或不合理。在那之前,一切业务照常运行。”Coinbase曾公开批评SEC的监管结构模糊,并于去年7月请求SEC解释证券法如何适用于数字资产。SEC主席Gary Gensler曾在多个场合表示,他认为加密交易所在美国是作为未注册的证券交易所运营的,它们上线的绝大部分代币类似于证券。对此,Coinbase CEO表示,Coinbase没有违法,愿意出庭证明。美国SEC起诉孙宇晨,指控其出售未注册证券和操纵市场据CoinDesk报道,美国证券交易委员会(SEC)周三起诉孙宇晨,指控其出售和空投未注册证券、实施欺诈和操纵市场。SEC在一份新闻稿中表示,它正在起诉孙宇晨、波场基金会、BitTorrent基金会和BitTorrent(现被称为Rainberry)销售未注册加密资产证券TRX和BTT。SEC进一步指控,被告通过“广泛的洗盘交易”计划操纵TRX二级市场。此外,SEC还起诉林赛·罗韩、杰克·保罗、Soulja Boy、Lil Yachty、Ne-Yo、阿肯和米歇尔·梅森等名人,指控他们在未披露代言费的情况下非法宣传TRX和BTT。这些名人中的大多数都达成了和解。SEC表示,孙宇晨试图通过洗盘交易计划人为提高TRX的交易量,他让自己的员工“在他控制的两个加密交易平台账户之间进行了超过60万笔TRX洗盘交易”,每天交易量在450万至740万枚TRX之间。孙宇晨还将TRX出售到二级市场,通过非法发行和销售未注册代币获利3100万美元。受此消息影响,TRX短线下跌,24小时跌幅达10.8%。美联储加息25个基点美联储将基准利率上调25个基点至4.75%-5.00%区间。这是美联储自去年3月以来连续第九次加息,也是连续第二次加息幅度放慢至25个基点。美联储FOMC声明中声称,美国银行业稳健、有弹性,但一些事件将拖累经济增长。美联储将继续以相同的步伐减少国债和抵押贷款支持证券的持有量,进一步收紧政策可能是合适的。市场预计美国加息周期接近尾声,今年底之前或开启降息令利率降至4.25%-4.5%,以应对经济放缓。此外,美联储主席鲍威尔表示,今年降息不是我们的基本预期,不考虑为所有未受保护的银行存款提供保险。新沂市检察院对Ubank“炒币”骗局提起公诉,涉及传销交易量超100亿元据徐州检察发布官方微信公众号,江苏省新沂市检察院以涉嫌组织、领导传销活动罪对“Ubank”虚拟货币资金盘一案依法提起公诉,“U币”全称为“Ubank”虚拟货币交易平台,办案中发现,该平台团队注册使用人数超10万人,涉及传销交易量超100亿元。法院一审作出有罪判决,33名被告人分别被判处二年到六年不等的有期徒刑。由于被告人提起上诉,目前,该案正在二审审理中。与此同时,新沂市检察院开展追赃挽损工作,全力配合公安机关开展证据审查,对各被告人投资获益的资金及“Ubank”以投资名义转移的资金及时予以查扣,共计追赃挽损8000万元。此外,还引导侦查机关落实了与“Ubank”签约的10余家合作公司,再次追缴赃款上缴国库。NFTNFT市场Magic Eden推出Web3游戏中心Magic Eden Games据美通社报道,NFT市场Magic Eden宣布推出Web3游戏中心Magic Eden Games,旨在扩大Web3游戏开发者的玩家基础及其Web3游戏社区。游戏开发者与Magic Eden Games合作时,每个游戏都会收到自己的“探索游戏”页面,其中包含游戏描述、工作室描述、视频和其他媒体,以及游戏特定NFT市场。游戏开发者还可以通过在Magic Eden Launchpad和在所有区块链上强制执行创作者版税的二级市场上铸造收藏品来产生收入。作为公司进军Web3游戏领域的一部分,Magic Eden最近宣布推出Mint Madness活动,与Web3游戏项目相关的十多个NFT将在Polygon、Solana和Ethereum上免费铸造。环球音乐集团为其商品和服务提交NFT相关商标申请据知识产权律师Eliana的推文,环球音乐集团(UMG)已向美国专利商标局为其商品和服务提交了两份商标申请,包括第41类:不可下载的虚拟数字商品,即经过NFT认证的音乐及音乐相关娱乐领域的多媒体、图像、视频、音乐和音频文件;第9类:由NFT认证的音乐和音乐相关娱乐领域的视频、音乐和音频文件。元宇宙Axie Infinity的Homeland Season 1已结束,新赛季将在3周左右上线据官方推特,链游Axie Infinity的Homeland Season 1已结束,将尽快发布第1赛季的奖励和统计数据,新赛季将在3周左右回归。项目动态Bankless:Do Kwon在黑山被捕据Bankless报道,Terra联合创始人Do Kwon在黑山波德戈里察被捕,但Bankless没有引用消息来源。 黑山内政部长在推特表示,黑山警方拘留了一名疑似通缉犯之一的韩国公民 Do Kwon,正在等待官方确认身份。他因为伪造证件在波德戈里察机场被拘留,韩国、美国和新加坡也提出了拘留要求。FTX将从Modulo Capital收回超过4亿美元,双方已达成和解协议并待法院批准据路透社报道,根据特拉华州美国破产法院的一份文件,加密交易所FTX已与对冲基金Modulo Capital达成一项协议,FTX将从Modulo收回4.04亿美元的现金,即收回FTX在2022年向Modulo汇出的97%的资金。Modulo还放弃对FTX加密交易所持有的5600万美元资产的要求。作为和解协议的一部分,FTX和Alameda将放弃对Modulo的任何所有权。据悉,该协议必须得到美国破产法官John Dorsey的批准。根据法庭文件,FTX的附属对冲基金Alameda Research从2022年5月开始的一系列转账中向Modulo汇款了4.75亿美元,当时FTX正在亏损并走向破产。备案文件显示,Alameda在FTX创始人Sam Bankman-Fried(SBF)的指导下,已支付2500万美元收购Modulo的股份,并向Modulo管理的投资基金出资4.5亿美元。Telegram现已支持用户在聊天中发送USDT据CoinDesk报道,Telegram 用户现可以在聊天中互相发送 USDT。USDT 已被添加到 Telegram 的@wallet 机器人中,扩展了该消息传递应用程序买卖加密货币的功能。交易通过 Tron 网络(TRC-20)进行。去年,比特币 (BTC) 和 toncoin (TON)被添加到@wallet 的市场,后者也可以在聊天中发送。Coinbase将从3月29日起暂停Algorand质押奖励据CoinDesk报道,加密交易所Coinbase (COIN)周三告知其客户,从3月29日起,它将不再提供Algorand代币(ALGO)质押奖励。该代币仍可用于交易。Coinbase发言人没有给出终止Algorand奖励的原因,但在一封电子邮件中表示,“截至3月31日的Algorand治理期的所有奖励将在4月初支付”。Coinbase发言人称:“Coinbase与资产发行人合作提供奖励,并不断重新评估我们的产品以确保最佳的客户体验。我们决定此时停止Algorand (ALGO)奖励”。Algorand基金会的首席执行官Staci Warden在推特上表示,此举是考虑到监管审查。Warden称:“Coinbase现在通知我们,他们正在根据最近的监管审查评估他们的服务,因此,他们将不再支持零售客户的Algo质押奖励。”币安再次对现货比特币交易收取费用,仅保留TUSD-BTC交易对的促销据华尔街日报报道,加密交易所币安的一位发言人证实,继去年夏天将现货比特币交易费用降至零后,该公司已再次开始对现货比特币交易收费。据币安网站介绍,目前该交易所对现货比特币交易收取0.1%的费用。币安发言人周三称:“将交易费用降至零的举措是一种促销,该促销计划持续6个月;且公司去年7月给用户的信息称,该计划在另行通知前有效。”她说,用户仍然可以在币安上免费交易TUSD-BTC交易对。报道称,事实证明这种免费的方式对币安来说是有效的;Kaiko的研究总监Clara Medalie表示,截至上周,币安上61%的交易量是零费用比特币交易。Medalie强调,与大多数流动性交易所相比,该措施帮助币安将其市场份额从去年7月的50%增加到72%。不过Medalie认为,币安在取消了大部分零费用交易后,其市场份额可能会下降。以太坊客户端Lighthouse发布v4.0.0版本,支持主网Shapella升级以太坊客户端Lighthouse开发团队Sigma Prime在推特上表示,Lighthouse已发布v4.0.0版本,此版本对所有主网用户都是强制性的。该版本支持启用以太坊主网Shapella升级,在以太坊主网升级之前未更新到Lighthouse v4.0.0或更高版本的节点将停止跟随链,并且需要重新同步。对于利益相关者,这将导致错过奖励和惩罚。此前消息,以太坊主网预计于UTC时间4月12日22:27:35(北京时间4月13日06:27:35)激活上海(Shapella)升级。Avalanche X链部分节点仍处于离线状态,交易严重滞后据CoinDesk报道,虽然Avalanche C链今日早间在出现宕机后已恢复出块,但Avalanche X链部分节点目前仍处于离线状态,链上数据显示,X链的网络质量已经下降,只能处理少量交易。它似乎每小时只能处理几笔交易,这使得该链几乎无法使用。超过90%的验证者已经升级到最新版本的AvalancheGo,这高于今天早些时候的12%。虽然Avalanche尚未就此次中断发表公开声明,但许多贡献者正在其GitHub论坛上努力解决该问题。据悉,Avalanche由三个可互操作的区块链组成:X链(交易链)、C链(合约链)和P链(平台链)。OP Labs:Bedrock升级将为Optimism主网桥引入新的两步取款流程,可提高安全性OP Labs在推特上表示,Bedrock升级将为Optimism主网桥引入一个新的两步取款流程,这将提高其安全性并使攻击更加困难。L1 的新提款流程分为两部分:证明和最终确定。要从Optimism主网提取资金,用户必须在包含提款交易的L2区块的输出出现在L1上时立即提交取款证明。平均而言,此输出需要大约一个小时才能出现在以太坊上。一旦提交了提现证明,用户等待标准的7天结束窗口,然后用户才能在L1上完成提现。美财政部研究:数字货币或会降低金融系统波动性,但会给银行带来风险美国财政部金融研究办公室近日发布的研究报告称,金融摩擦可能会限制数字货币的潜在收益,无论是作为央行数字货币(CBDC)公开发行还是作为稳定币私下发行。此外,当数字货币完全集成时,金融系统的波动性会降低,家庭福利会改善,但银行部门的稳定性会受到影响。对于数字货币对银行业影响,报告称,存款利差的下降是随着数字货币发行而增加危机可能性的主要原因。完全集成的数字货币会降低银行存款利差,尤其是在危机期间,这会限制银行在损失后进行资本重组的能力。此外,由于银行在不利冲击后重建资产的能力较弱,因此银行的资产平均水平较低,估值大幅下降,银行业陷入危机或陷入困境的可能性会大大增加。该报告称,数字货币有潜力成为传统货币的替代品。然而,金融市场的不完善限制了它们的潜在收益。在某种程度上,可能会出现一系列数字货币的发行,其中福利-稳定的权衡有利于数字货币,即使在竞争环境中数字货币的发行成本很高。Coinbase将上线Arbitrum据官方消息,Coinbase将增加对Arbitrum(ARB)的支持。如果满足流动性条件,交易预计将于2023年3月23日开始。一旦建立了足够的资产供应,ARB-USD交易对将分阶段开放交易。在某些司法管辖区,ARB交易可能会受到限制。Coinbase将ARB标记为“实验性”资产。Xapo Bank成为首家支持USDC存取款的持牌银行据美通社报道,总部位于直布罗陀的比特币托管银行Xapo Bank表示,它将与稳定币发行商Circle合作提供USDC存取款服务。Xapo将按照1:1的汇率提供USDC与美元的转换,并支持USDC转账。Xapo Bank的所有USDC存款都自动转换为美元,存款年利率为4.1%。Xapo表示不提供贷款业务,客户资金将全部作为准备金并投资于短期流动资产。该银行向会员收取150美元的管理费。Xapo Bank是一家完全持牌和受监管的银行,是直布罗陀存款担保计划(GDGS)的成员,可为最高10万美元存款提供担保。Kraken:将从3月27日起暂停ACH存取款功能据CoinDesk报道,加密交易所Kraken将从3月27日起暂停自动清算中心(ACH)的存取款功能。在Silvergate Bank倒闭后,该公司正在寻找新的银行合作伙伴。Kraken表示,其他服务不会受到这一变化的影响。一旦找到替代银行,该交易所将恢复ACH存取款服务。重要数据数据:Coinbase CEO及其他高管过去30天已抛售价值740万美元的股票根据Dataroma数据显示,加密货币交易所Coinbase内部人士(包括首席执行官Brian Armstrong和其他高管)在过去30天内抛售了价值约740万美元的公司股票,其中Brian Armstrong抛售了价值580万美元的股票,他在3月3日至15日以356万美元出售了大约6万股股票,3月21日以224万美元出售了约3万股股票。与此同时,其他Coinbase公司高管(包括首席人事官Brock Lawrence、首席会计官Jones Jennifer和首席法务官Grewal Paul),累计出售了价值168万美元的股票。Delphi Digital:Arbitrum分配模型中有超13.5万个女巫钱包加密研究机构Delphi Digital在社交媒体发文称,还有不到24小时Arbitrum将启动ARB治理代币空投,有约62.5万个钱包符合条件,在Arbitrum的分配模型中有超过135,000个钱包被识别为女巫钱包。根据此前已披露的分配方案,Arbitrum将把代币供应量的12.75%,即12.75亿枚代币分配给社区成员和生态系统中的DAO。欧洲加密货币初创公司在2022年筹集了创纪录的57亿美元风险投资资金加密货币风险投资公司 RockawayX 和初创数据提供商 Dealroom 的一份新报告显示,欧洲加密初创公司去年筹集了创纪录的 57 亿美元风险投资资金,高于 2021 年的 50 亿美元。
2023年03月25日
6 阅读
0 评论
0 点赞
2023-03-25
六币日报 | OpenAI为ChatGPT添加插件支持;比特币难度上调7.56%至46.84T
今日要闻提示:1.美国联邦检察官对Do Kwon提起刑事欺诈指控2.美国SEC发布投资者警示:谨慎对待加密资产证券3.OpenAI正为ChatGPT添加插件支持,允许联网、运行计算或使用第三方服务4.币安现货交易出现故障,目前已解决5.Mysten Labs将以9600万美元回购FTX的股权投资和代币认购权证6.Tether CTO:公司有约16亿美元的超额储备来支持USDT稳定币7.生成式AI初创公司Character.AI以10亿美元估值完成1.5亿美元融资,a16z领投8.比特币难度上调7.56%至46.84T,再创历史新高监管消息美国联邦检察官对Do Kwon提起刑事欺诈指控据CoinDesk报道,Terraform Labs创始人Do Kwon在黑山被警方逮捕数小时后,纽约联邦检察官指控他犯有欺诈罪。根据起诉书,Kwon被控共谋欺诈、商品欺诈、证券欺诈、电信欺诈和共谋操纵市场。今年2月,美国证券交易委员会(SEC)已对Terraform和Do Kwon提起民事指控,指控他们欺诈投资者以及销售未注册证券和证券掉期。此外据华尔街日报报道,曼哈顿联邦检察官办公室发言人说,司法部将寻求将Do Kwon引渡到美国。据此前消息,黑山内政部长Filip Adzic宣布,Do Kwon于周四早些时候使用伪造证件在黑山波德戈里察机场被警方逮捕。韩国国家警察厅随后证实了他的身份。今日晚些时候消息,韩国检方将寻求引渡Do Kwon。Do Kwon在塞尔维亚成立加密公司,检方正调查该公司是否用于洗钱。Do Kwon曾于去年7和8月向韩国某律所汇款450万美元。美国SEC发布投资者警示:谨慎对待加密资产证券美国SEC今日发布投资者警示称,谨慎对待加密资产证券。根据联邦证券法,公司不得发行或出售证券,除非证券发行已在 SEC注册或可获得注册豁免。同样,法律要求证券经纪自营商、投资顾问、另类交易系统 (ATS)和交易所等各方在 SEC、州监管机构和/或自律组织 (SRO)(例如FINRA )注册。此外,涉及借贷或质押的实体和平台加密资产可能受联邦证券法的约束。证券发行登记要求发行人向公众披露有关公司、发行和证券的重要信息。加密资产证券的未注册发行可能无法提供投资者做出明智决策所需的关键信息。NFTDoodles 2可穿戴设备NFT“Genesis Box”将于3月31日开图据官方推特,NFT项目Doodles宣布Doodles 2可穿戴设备NFT“Genesis Box”将于3月31日开图。Doodles此前表示,所有Genesis Box都将包含稀有物品,可能包含独家物品、Beta通行证等。元宇宙OpenAI正为ChatGPT添加插件支持,允许联网、运行计算或使用第三方服务据官方博客,OpenAI宣布正在为ChatGPT添加对插件支持,插件是专门为以安全为核心原则的语言模型设计的工具,可帮助ChatGPT联网访问最新信息、运行计算或使用第三方服务。检索插件允许ChatGPT搜索内容矢量数据库,并将最佳结果添加到ChatGPT会话中。这意味着它没有任何外部影响,主要风险是数据授权和隐私。OpenAI已开放第一批ChatGPT插件名单,这批插件由Expedia、FiscalNote、Instacart、KAYAK、Klarna、Milo、OpenTable、Shopify、Slack、Speak、Wolfram和Zapier创建。OpenAI表示,将开始把插件Alpha访问权限扩展到候补名单中的用户和开发人员。项目动态币安现货交易出现故障,目前已解决币安19:38发推称:“了解到一个影响币安现货交易的问题。目前所有现货交易暂停,我们正在努力尽快解决这个问题。”币安创始人CZ发推称:“初步分析表明匹配引擎在追踪止损订单上遇到了一个错误(一个奇怪的错误)。21:38,币安发布公告称将于今日22点恢复所有交易活动。MakerDAO已投票通过将USDC作为DAI主要储备资产的提案据官方网站,MakerDAO社区已投票通过“保留USDC作为稳定币DAI的主要储备资产”的提案。该提案获得了79%的投票支持,其余人则更倾向于将储备资产多样化。本月早些时候,Circle的主要银行合作伙伴硅谷银行倒闭后,包括DAI和USDC在内的多个稳定币暂时与美元脱钩。Mysten Labs将以9600万美元回购FTX的股权投资和代币认购权证据CoinDesk报道,根据法庭文件,Mysten Labs周三与FTX债务人达成协议,将以9630万美元的现金回购FTX对Mysten Labs的股权投资和SUI代币权证。这意味着FTX债权人能够回收更多资产。在最终与Mysten达成交易之前,FTX债务人保留了投资银行Perella Weinberg Partners (PWP),以征求其他潜在买家的兴趣。去年8月,FTX Ventures领投了Mysten Labs的20亿美元B轮融资,几个月后FTX申请破产。FTX在本轮融资中投资1.01亿美元,获得了Mysten Labs约57万股优先股,并获得可购买约8.9亿枚SUI代币的权证。FTX为股权投资支付了约1.01亿美元,为代币认购权证额外支付了100万美元。目前FTX债务人可以继续“向其它第三方寻求更高的报价”,直到法院最终确定出售日期。CNBC披露币安员工及志愿者引导用户规避KYC限制,币安回应会对违规人员采取行动据CNBC报道,该媒体从币安控制和运营的Discord服务器和Telegram群组看到的数百条消息,币安员工或币安培训的志愿者(称为“天使”)的账户在这些群组中分享了可用于规避币安的KYC、注册和验证系统的技术。员工和志愿者分享的一些技术涉及伪造银行文件或提供虚假地址。其他则涉及对币安系统的简单操作。员工、志愿者和客户还分享了视频指南和文件,展示如何伪造居住地以获得币安的借记卡,这将有效地将他们的币安加密货币变成传统的支票账户。与客户分享的技术也让人质疑币安反洗钱工作的有效性。币安发言人对此表示:“我们已经对可能违反我们内部政策的员工采取了行动,包括错误地征求或提出不允许或不符合我们标准的建议。我们有严格的政策,要求所有用户通过向我们提供居住国和其他个人身份信息来通过KYC。币安员工被明确禁止建议或支持用户规避当地法律和监管政策,如果发现违反这些政策,将立即被解雇或接受审计。”Tether CTO:公司有约16亿美元的超额储备来支持USDT稳定币据CNBC报道,稳定币发行商Tether首席技术官Paolo Ardoino表示,公司估计本季度超额储备将增加7亿美元,这将使Tether的超额储备达到16.6亿美元,这将是Tether超额储备首次突破10亿美元大关。所以这笔钱留在主要公司Tether中,以便进一步将稳定币资本化。CoinMarketCap数据显示,USDT市值目前为785.4亿美元,较3月1日的709.8亿美元增长10%。外媒:Zipmex的救助投资者未能付款,员工被告知或将清算据加密媒体The Block的推文,加密交易所Zipmex的救助投资者未能付款,公司警告员工Zipmex或将清算。去年7月,Zipmex在加密借贷公司Babel Finance以“异常流动性压力”为由停止提款后,在新加坡申请债务债权人保护。去年11月消息,知情人士称Zipmex交易所或将签署超1亿美元的救助计划,泰国亿万富翁Prayudh Mahagitsiri的儿子Chalermchai Mahagitsiri创立的风险投资公司 V Ventures将主导此次救助计划,并将换取Zipmex 90%的股份。Infura已向所有用户开放其NFT API和SDK据官方推特,ConsenSys旗下区块链开发平台Infura宣布,其NFT API和SDK已开放给所有用户。Infura NFT API有14个不同的端点,使开发人员能够访问所有必要的元数据,还附带三个预审计的ERC-721和ERC-1155模板,涵盖了所有NFT用例的85%。另外,NFT API还包括来自八个区块链网络的读写功能,使用四种语言,并具有集成的IPFS访问权限。这包括提前访问ConsenSys推出的zkEVM,该新zkEVM计划于4月向公众开放。Avalanche将进行Cortina升级,将迁移X-Chain以运行Snowman++共识据官方博客,Avalanche宣布将于3月27日在Fuji测试网上发布 Avalanche Cortina升级的预发布代码,Fuji测试网Cortina升级将于北京时间3月30日23:00激活。在Fuji测试网上的Cortina升级成功之前,将公布Avalanche主网激活时间,并发布官方Cortina AvalancheGo版本 (v1.10.0)。最新版本的AvalancheGo将迁移X-Chain以运行Snowman++共识,这意味着整个网络已经迁移到一个单一的共识引擎,这减少了可信计算基础的规模并增加了现有研发工作的杠杆作用,这解除了Avalanche Warp Messaging (AWM)在X-Chain上的集成,并使交易所更容易支持X-Chain,其中将包含子网上使用的许多质押代币。Cortina升级还引入了批处理授权奖励并将C-Chain gas上限提高至1500 gas。加密交易所Uphold将结束对美国客户的质押服务,直到监管更加明确据Cryptoslate报道,加密交易所Uphold已向客户发送电子邮件,表示将于2023年4月27日结束对美国客户的质押服务。Uphold证实,美国证券交易委员会尚未与其联系,不过“直到法律和监管更加明确为止,将终止其在美国的质押服务。”从3月22日起,用户资金将由Uphold取消质押,并“从现在到2023年4月27日之间可以使用”。资金可用的时间将取决于单个区块链的“解除限制期”。MetaMask已与EIP-4361兼容可支持以太坊登录,并推出‘域名绑定’功能Web3钱包Metamask在推特上宣布:“MetaMask现在与EIP-4361兼容,也就是使用以太坊登录。我们的实施还提供了‘域名绑定’功能,可以检测来自恶意URL的签名/批准。”美国法院已将Binance.US收购Voyager交易的行政执行延至3月28日Voyager无担保债权人委员会(Voyager UCC)在推特上透露,美国政府此前已提出动议,寻求永久“中止”Voyager的第11章计划生效,而且表示无论Voyager是否推进Binance.US的收购交易都将继续上诉并寻求“中止”该交易。在3月24日最新听证会之后,美国政府要求地方法院将批准“Binance.US收购交易”的行政执行延长至3月29日,但遭到Voyager和无担保债权人委员会拒绝,然而地方法院在Voyager和无担保债权人委员会反对情况下决定延至3月28日,这意味着给美国政府提供了额外上诉时间,Voyager和UCC也因此无法推进和Binance.US的交易计划并向债权人进行资金分配。融资消息生成式AI初创公司Character.AI以10亿美元估值完成1.5亿美元融资,a16z领投据CNBC报道,生成式AI初创公司Character.AI宣布以10亿美元估值完成1.5亿美元融资,a16z领投,GitHub前CEO Nat Friedman、Elad Gil、A Capital和SV Angel参投。新资金将使其能够扩展计算能力,“从而产生具有高级推理和更高准确性的更复杂模型”。此外,有消息称Character.AI可能会探索加密(或更广泛的Web3)和社交音频市场,因为a16z一直是这两个领域的重要参与者。重要数据比特币难度上调7.56%至46.84T,再创历史新高据欧科云链OKLink多链浏览器数据显示,比特币在区块高度782208处迎来了挖矿难度调整,挖矿难度略微上调7.56%至46.84T,再创历史新高。目前全网平均算力为345.76 EH/s。数据:75%的ARB空投已被领取,65%的ARB空投在领取后已出售据推特用户余烬监测,截至目前,75%的ARB空投已被领取,65%的ARB空投在领取后已出售。此外。余烬分享了链上买入ARB数量的前几名大户及他们的买入成本:1.0xb0fc开头地址使用373万枚USDC买入287万枚ARB,均价1.3美元;2.0x139开头地址使用355万枚USDC买入261万枚ARB,均价1.36美元;3.0xf53f开头地址使用195万枚USDC买入153万枚ARB,均价1.27美元;4.0x06e2开头地址使用980枚ETH(约合171万美元)买入148858枚ARB,均价1.15美元;5.0xe547开头地址使用164万枚USDC买入140万枚ARB,均价1.16美元;6.0x6ee1开头地址通过Uniswap V3单边池使用939枚ETH(约合164万美元)被动买入138.9万枚ARB,均价1.18美元。
2023年03月25日
3 阅读
0 评论
0 点赞
2023-03-24
比特币源码研读(1)bitcoin源码结构
上篇文章,我们在本地编译了bitcoin源代码。并简单了解了bitcoind和bitcoin-cli的简单使用。这次,我们开始尝试去看看bitcoin源代码的各个模块的作用。用sublime打开bitcoin源代码,我们发现除了除了.h,.cpp等源代码还有一些其他类型的目录和文件。知己知彼,方能百战不殆。所以,我花了点时间大概浏览了下所有的目录和文件。将各个模块代码的功能作了一个初步总结,用于理解bitcoin整体框架和核心模块的代码功能。这样,以后在阅读源代码的时候遇到某些cpp文件也不至于顿时不知所云,必要时可以回过头来参考下这个总结图。废话少说直接撸图可能有些地方总结的不到位,大佬看到可以直接告我下。这个结构图使用Xmind做的,有需要的朋友可以留言索取Xmind源文件。下一篇探索比特币数据结构-区块。互联网颠覆世界,区块链颠覆互联网!--------------------------------------------------20180419 00:06
2023年03月24日
8 阅读
0 评论
0 点赞
2023-03-24
【译】用JavaScript写一个区块链
原文:Writing a tiny blockchain in JavaScript作者:Savjee.be译者:JeLewine几乎每个人都听说过像比特币和以太币这样的加密货币,但是只有极少数人懂得隐藏在它们背后的技术。在这篇博客中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的。我将会称之为SavjeeCoin!全文分为三个部分:part1:实现一个基本的区块链 part2:实现POW part3:交易与挖矿奖励 Part1:实现一个基本的区块链区块链区块链是由一个个任何人都可以访问的区块构成的公共数据库。这好像没什么特别的,不过它们有一个有趣的属性:它们是不可变的。一旦一个区块被添加到区块链中,除非让剩余的其余区块失效,否则它是不会再被改变的。这就是为什么加密货币是基于区块链的原因。你肯定不希望人们在交易完成后再变更交易!创造一个区块区块链是由许许多多的区块链接在一起的(这听上去好像没毛病..)。链上的区块通过某种方式允许我们检测到是否有人操纵了之前的任何区块。那么我们如何确保数据的完整性呢?每个区块都包含一个基于其内容计算出来的hash。同时也包含了前一个区块的hash。下面是一个区块类用JavaScript写出来大致的样子:const SHA256 = require("crypto-js/sha256"); class Block { constructor(index, timestamp, data, previousHash = '') { this.index = index; this.previousHash = previousHash; this.timestamp = timestamp; this.data = data; this.hash = this.calculateHash(); } calculateHash() { return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data)).toString(); } } 复制代码因为JavaScript中并不支持sha256所以我引入了crypto-js库。然后我定义了一个构造函数来初始化我区块的属性。每一个区块上都被赋予了index属性来告知我们这个区块在整个链上的位置。我们同时也生成了一个时间戳,以及需要在区块里存储的一些数据。最后是前一个区块的hash。创造一个链现在我们可以在Blockchain类中将区块链接起来了!下面是用JavaScript实现的代码:class Blockchain{ constructor() { this.chain = [this.createGenesisBlock()]; } createGenesisBlock() { return new Block(0, "01/01/2017", "Genesis block", "0"); } getLatestBlock() { return this.chain[this.chain.length - 1]; } addBlock(newBlock) { newBlock.previousHash = this.getLatestBlock().hash; newBlock.hash = newBlock.calculateHash(); this.chain.push(newBlock); } isChainValid() { for (let i = 1; i < this.chain.length; i++){ const currentBlock = this.chain[i]; const previousBlock = this.chain[i - 1]; if (currentBlock.hash !== currentBlock.calculateHash()) { return false; } if (currentBlock.previousHash !== previousBlock.hash) { return false; } } return true; } } 复制代码在构造函数里,我通过创建一个包含创世块的数组来初始化整个链。第一个区块是特殊的,因为它不能指向前一个区块。我还添加了下面两个方法:getLatestBlock()返回我们区块链上最新的区块。 addBlock()负责将新的区块添加到我们的链上。为此,我们将前一个区块的hash添加到我们新的区块中。这样我们就可以保持整个链的完整性。因为只要我们变更了最新区块的内容,我们就需要重新计算它的hash。当计算完成后,我将把这个区块推进链里(一个数组)。 最后,我创建一个isChainValid()来确保没有人篡改过区块链。它会遍历所有的区块来检查每个区块的hash是否正确。它会通过比较previousHash来检查每个区块是否指向正确的上一个区块。如果一切都没有问题它会返回true否则会返回false。使用区块链我们的区块链类已经写完啦,可以真正的开始使用它了!let savjeeCoin = new Blockchain(); savjeeCoin.addBlock(new Block(1, "20/07/2017", )); savjeeCoin.addBlock(new Block(2, "20/07/2017", )); 复制代码在这里我仅仅是创建了一个区块链的实例,并且命名它为SavjeeCoin!之后我在链上添加了一些区块。区块里可以包含任何你想要放的数据,不过在上面的代码里,我选择添加了一个带有amount属性的对象。试着操作吧!在介绍里我曾说过区块链是不可变的。一旦添加,区块就不可能再变更了。让我们试一下!// 检查是否有效(将会返回true) console.log('Blockchain valid? ' + savjeeCoin.isChainValid()); // 现在尝试操作变更数据 savjeeCoin.chain[1].data = ; // 再次检查是否有效 (将会返回false) console.log("Blockchain valid? " + savjeeCoin.isChainValid()); 复制代码我会在一开始通过运行isChainValid()来验证整个链的完整性。我们操作过任何区块,所以它会返回true。之后我将链上的第一个(索引为1)区块的数据进行了变更。之后我再次检查整个链的完整性,发现它返回了false。我们的整个链不再有效了。结论这个小栗子还远未达到完成的程度。它还没有实现POW(工作量证明机制)或P2P网络来与其它矿工来进行交流。但他确实证明了区块链的工作原理。许多人认为原理会非常复杂,但这篇文章证明了区块链的基本概念是非常容易理解和实现的。Part2:实现POW(proof-of-work:工作量证明)在part1中我们用JavaScript创建了一个简单的区块链来演示区块链的工作原理。不过这个实现并不完整,很多人发现依旧可以篡改该系统。没错!我们的区块链需要另一种机制来抵御攻击。那么让我们来看看我们该如何做到这一点!问题现在我们可以很快的创造区块然后非常迅速的将它们添加进我们的区块链中。不过这导致了三个问题:第一:人们可以快速创建区块然后在我们的链里塞满垃圾。大量的区块会导致我们区块链过载并让其无法使用。 第二:因为创建一个有效的区块太容易了,人们可以篡改链中的某一个区块,然后重新计算所有区块的hash。即使它们已经篡改了区块,他们仍然可以以有效的区块来作为结束。 第三:你可以通过结合上述两个破绽来有效控制区块链。区块链由p2p网络驱动,其中节点会将区块添加到可用的最长链中。所以你可以篡改区块,然后计算所有其他的区块,最后添加多任意你想要添加的区块。你最后会得到一个最长的链,所有的其它节点都会接受它然后往上添加自己的区块。 显然我们需要一个方案来解决这些问题:POW。什么是POWPOW是在第一个区块链被创造之前就已经存在的一种机制。这是一项简单的技术,通过一定数量的计算来防止滥用。工作量是防止垃圾填充和篡改的关键。如果它需要大量的算力,那么填充垃圾就不再值得。比特币通过要求hash以特定0的数目来实现POW。这也被称之为难度不过等一下!一个区块的hash怎么可以改变呢?在比特币的场景下,一个区块包含有各种金融交易信息。我们肯定不希望为了获取正确的hash而混淆了那些数据。为了解决这个问题,区块链添加了一个nonce值。Nonce是用来查找一个有效Hash的次数。而且,因为无法预测hash函数的输出,因此在获得满足难度条件的hash之前,只能大量组合尝试。寻找到一个有效的hash(创建一个新的区块)在圈内称之为挖矿。在比特币的场景下,POW确保每10分钟只能添加一个区块。你可以想象垃圾填充者需要多大的算力来创造一个新区块,他们很难欺骗网络,更不要说篡改整个链。实现POW我们该如何实现呢?我们先来修改我们区块类并在其构造函数中添加Nonce变量。我会初始化它并将其值设置为0。constructor(index, timestamp, data, previousHash = '') { this.index = index; this.previousHash = previousHash; this.timestamp = timestamp; this.data = data; this.hash = this.calculateHash(); this.nonce = 0; } 复制代码我们还需要一个新的方法来增加Nonce,直到我们获得一个有效hash。强调一下,这是由难度决定的。所以我们会收到作为参数的难度。mineBlock(difficulty) { while (this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0")) { this.nonce++; this.hash = this.calculateHash(); } console.log("BLOCK MINED: " + this.hash); } 复制代码最后,我们还需要更改一下calculateHash()函数。因为目前他还没有使用Nonce来计算hash。calculateHash() { return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data) + this.nonce ).toString(); } 复制代码将它们结合在一起,你会得到如下所示的区块类:class Block { constructor(index, timestamp, data, previousHash = '') { this.index = index; this.previousHash = previousHash; this.timestamp = timestamp; this.data = data; this.hash = this.calculateHash(); this.nonce = 0; } calculateHash() { return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data) + this.nonce).toString(); } mineBlock(difficulty) { while (this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0")) { this.nonce++; this.hash = this.calculateHash(); } console.log("BLOCK MINED: " + this.hash); } } 复制代码修改区块链现在,我们的区块已经拥有Nonce并且可以被开采了,我们还需要确保我们的区块链支持这种新的行为。让我们先在区块链中添加一个新的属性来跟踪整条链的难度。我会将它设置为2(这意味着区块的hash必须以2个0开头)。constructor() { this.chain = [this.createGenesisBlock()]; this.difficulty = 2; } 复制代码现在剩下要做的就是改变addBlock()方法,以便在将其添加到链中之前确保实际挖到该区块。下面我们将难度传给区块。addBlock(newBlock) { newBlock.previousHash = this.getLatestBlock().hash; newBlock.mineBlock(this.difficulty); this.chain.push(newBlock); } 复制代码大功告成!我们的区块链现在拥有了POW来抵御攻击了。测试现在让我们来测试一下我们的区块链,看看在POW下添加一个新区块会有什么效果。我将会使用之前的代码。我们将创建一个新的区块链实例然后往里添加2个区块。let savjeeCoin = new Blockchain(); console.log('Mining block 1'); savjeeCoin.addBlock(new Block(1, "20/07/2017", )); console.log('Mining block 2'); savjeeCoin.addBlock(new Block(2, "20/07/2017", )); 复制代码如果你运行了上面的代码,你会发现添加新区块依旧非常快。这是因为目前的难度只有2(或者你的电脑性能非常好)。如果你创建了一个难度为5的区块链实例,你会发现你的电脑会花费大概十秒钟来挖矿。随着难度的提升,你的防御攻击的保护程度越高。免责声明就像之前说的:这绝不是一个完整的区块链。它仍然缺少很多功能(像P2P网路)。这只是为了说明区块链的工作原理。并且:由于单线程的原因,用JavaScript来挖矿并不快。Part3 交易与挖矿奖励在前面两部分我们创建了一个简单的区块链,并且加入了POW来抵御攻击。然而我们在途中也偷了懒:我们的区块链只能在一个区块中存储一笔交易,而且矿工没有奖励。现在,让我们解决这个问题!重构区块类现在一个区块拥有index,previousHash,timestamp,data,hash和nonce属性。这个index属性并不是很有用,事实上我甚至不知道为什么开始我要将它添加进去。所以我把它移除了,同时将data改名为transactions来更语义化。class Block{ constructor(timestamp, transactions, previousHash = '') { this.previousHash = previousHash; this.timestamp = timestamp; this.transactions = transactions; this.hash = this.calculateHash(); this.nonce = 0; } } 复制代码当我们改变区块类时,我们也必须更改calculateHash()函数。现在它还在使用老旧的index和data属性。calculateHash() { return SHA256(this.previousHash + this.timestamp + JSON.stringify(this.transactions) + this.nonce).toString(); } 复制代码交易类在区块内,我们将可以存储多笔交易。因此我们还需要定义一个交易类,一边我们可以锁定交易应当具有的属性:class Transaction{ constructor(fromAddress, toAddress, amount){ this.fromAddress = fromAddress; this.toAddress = toAddress; this.amount = amount; } } 复制代码这个交易例子非常的简单,仅仅包含了发起方(fromAddress)和接受方(toAddress)以及数量。如果有需求,你也可以在里面加入更多字段,不过这个只是为了最小实现。调整我们的区块链当前的最大任务:调整我们的区块链来适应这些新变化。我们需要做的第一件事就是存储待处理交易的地方。正如你所知道的,由于POW,区块链可以稳定的创建区块。在比特币的场景下,难度被设置成大约每10分钟创建一个新区块。但是,是可以在创造两个区块之间提交新的交易。为了做到这一点,首先需要改变我们区块链的构造函数,以便他可以存储待处理的交易。我们还将创造一个新的属性,用于定义矿工获得多少钱作为奖励:class Blockchain{ constructor() { this.chain = [this.createGenesisBlock()]; this.difficulty = 5; // 在区块产生之间存储交易的地方 this.pendingTransactions = []; // 挖矿回报 this.miningReward = 100; } } 复制代码下一步,我们将调整我们的addBlock()方法。不过我的调整是指删掉并重写它!我们将不再允许人们直接为链上添加区块。相反,他们必须将交易添加至下一个区块中。而且我们将addBlock()更名为createTransaction(),这看起来更语义化:createTransaction(transaction) { // 这里应该有一些校验! // 推入待处理交易数组 this.pendingTransactions.push(transaction); } 复制代码挖矿人们现在可以将新的交易添加到待处理交易的列表中。但无论如何,我们需要将他们清理掉并移入实际的区块中。为此,我们来创建一个minePendingTransactions()方法。这个方法不仅会挖掘所有待交易的新区块,而且还会向采矿者发送奖励。minePendingTransactions(miningRewardAddress) { // 用所有待交易来创建新的区块并且开挖.. let block = new Block(Date.now(), this.pendingTransactions); block.mineBlock(this.difficulty); // 将新挖的看矿加入到链上 this.chain.push(block); // 重置待处理交易列表并且发送奖励 this.pendingTransactions = [ new Transaction(null, miningRewardAddress, this.miningReward) ]; } 复制代码请注意,该方法采用了参数miningRewardAddress。如果你开始挖矿,你可以将你的钱包地址传递给此方法。一旦成功挖到矿,系统将创建一个新的交易来给你挖矿奖励(在这个栗子里是100枚币)。有一点需要注意的是,在这个栗子中,我们将所有待处理交易一并添加到一个区块中。但实际上,由于区块的大小是有限制的,所以这是行不通的。在比特币里,一个区块的大小大概是2Mb。如果有更多的交易能够挤进一个区块,那么矿工可以选择哪些交易达成哪些交易不达成(通常情况下费用更高的交易容易获胜)。地址的余额在测试我们的代码钱让我们再做一件事!如果能够检查我们区块链上地址的余额将会更好。getBalanceOfAddress(address){ let balance = 0; // you start at zero! // 遍历每个区块以及每个区块内的交易 for(const block of this.chain){ for(const trans of block.transactions){ // 如果地址是发起方 -> 减少余额 if(trans.fromAddress === address){ balance -= trans.amount; } // 如果地址是接收方 -> 增加余额 if(trans.toAddress === address){ balance += trans.amount; } } } return balance; } 复制代码测试好吧,我们已经完成并可以最终一切是否可以正常工作!为此,我们创建了一些交易:let savjeeCoin = new Blockchain(); console.log('Creating some transactions...'); savjeeCoin.createTransaction(new Transaction('address1', 'address2', 100)); savjeeCoin.createTransaction(new Transaction('address2', 'address1', 50)); 复制代码这些交易目前都处于等待状态,为了让他们得到证实,我们必须开始挖矿:console.log('Starting the miner...'); savjeeCoin.minePendingTransactions('xaviers-address'); 复制代码当我们开始挖矿,我们也会传递一个我们想要获得挖矿奖励的地址。在这种情况下,我的地址是xaviers-address(非常复杂!)。之后,让我们检查一下xaviers-address的账户余额:console.log('Balance of Xaviers address is', savjeeCoin.getBalanceOfAddress('xaviers-address')); // 输出: 0 复制代码我的账户输出竟然是0?!等等,为什么?难道我不应该得到我的挖矿奖励么?那么,如果你仔细观察代码,你会看到系统会创建一个交易,然后将您的挖矿奖励添加为新的待处理交易。这笔交易将会包含在下一个区块中。所以如果我们再次开始挖矿,我们将收到我们的100枚硬币奖励!console.log('Starting the miner again!'); savjeeCoin.minePendingTransactions("xaviers-address"); console.log('Balance of Xaviers address is', savjeeCoin.getBalanceOfAddress('xaviers-address')); // 输出: 100 复制代码局限性与结论现在我们的区块链已经可以在一个区块上存储多笔交易,并且可以为矿工带来回报。不过,还是有一些不足:发送货币是,我们不检查发起人是否有足够的余额来实际进行交易。然而,这其实是一件容易解决的事情。我们也没有创建一个新的钱包和签名交易(传统上用公钥/私钥加密完成)。免责声明 & 源代码我想指出的是,这绝不是一个完整的区块链实现!它仍然缺少很多功能。这只是为了验证一些概念来帮助您来了解区块链的工作原理。该项目的源代码就放在我的GitHub
2023年03月24日
6 阅读
0 评论
0 点赞
2023-03-24
给Python初学者的最好练手项目
作者:xiaoyu微信公众号:Python数据科学知乎:Python数据分析师有很多朋友问我学习了Python后,有没有什么好的项目可以练手。其实,做项目主要还是根据需求来的。但是对于一个初学者来说,很多复杂的项目没办法独立完成,因此博主挑选了一个非常适合初学者的项目,内容不是很复杂,但是非常有趣,我相信对于初学者小白来说是再好不过的项目了。这个项目中,我们将要建立一个比特币价格的提醒服务。你将主要会学习到HTTP的请求,以及如何使用requests包来发送这些请求。 同时,你会了解webhooks和如何使用它将Python app与外部设备连接,例如移动端手机提醒或者 Telegram 服务。 仅仅不到50行的代码就能完成一个比特币价格提醒服务的功能,并且可以轻松的扩展到其它加密数字货币和服务中。下面我们马上来看看。用Python实现比特币价格提醒我们都知道,比特币是一个变动的东西。你无法真正的知道它的去向。因此,为了避免我们反复的刷新查看最新动态,我们可以做一个Python app来为你工作。为此,我们将会使用一个很流行的自动化网站IFTTT。IFTTT**("if this, then that")**是一个可以在不同app设备与web服务之间建立连接桥梁的工具。我们将会创建两个IFTTT applets:一个是当比特币价格下滑到一定阈值后的紧急提醒 另一个是常规的比特币价格的更新 两个程序都将被我们的Python app触发,Python app从Coinmakercap API 点这里 获取数据。一个IFTTT程序有两个部分组成:触发部分和动作部分。在我们的情况下,触发是一个IFTTT提供的webhook服务。你可以将webhook想象为"user-defined HTTP callbacks",更多请参考:WEBHOOK我们的Python app将会发出一个HTTP请求到webhook URL,然后webhook URL触发动作。有意思的部分来了,这个动作可以是你想要的任何东西。IFTTT提供了众多的动作像发送一个email,更新一个Google电子数据表,甚至可以给你打电话。配置项目如果你安装了python3,那么只要再安装一个requests包就可以了。$ pip install requests==2.18.4 # We only need the requests package 复制代码选一个编辑器,比如Pycharm进行代码编辑。获取比特币价格代码很简单,可以在console中进行。导入requests包,然后定义bitcoin_api_url变量,这个变量是Coinmarketcap API的URL。接着,使用requests.get()函数发送一个 HTTP GET请求,然后保存响应response。由于API返回一个JSON响应,我们可以通过.json()将它转换为python对象。>>>import requests >>>bitcoin_api_url = 'https://api.coinmarketcap.com/v1/ticker/bitcoin/' >>>response = requests.get(bitcoin_api_url) >>>response_json = response.json() >>>type(response_json) # The API returns a list <class 'list'> >>># Bitcoin data is the first element of the list >>>response_json[0] {'id': 'bitcoin', 'name': 'Bitcoin', 'symbol': 'BTC', 'rank': '1', 'price_usd': '10226.7', 'price_btc': '1.0', '24h_volume_usd': '7585280000.0', 'market_cap_usd': '172661078165', 'available_supply': '16883362.0', 'total_supply': '16883362.0', 'max_supply': '21000000.0', 'percent_change_1h': '0.67', 'percent_change_24h': '0.78', 'percent_change_7d': '-4.79', 'last_updated': '1519465767'} 复制代码上面我们感兴趣的是price_usd。发送一个测试的IFTTT提醒现在我们可以转到IFTTT上面来了。使用IFTTT之前,我们需要创建一个新账户IFTTT,然后安装移动端app(如果你想在手机上接到通知) 设置成功后就开始创建一个新的IFTTT applet用于测试。创建一个新的测试applet,可以按一下步骤进行:点击大的 "this" 按钮; 搜索 "webhooks" 服务,然后选择 "Receive a web request"触发; 重命名event为test_event; 然后选择大的 "that" 按钮; 搜索 "notifications" 服务,然后选择 "send a notification from the IFTTT app" 改变短信息为 I just triggered my first IFTTT action!,然后点击 "Create action"; 点击 "Finish" 按钮,完成; 要看如何使用IFTTT webhooks,请点击 "Documentation" 按钮documentation页有webhooks的URL。https://maker.ifttt.com/trigger//with/key/ 复制代码接着,你需要将替换为你在步骤3中自己起的名字。是已经有了的IFTTT key。现在你可以复制webhook URL,然后开启另一个console。同样导入requests然后发送post请求。>>>import requests >>># Make sure that your key is in the URL >>>ifttt_webhook_url = 'https://maker.ifttt.com/trigger/test_event/with/key/' >>>requests.post(ifttt_webhook_url) <Response [200]> 复制代码运行完之后,你可以看到:创建IFTTT Applets前面只是测试,现在我们到了最主要的部分了。再开始代码之前,我们需要创建两个新的IFTTT applets:一个是比特币价格的紧急通知,另一个是常规的更新。比特币价格紧急通知的applet:选择 "webhooks" 服务,并且选择 "Receive a web request" 的触发; 命名一个事件 event 为 bitcoin_price_emergency; 对于响应的动作部分,选择 "Notifications"服务,然后继续选择 "send a rich notification from the IFTTT app" 动作; 提供一个标题,像 "Bitcoin price emergency!" 设置短信息 为 Bitcoin price is at $}. Buy or sell now!(我们一会儿将返回到}部分) 可选的,你可以加入一个URL link 到 Coinmarketcap Bitcoin page:https://coinmarketcap.com/currencies/bitcoin/; 创建动作,然后完成applet的设置; 常规价格更新的applet:一样的选择 "webhooks" 服务,并且选择 "Receive a web request" 的触发; 命名一个事件 event 为 bitcoin_price_update; 对于响应的动作部分,选择 "Telegram" 服务,然后继续选择 "Send message" 动作; 设置短信信息文本为:Latest bitcoin prices:<br>}; 创建动作,然后完成applet的设置; 将所有连到一起现在,我们有了IFTTT,下面就是代码了。你将通过创建像下面一样标准的Python命令行app骨架来开始。 代码码上去,然后保存为 bitcoin_notifications.py:import requests import time from datetime import datetime def main(): pass if __name__ == '__main__': main() 复制代码接着,我们还要将前面两个Python console部分的代码转换为两个函数,函数将返回最近比特币的价格,然后将它们分别post到IFTTT的webhook上去。将下面的代码加入到main()函数之上。BITCOIN_API_URL = 'https://api.coinmarketcap.com/v1/ticker/bitcoin/' IFTTT_WEBHOOKS_URL = 'https://maker.ifttt.com/trigger//with/key/' def get_latest_bitcoin_price(): response = requests.get(BITCOIN_API_URL) response_json = response.json() # Convert the price to a floating point number return float(response_json[0]['price_usd']) def post_ifttt_webhook(event, value): # The payload that will be sent to IFTTT service data = # inserts our desired event ifttt_event_url = IFTTT_WEBHOOKS_URL.format(event) # Sends a HTTP POST request to the webhook URL requests.post(ifttt_event_url, json=data) 复制代码除了将价格从一个字符串变成浮点数之外,get_latest_bitcoin_price基本没太变。psot_ifttt_webhook需要两个参数:event和value。event参数与我们之前命名的触发名字对应。同时,IFTTT的webhooks允许我们通过requests发送额外的数据,数据作为JSON格式。这就是为什么我们需要value参数:当设置我们的applet的时候,我们在信息文本中有}标签。这个标签会被 JSON payload 中的values1文本替换。requests.post()函数允许我们通过设置json关键字发送额外的JSON数据。现在我们可以继续到我们app的核心main函数码代码了。它包括一个while True的循环,由于我们想要app永远的运行下去。在循环中,我们调用Coinmarkertcap API来得到最近比特币的价格,并且记录当时的日期和时间。根据目前的价格,我们将决定我们是否想要发送一个紧急通知。对于我们的常规更新我们将把目前的价格和日期放入到一个bitcoin_history的列表里。一旦列表达到一定的数量(比如说5个),我们将包装一下,将更新发送出去,然后重置历史,以为后续的更新。一个需要注意的地方是避免发送信息太频繁,有两个原因:Coinmarketcap API 声明他们只有每隔5分钟更新一次,因此更新太频也没有用 如果你的app发送太多的请求道 Coinmarketcap API,你的IP可能会被ban 因此,我们最后加入了 "go to sleep" 睡眠,设置至少5分钟才能得到新数据。下面的代码实现了我们的需要的特征:BITCOIN_PRICE_THRESHOLD = 10000 # Set this to whatever you like def main(): bitcoin_history = [] while True: price = get_latest_bitcoin_price() date = datetime.now() bitcoin_history.append() # Send an emergency notification if price < BITCOIN_PRICE_THRESHOLD: post_ifttt_webhook('bitcoin_price_emergency', price) # Send a Telegram notification # Once we have 5 items in our bitcoin_history send an update if len(bitcoin_history) == 5: post_ifttt_webhook('bitcoin_price_update', format_bitcoin_history(bitcoin_history)) # Reset the history bitcoin_history = [] # Sleep for 5 minutes # (For testing purposes you can set it to a lower number) time.sleep(5 * 60) 复制代码我们几乎快成功了。但是还缺一个format_bitcoin_history函数。它将bitcoin_history作为参数,然后使用被Telegram允许的基本HTML标签(像<br>, <b>, <i> 等等)变换格式。将这个函数复制到main()之上。def format_bitcoin_history(bitcoin_history): rows = [] for bitcoin_price in bitcoin_history: # Formats the date into a string: '24.02.2018 15:09' date = bitcoin_price['date'].strftime('%d.%m.%Y %H:%M') price = bitcoin_price['price'] # <b> (bold) tag creates bolded text # 24.02.2018 15:09: $<b>10123.4</b> row = ': $<b></b>'.format(date, price) rows.append(row) # Use a <br> (break) tag to create a new line # Join the rows delimited by <br> tag: row1<br>row2<br>row3 return '<br>'.join(rows) 复制代码最后在手机上显示的结果是这样的:然后,我们的功能就完成了,只要比特币的价格一更新,手机移动端就有提示。当然,如果你嫌烦也可以在app里面off掉。参考:https://realpython.com/python-bitcoin-ifttt/关注微信公众号Python数据科学,获取 120G 人工智能 学习资料。
2023年03月24日
8 阅读
0 评论
0 点赞
2023-03-24
椭圆曲线加密算法
椭圆曲线密码学(Elliptic curve cryptography),简称ECC,是一种建立公开密钥加密的算法,也就是非对称加密。类似的还有RSA,ElGamal算法等。ECC被公认为在给定密钥长度下最安全的加密算法。比特币中的公私钥生成以及签名算法ECDSA都是基于ECC的。下面简单介绍ECC以及ECDSA的原理。从公钥加密说起 公钥加密,也称非对称加密。可以说它现在是现代网络安全或者网络信任链的基础。公钥加密最大的特征就是通信双方各有一对公私钥,这一对公私钥有着千丝万缕的数学关系。每个人保存自己的私钥,公开自己的公钥。这样做的好处是不怕通信线路被窃听,因为攻击者拿到公钥是无法解出密文的。公私钥的基本使用场景主要有两种:假设通信双方叫Alice(公钥A、私钥a)和Bob(公钥B、私钥b)。公钥加密,私钥解密 Alice写了一封信,她不想让别人知道。于是它用Bob的公钥B对信的明文做了加密,密文为m。之后发送给了Bob。 Bob收到密文m,用自己的私钥b对密文解密,正确的读出了信的内容。 整个过程中,即使窃听者拿到密文m、两个人的公钥A、B都没有什么用,无法解密出任何东西。事实上,只有拥有私钥b的人才能解密出这份信息。换个角度来说,每个人都可以拥有Bob的公钥B,也就是说,每个人都可以创造一份只有Bob可以使用或者说只对Bob来说有效的信息。私钥加密,公钥解密 Alice写了一份公开声明文件,她用自己的私钥a对文件加了密,生成加密文件m,公布在自己的网站中。 Bob下载了这份声明文件,并用Alice的公钥A进行解密,正确的读出文件内容。 这个过程听起来有点奇怪,Alice既然公布的是声明文件,是想让别人阅读的,而且每个人都可以拿到Alice的公钥A,那么为什么还要加密呢?确实,每个人都可以对文件解密,可是这里的目的主要不是解密,而是对这份文件的来源验证,证明它肯定是由Alice发出的声明。即使文件被恶意篡改,那么此时再拿公钥A解密,就是无效的,由此可证明信息被改动过了,并不是Alice的原来文件。用这种方式使用公私钥可以证明信息的来源并且有不可否定的特性。(即Alice不能否认此信息不是由她发出的,因为只有私钥a可以产生加密文件m) 以上是使用公钥加密算法的基础场景,但事实上用上述方法进行通信还远远不够,例如需要提高加密速度,需要先对文件进行hash;再如不能抵御中间人攻击,(即获取的公钥不一定是正确的)需要引入证书,不过这些不在本文讨论范围之内。下面我们来看ECC是如何产生密钥对的。椭圆曲线这一节让我们来了解一些数学知识。一般来说,椭圆曲线可以用下列方程式表示,a,b,c,d为系数(a≠0,没有重根)例如,当a=1,b=0,c=-2,d=4时,所得到的椭圆曲线为:椭圆曲线下图所示。$E_1:y^2=x^3-2x+4$曲线其实椭圆曲线并不是我们高中学习的椭圆形状,其名字的由来是因为椭圆曲线的描述方程,类似于计算一个椭圆周长的方程。这里用于加密的椭圆曲线的定义是一个特殊情况,完整定义参考这里有了图像,我们接下来就可以搞一搞事情了????椭圆曲线的加法在这里首先要介绍一下群的概念。群是一种代数结构,由一个集合以及一个二元运算所组成。已知集合和运算(G,*)如果是群则必须满足如下要求封闭性:∀a,b∈G,a * b ∈ G 结合性:∀a,b,c∈G ,有 (a * b) * c = a * (b * c) 单位元:ョe∈G, ∀a ∈G,有e * a = a * e = a 逆元:∀a ∈G ,ョb∈G 使得 a * b = b * a = e 另外,有一种特殊的群叫阿贝尔群,它除了上面的性质还满足交换律公理 a * b = b * a举个例子,在整数范围内的加法运算就是一个阿贝尔群(Z,+)。封闭性:a和b是整数,那么a+b肯定是整数。 结合性:(a + b) + c = a + (b + c)。 单位元:0即为单位元,因为对于所有整数a, a + 0 = 0 + a = a。 逆元: a的逆元为-a,因为a + (-a) = 0,即单位元。 所以(Z,+)是阿贝尔群。现在,我们来定义椭圆曲线上的加法。现在有椭圆曲线,曲线上的点P和Q。过P和Q做一条直线,交椭圆曲线为点R',再过R'点做垂直于X轴的直线,交曲线另一点为R,定义P + Q = R。如下图所示。若P=Q,则为过P点的切线交于椭圆曲线为R'。如下图所示。 这样,称R = 2P。类似的,3P = P + P + P = P + 2P = P + R。也就是说,当给定点P时,“已知数x求点xG的运算”不难,因为有加法的性质,运算起来可以比较快。但反过来,“已知点xG求x的问题”则非常困难,因为只能遍历每一个x做运算。这就是椭圆曲线密码中所利用的“椭圆曲线上的离散对数问题”。要想使这个运算满足阿贝尔群的性质,我们还要引入一个无穷远点O,可以把它理解为平行直线的交点(如果感觉难以理解,请参考无穷远点的定义),我们把这个O点作为单位元。(方便理解,你可以当做所有平行于y轴的直线交于O点)。有了上述无穷远点的定义,不难证明椭圆曲线上的加法为一个阿贝尔群。椭圆曲线上的离散对数问题 椭圆曲线密码利用了上述“运算”中的“椭圆曲线上的离散对数问题”的复杂度,就像RSA利用了“大数质因数分解”的复杂度,以及EIGamal密码的Diffie-Hellman密钥交换利用了“有限域上的离散对数问题”的复杂度一样。椭圆曲线上的离散对数问题:已知 椭圆曲线E 椭圆曲线E上一点G(基点) 椭圆曲线E上的一点xG(x倍的G) 求解 x 这个问题的难度保证了椭圆曲线密码的安全性。有限域上的椭圆曲线 到这里,椭圆曲线的定义及运算都是实数范围内的,其实椭圆曲线密码所使用的运算,是在有限域上。有限域是指对于某个给定的质数p,由0,1,2,.....,p-1共p个元素所组成的整数集合中定义的加减乘除运算。此运算使用的是模运算。我们来看一个具体的例子:当这个椭圆曲线位于实数域R上时,图像如下图所示,是一条光滑的曲线。同样是这条曲线,当位于有限域上时,写作:即左侧与右侧的结果除以23的余数相等,也叫左侧与右侧的数值模23同余。于是上述图像并不是一条曲线,而是一些离散的点。图像如下图所示。如果我们以椭圆曲线上的点P =(3,10)为基点,按照椭圆曲线“加法”运算的规则计算2P,3P,4P...结果如下图所示。我们可以看到,所产生的点可以说是无规律可言,例如点P = (3,10),点23P = (9,7)。在这里求离散对数问题就相当于已知点(3,10)和点(9,7),求23。在这个例子中p=23,问题还不难解,如果当p数值非常大时,要求出这个解是十分困难的。产生公钥和私钥在椭圆曲线加密中,给定椭圆曲线E,基点G和点xG,我们称xG为公钥,x值为私钥。由椭圆曲线性质可知,已知私钥求公钥很简单,而已知公钥求私钥几乎是不可能的事情。椭圆曲线密码的应用有了密钥对,就可以做很多公钥加密的事情了,比如最基本的加密通信,验证数字签名等。这里仅介绍数字签名,其他的原理本质上也都是一样的。数字签名:椭圆曲线DSA(ECDSA)依然假设Alice要发布公开文件,并对此文件进行数字签名。Bob需要验证该签名。(以下涉及计算的部分都是求模运算)生成数字签名Alice根据随机数 和基点 求出点 = (x,y) Alice根据随机数 、消息 的散列值 、私钥 计算 最后,Alice将消息 、点 和 发送给Bob,其中点 和 就是数字签名 验证数字签名Bob接收到消息 、点 和 Bob根据消息 求出散列值 最后,Bob进行以下计算: 最后把R和rG进行比较,如果相等,则验证签名正确,否则说明是错误的数字签名。 验证原理这里关键的一点是Alice签名的时候引入了随机数 ,而利用公钥A=aG的特性,在算式中只有A可以消除随机变量r的因素。引入随机数也提高了安全性,即便对于同一条消息,只要改变随机数R,所得到的签名也会随之改变。至此,我们对于椭圆加密ECC的原理以及ECDSA数字签名有了大致的了解。参考资料:ECC椭圆曲线详解图解密码技术第三版
2023年03月24日
6 阅读
0 评论
0 点赞
2023-03-24
使用Remix编译和部署以太坊智能合约
Remix 是一个开源的 Solidity 智能合约开发环境,提供基本的编译、部署至本地或测试网络、执行合约等功能。Solidity 是 以太坊Ethereum 官方设计和支持的开发语言,专门用于编写智能合约。本文希望将一个很简单的代币合约(只能发行和转账),部署在本地和测试网络上,测试下它的功能。详细描述使用 Remix 的步骤及使用上可能碰到的问题。之前开发过以太坊Ethereum智能合约,但没有记录过开发的过程和碰到的问题,觉得挺可惜。这次重新开始,从最基础开始,一步步学习。开发环境不需要安裝,直接在任何浏览器启动 Remix。取得代币合约代币合约的范例很多,Ethereum 官网有提供一个最小可执行的代币合约(MINIMUM VIABLE TOKEN):pragma solidity ^0.4.0; contract MyToken { /* This creates an array with all balances */ mapping (address => uint256) public balanceOf; /* Initializes contract with initial supply tokens to the creator of the contract */ function MyToken(uint256 initialSupply) public { balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens } /* Send coins */ function transfer(address _to, uint256 _value) public { require(balanceOf[msg.sender] >= _value); // Check if the sender has enough require(balanceOf[_to] + _value >= balanceOf[_to]); // Check for overflows balanceOf[msg.sender] -= _value; // Subtract from the sender balanceOf[_to] += _value; // Add the same to the recipient } } 复制代码这个 MyToken 合约真的很简单,只能做两件事:创建代币:发起合约时创建指定数量的代币,代币拥有者是发起合约的 Ethereum 帐户 转移代币:转移指定数量的代币到指定的 Ethereum 帐户 至于一个完整的代币合约,可参考ERC20 Token使用手冊。使用 Remix 编译合约点右上角 + 新增一个合约 名称任意只要扩展名是 “.sol”。 复制合约內容到该合约并编译 Remix 默认设置会自动编译,只要旁边没有蹦出红色的 error 提示就代表编译成功。 在本地部署合约1.设置网络 点选左上的 run。Environment 选择 JavaScript VM 代表所有资料都是存在本地(功能类似 testrpc)。它会提供 5 个虚拟账户每个有 100 ETH,随便选择一个账户(要记住后面一直要用)。2.发送交易部署合约 选择 MyToken。可以看到 create 按钮。且已根据合约內容显示必须输入 initialSupply(也就是要发行的代币数量)。输入一个数目点create,就可以发送交易部署合约。合约部署成功后,可以看到合约的使用界面。Remix 会自动根据合约的內容,产生对应的合约使用界面。可以看到合约有两个功能:balanceOf(查询余额) 和 transfer(转移代币)。底下可以看到 log(记录每一次的操作)。实际上部署合约是通过一个 Ethereum 交易完成,点 Details 可以看到这笔交易详细资料。执行合约 — 查询余额1.选择刚刚发起合约的账户可以点右边的按钮复制2.输入账户 注意要用 “” 把账户括起來,示例:"0xca35b7d915458ef540ade6068dfe2f44e8fa733c" 复制代码3.点击 balanceOf可以看到执行结果,也就是目前这个账户的代币余额。可能的错误情況说明一点,因为数据传输是用 JSON 格式,所以要加上 “”。如果忘了 “” 就会在 log 中看到错误提示:执行合约 — 转移代币1.选择要输出的账户 选择刚刚发起的合约的账户。2.输入要转入的账户 选择並复制另一个账户。在合约界面 transfer 后面的输入位置,输入转入账户和要转移的代币数量。账户同样需要用 “” 括起來,示例:"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db", 10 复制代码3.点击 transfer 点击 transfer,成功后会看到 log 更新。4.确认余额更新 这时在查询转入账户的余额,就可以看到代币余额增加啦!错误情況 如果选择要转出的账户代币余额不足,这个交易就会失败,会在 log 看到错误提示。在测试网络部署合约1.安裝 MetaMask 首先,要连到测试网络,这就要安裝 MetaMask。它是浏览器端的 Ethereum 钱包,可以连結 Ethereum 公共和测试网络。安装后需要建立 Ethereum 账号,这个这里就不细讲了。成功启动后是这样的。我们选择 Ropsten Test Net2.选择测试网络回到 Remix,这次 Environment 选择 Injected Web3,Remix 会自动连接 MetaMask。成功连接后会看到和 MetaMask 相同账号和 Ether 余额3.部署合约 接着用同样的方式,按 create 部署合约,就会看到 MetaMask 的弹出窗口。直接按 submit 发送交易。稍等片刻(需要等交易被确认),部署成功后合约的使用界面就会出来。ok,现在可以用同样的方式使用合约啦!总结下Remix 提供一个 Solidity 智能合约的开发环境,可以方便的编译、部署、执行甚至找错,适合编程经验不多的初学者。但无法做到版本控制、测试及和其他开发工具一起使用等,实际上要开发 DApp,使用 Truffle3、Ganache、web3.js 来编译和部署合约比较方便和专业些更适合开发人员。推荐一个适合区块链新手的以太坊DApp开发教程:xc.hubwiz.com/course/5a95…如果想加入以太坊技术开发群可以加微信:cuixuebin2,拉你入群。
2023年03月24日
8 阅读
0 评论
0 点赞
2023-03-24
以太坊 DApp 开发入门,如何搭建一个区块链投票系统。
第一节 概述对于初学者,需要了解以太坊开发相关的基本概念,另外就是如何构建一个基于以太坊的完整去中心化应用例如一个区块链投票系统。通过学习,你将掌握:以太坊区块链的基本知识 开发和部署以太坊合约所需的软件环境 使用高级语言(solidity)编写以太坊合约 使用NodeJS编译、部署合约并与之交互 使用Truffle框架开发分布式应用 使用控制台或网页与合约进行交互 以太坊开发的前序知识要求为了顺利完成本课程,最好对以下技术已经有一些基本了解:一种面向对象的开发语言,例如:Python,Ruby,Java... 前端开发语言:HTML/CSS/JavaScript Linux命令行的使用 数据库的基本概念 第二节 简介我们将会构建一个去中心化的(Decentralized)投票应用。利用这个投票应用, 用户可以在不可信(trustless)的分布环境中对特定候选人投票,每次投票都会被记录在区块 链上:所谓去中心化应用(DApp:Dcentralized Application),就是一个不存在中心服务器 的应用。在网络中成百上千的电脑上,都可以运行该应用的副本,这使得它几乎不可能 出现宕机的情况。基于区块链的投票是完全去中心化的,因此无须任何中心化机构的存在。第三节 开发迭代涵盖应用开发的整个过程,我们将通过三次迭代来渐进地引入区块链应用 开发所涉及的相关概念、语言和工具:Vanilla:在第一个迭代周期,我们不借助任何开发框架,而仅仅使用NodeJS来进行应用开发, 这有助于我们更好地理解区块链应用的核心理念。 Truffle:在第二个迭代周期,我们将使用最流行的去中心化应用开发框架Truffle进行开发。 使用开发框架有助于我们提高开发效率。 Token:在第三个迭代周期,我们将为投票应用引入代币(Token) —— 现在大家都改口 称之为通证了 —— 都是ICO惹的祸。代币是公链上不可或缺的激励机制,也是区块链 应用区别于传统的中心化应用的另一个显著特征。 为什么选择投票应用?之所以选择投票作为我们的第一个区块链应用,是因为集体决策 —— 尤其是投票机制 —— 是以太坊的 一个核心的价值主张。另一个原因在于,投票是很多复杂的去中心化应用的基础构件,所以我们选择了投票应用作为学习区块链 应用开发的第一个项目。第四节 初识区块链如果你熟悉关系型数据库,就应该知道一张数据表里可以包含很多行数据记录。例如,下面的数据表中 包含了6条交易记录:本质上,区块链首先就是一个分布式(Distributed)数据库,这个数据库维护了一个不断增长的记录列表。 现在,让我们对数据进行批量(batch)存储,比如每批 100 行,并将各存储批次连接起来,是不是就像一条链?在区块链里,多个数据记录组成的批次就被称为块(block),块里的每一行数据记录就被称为交易(transaction):最开始的那个块,通常被称为创世块(genesis block),它不指向任何其他块。不可篡改性区块链的一个显著特点是,数据一旦写入链中,就不可篡改重写。在传统的关系型数据库中,你可以很容易地更新一条数据记录。但是,在区块链中,一旦数据写入就无法 再更新了 —— 因此,区块链是一直增长的。那么,区块链是如何实现数据的不可篡改特性?这首先得益于哈希(Hash)函数 —— 如果你还没接触过哈希函数,不妨将它视为一个数字指纹的计算函数: 输入任意长度的内容,输出定长的码流(指纹)。哈希函数的一个重要特性就是,输入的任何一点微小变化,都会 导致输出的改变。因此可以将哈希值作为内容的指纹来使用。 你可以点击这里进一步了解哈希函数。由于区块链里的每个块都存储有前一个块内容的哈希值,因此如果有任何块的内容被篡改,被篡改的块之后 所有块的哈希值也会随之改变,这样我们就很容易检测出区块链的各块是否被篡改了。去中心化的挑战一旦完全去中心化,在网络上就会存在大量的区块链副本(即:全节点),很多事情都会变得比之前中心化 应用环境复杂的多,例如:如何保证所有副本都已同步到最新状态? 如何保证所有交易都被广播到所有运行和维护区块链副本的节点计算机上? 如何防止恶意参与者篡改区块链 ...... 在接下来的课程中,通过与经典的C/S架构的对比,我们将逐步理解去中心化应用的核心思路, 并掌握如何构建以太坊上的去中心化应用。第五节 C/S架构以服务器为中心理解去中心化应用架构的最好方法,就是将它与熟悉的Client/Server架构进行对比。如果你是一个web开发者, 应该对下图很了解,这是一个典型的Client/Server架构:一个典型web应用的服务端通常由 Java,Ruby,Python 等等语言实现。前端代码由 HTML/CSS/JavaScript 实现。 然后将整个应用托管在云端,比如 AWS、Google Cloud Platform、Heroku....,或者放在你租用的一个VPS 主机上。用户通过客户端(Client)与 web 应用(Server)进行交互。典型的客户端包括浏览器、命令行工具(curl、wget等)、 或者是API访问代码。注意在这种架构中,总是存在一个(或一组)中心化的 web 服务器,所有的客户端都需要 与这一(组)服务器进行交互。当一个客户端向服务器发出请求时,服务器处理该请求,与数据库/缓存进行交互, 读/写/更新数据库,然后向客户端返回响应。这是我们熟悉的中心化架构。在下一节,我们将会看到基于区块链的去中心化架构的一些显著区别。第六节 去中心化架构——彼此平等的节点下图给出了基于以太坊的去中心化应用架构:你应该已经注意到,每个客户端(浏览器)都是与各自的节点应用实例进行交互,而不是向 一个中心化的服务器请求服务。在一个理想的去中心化环境中,每个想要跟DApp交互的人,都需要在他们的计算机或手机上面运行 一个的完整区块链节点 —— 简言之,每个人都运行一个全节点。这意味着,在能够真正使用一个 去中心化应用之前,用户不得不下载整个区块链。不过我们并非生活在一个乌托邦里,期待每个用户都先运行一个全节点,然后再使用你的应用是不现实的。 但是去中心化背后的核心思想,就是不依赖于中心化的服务器。所以,区块链社区已经出现了 一些解决方案,例如提供公共区块链节点的Infura, 以及浏览器插件Metamask等。通过这些方案, 你就不需要花费大量的硬盘、内存和时间去下载并运行完整的区块链节点,同时也可以利用去中心化 的优点。我们将会以后的课程中对这些解决方案分别进行评测。第七节 以太坊——世界计算机以太坊是一种区块链的实现。在以太坊网络中,众多的节点彼此连接,构成了以太坊网络:以太坊节点软件提供两个核心功能:数据存储、合约代码执行。在每个以太坊全节点中,都保存有完整的区块链数据。以太坊不仅将交易数据保存在链上,编译后 的合约代码同样也保存在链上。以太坊全节点中,同时还提供了一个虚拟机来执行合约代码。交易数据以太坊中每笔交易都存储在区块链上。当你部署合约时,一次部署就是一笔交易。当你为候选者投票时,一次投票 又是另一笔交易。所有的这些交易都是公开的,每个人都可以看到并进行验证。这个数据永远也无法篡改。为了确保网络中的所有节点都有着同一份数据拷贝,并且没有向数据库中写入任何无效数据,以太坊 目前使用工作量证明 (POW:Proof Of Work)算法来保证网络安全,即通过矿工挖矿(Mining)来达成共识(Consensus)—— 将数据同步到所有节点。工作量证明不是达成共识的唯一算法,挖矿也不是区块链的唯一选择。现在,我们只需要了解,共识是指各节点 的数据实现了一致,POW只是众多用于建立共识的算法中的一种,这种算法需要通过矿工的挖矿来实现非可信环境下的 可信交易。共识是目的,POW是手段。合约代码以太坊不仅仅在链上存储交易数据,它还可以在链上存储合约代码。在数据库层面,区块链的作用就是存储交易数据。那么给候选者投票、或者检索投票结果的逻辑放在哪儿呢? 在以太坊的世界里,你可以使用Solidity语言来编写业务逻辑/应用代码(也就是合约:Contract), 然后将合约代码编译为以太坊字节码,并将字节码部署到区块链上:编写合约代码也可以使用其他的语言,不过 Solidity是到目前为止最流行的选择。以太坊虚拟机以太坊区块链不仅存储数据和代码,每个节点中还包含一个虚拟机(EVM:Ethereum Virtual Machine)来执行 合约代码 —— 听起来就像计算机操作系统。事实上,这一点是以太坊区别于比特币(Bitcoin)的最核心的一点:虚拟机的存在使区块链迈入了2.0 时代,也让区块链第一次成为应用开发者友好的平台。JS开发库为了便于构建基于web的DApp,以太坊还提供了一个非常方便的JavaScript库web3.js,它封装了以太坊节点的API 协议,从而让开发者可以轻松地连接到区块链节点而不必编写繁琐的RPC协议包。所以,我们可以在常用的JS框架 (比如 reactjs、angularjs 等)中直接引入该库来构建去中心化应用:有兴趣可以继续: xc.hubwiz.com/course/5a95…
2023年03月24日
8 阅读
0 评论
0 点赞
2023-03-24
18年给自己做个Token吧
注:一般大家都普遍喜欢把 Token 叫成 代币,但是这样讲很不准确,如果非要叫成中文,我更认同 通证 这种理解。但为了保持原汁原味,不必非得翻译过来叫,所以本文统一保持英文的形式。一般 Token 制作的门槛其实没有多高,所以大家完全都有能力可以去制作出自己命名的 Token。不过你也别指望啥也不学就能做出一些拥有额外逻辑的 Token,比如众筹合约等,所以想要做的与众不同,那么就需要花些成本。下面就直奔主题,我们不需要了解如何编写智能合约,因为以太坊提供的 ERC20 协议已经足够傻瓜式了,做一个简单的 Token 官方就有一个标准的智能合约代码作为示例,那么我们只需要知道制作的流程就行了。啰嗦一句,其实学习其他的技术知识也是如此,我们不要急于追求很内在的东西,我们需要 正反馈 式学习法,先做出一些简单的 Demo,逐步在建立自信心和激发热情的同时不断深入学习。安装 MetaMask我们首先需要安装一个浏览器的插件 MetaMask,该插件作者非常 nice,主流的三大浏览器(Google、FireFox、Opera)上都可以安装这款实用的插件。安装这款插件的过程就不赘述了,现在假定我们已经装好了,点开该插件,经过两次 Accept 同意条款的操作后,进入创建账户的页面。注意图上的三处箭头第一处箭头表示我们目前是处于 Ropsten Test Net 测试网络,与平常大家在用的以太坊主网络的主要区别就仅仅是大家只承认主网络上的以太币价值,而该测试网络主要用来进行开发测试。 第二处箭头表示新建一个账户合约,作为以太坊网络上的一个合法用户。 第三处箭头表示导入一个账户合约,假如你在该网络上有账户合约的话。 新建合约账户在创建账户页面上输入自己的大于八位字符的密码后,进入 助记词 页面,这些助记词是唯一能帮助你保存自己账户合约的密钥,妥善保管。购买以太币不要慌,不是让你真的花钱去买,只需要在 MetaMask 提供的网站上点几下按钮就能获取到以太币(毕竟这些测试网络上的以太币没有实际价值)。保存完助记词后我们就会进入到账户主页面,我们可以看到我们的账户上余额是零,点击箭头1的购买按钮,进入确认页面再点击上图中的箭头1按钮,进入购买页面,网址是 Test Ether Faucet点击箭头1按钮,既可以获取到一个以太币(按一次获取一个),我获取了6个以太币,箭头2处即是转账交易记录。OK,我们先暂时放一放 MetaMask,接下来让我们去玩玩 Remix!认识 Remix IDERemix 是一个基于浏览器的 Solidity IDE,基本的智能合约代码的开发调试在这上面进行是相当舒服的。Remix - Solidity IDE第一处箭头是项目目录栏,可以在这里创建文件目录 第二处箭头是代码栏,我们的合约代码就在这里编写 第三处箭头是日志栏,部署调试的日志输出都在这里显示 第四处箭头是调试栏,对合约的部署、调试等操作都在这里进行 需要熟悉这个工具吗?当然,而且越熟悉越好,但不是现在,别忘了我们现在的目标是制作自己的 Token。Token 合约以太坊官方网站上有一份标准的 Token 合约供学习者参考,而且也有很详细的教程教大家如何去部署自己的 Token。Create a cryptocurrency contract in Ethereum本文与官方不同的是我们使用 轻钱包 MetaMask 和在线开发环境 Remix 进行开发调试部署,官方的以太坊钱包对于初学者来说有个挺苦恼的地方,同步主网络或者测试网络的全节点数据很慢,而且占用磁盘空间较大。初次体验尽量还是选择轻松的方式,不要给自己留下坏心情 :)我们将官方的 Token 合约代码拷贝到 Remix 的代码栏中,合约代码这里也贴一下:pragma solidity ^0.4.16; interface tokenRecipient contract TokenERC20 { // Public variables of the token string public name; string public symbol; uint8 public decimals = 18; // 18 decimals is the strongly suggested default, avoid changing it uint256 public totalSupply; // This creates an array with all balances mapping (address => uint256) public balanceOf; mapping (address => mapping (address => uint256)) public allowance; // This generates a public event on the blockchain that will notify clients event Transfer(address indexed from, address indexed to, uint256 value); // This notifies clients about the amount burnt event Burn(address indexed from, uint256 value); /** * Constructor function * * Initializes contract with initial supply tokens to the creator of the contract */ function TokenERC20( uint256 initialSupply, string tokenName, string tokenSymbol ) public { totalSupply = initialSupply * 10 ** uint256(decimals); // Update total supply with the decimal amount balanceOf[msg.sender] = totalSupply; // Give the creator all initial tokens name = tokenName; // Set the name for display purposes symbol = tokenSymbol; // Set the symbol for display purposes } /** * Internal transfer, only can be called by this contract */ function _transfer(address _from, address _to, uint _value) internal { // Prevent transfer to 0x0 address. Use burn() instead require(_to != 0x0); // Check if the sender has enough require(balanceOf[_from] >= _value); // Check for overflows require(balanceOf[_to] + _value > balanceOf[_to]); // Save this for an assertion in the future uint previousBalances = balanceOf[_from] + balanceOf[_to]; // Subtract from the sender balanceOf[_from] -= _value; // Add the same to the recipient balanceOf[_to] += _value; Transfer(_from, _to, _value); // Asserts are used to use static analysis to find bugs in your code. They should never fail assert(balanceOf[_from] + balanceOf[_to] == previousBalances); } /** * Transfer tokens * * Send `_value` tokens to `_to` from your account * * @param _to The address of the recipient * @param _value the amount to send */ function transfer(address _to, uint256 _value) public { _transfer(msg.sender, _to, _value); } /** * Transfer tokens from other address * * Send `_value` tokens to `_to` on behalf of `_from` * * @param _from The address of the sender * @param _to The address of the recipient * @param _value the amount to send */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { require(_value <= allowance[_from][msg.sender]); // Check allowance allowance[_from][msg.sender] -= _value; _transfer(_from, _to, _value); return true; } /** * Set allowance for other address * * Allows `_spender` to spend no more than `_value` tokens on your behalf * * @param _spender The address authorized to spend * @param _value the max amount they can spend */ function approve(address _spender, uint256 _value) public returns (bool success) { allowance[msg.sender][_spender] = _value; return true; } /** * Set allowance for other address and notify * * Allows `_spender` to spend no more than `_value` tokens on your behalf, and then ping the contract about it * * @param _spender The address authorized to spend * @param _value the max amount they can spend * @param _extraData some extra information to send to the approved contract */ function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) { tokenRecipient spender = tokenRecipient(_spender); if (approve(_spender, _value)) { spender.receiveApproval(msg.sender, _value, this, _extraData); return true; } } /** * Destroy tokens * * Remove `_value` tokens from the system irreversibly * * @param _value the amount of money to burn */ function burn(uint256 _value) public returns (bool success) { require(balanceOf[msg.sender] >= _value); // Check if the sender has enough balanceOf[msg.sender] -= _value; // Subtract from the sender totalSupply -= _value; // Updates totalSupply Burn(msg.sender, _value); return true; } /** * Destroy tokens from other account * * Remove `_value` tokens from the system irreversibly on behalf of `_from`. * * @param _from the address of the sender * @param _value the amount of money to burn */ function burnFrom(address _from, uint256 _value) public returns (bool success) { require(balanceOf[_from] >= _value); // Check if the targeted balance is enough require(_value <= allowance[_from][msg.sender]); // Check allowance balanceOf[_from] -= _value; // Subtract from the targeted balance allowance[_from][msg.sender] -= _value; // Subtract from the sender's allowance totalSupply -= _value; // Update totalSupply Burn(_from, _value); return true; } } 复制代码部署合约接下来我们先选择好我们的编译器的版本,对应合约代码首行的版本号 pragma solidity ^0.4.16点击箭头1的标签页,进入设置界面,然后点击箭头2选择相应的编译器版本,这里即选择 0.4.16。然后点击编译标签(Compile),会看到已经编译成功然后点击运行标签(Run),进行部署操作第一处箭头选择部署环境,这边会自动检测到我们的 MetaMask 当前所处的网络(Ropsten Test Net)。 第二处箭头输入我们 Token 的一些基本信息 第一个参数表示 Token 总发行量,我这里随便填了一千万个 第二个参数表示 Token 名称 第三个参数表示 Token 符号,一般在流通过程中均以该符号作为 Token 的标识 第三处箭头点击即创建部署交易单,开始最终的部署 这里唯一可以改的是 Gas Limit 和 Gas Price,一般来讲这两个数据会自动根据当前合约的复杂度和市场平均水准生成。所以一般不需要去改这两个值,如果是囊中羞涩,改低一点也是可以的,但是可能会出现 Gas 被消耗完的情况(Gas 一旦被消耗完而合约仍未部署到网络上,那么所有操作都会进行回滚,除了你支付的矿工费)。点击发布按钮(SUBMIT),静静等待发布成功吧!此时打开 MetaMask 页面上图为发布中状态,下图为发布结束的状态,此时会发现我们的账户余额减少了一些,因为被用于支付发布合约的矿工费了。到这里还不清楚是否成功发布了,点击交易单进入交易详情页面,当你看到箭头1处的 Success 时就表示我们的 Token 发布成功啦!点击箭头2处的合约地址链接,进入合约详情页点击箭头处的 Token 地址链接,进入 Token 详情页至此我们的 Token 就做完啦!钱包中显示 Token我们以 MetaMask 为例演示一下,其他钱包比如 ImToken 同样的只需要将 Token 地址复制过去就能看到了。先切换到 Token 标签页点击添加 Token,输入刚才的 Token 合约地址点击添加按钮,就能在 MetaMask 上看到我们自己的 Token 了。小结在制作 Token 的整个过程中,并没有难点,只是大多数人不清楚流程,当自己实操一遍后立马就能上手。后面我们会去玩一些复杂一点的智能合约,但同样的,需要一些基本的 Solidity 编程语言的知识以及区块链相关的知识。Solidity 这门以太坊的标准编程语言之后的文章也会详细讲解,大家尽请期待~欢迎关注公众号:『比特扣』,与我一起探索区块链的世界。
2023年03月24日
5 阅读
0 评论
0 点赞
2023-03-24
如何在 Goerli 网络中获取测试 ETH
以太坊在合并前的最后一个测试网络于8月11日在Goerli上上线。Goerli testnet是以太坊主网预计下个月与Beacon链合并之前的最后一次测试运行。主网合并将使以太坊完全从工作量证明型区块链转换为权益证明型区块链,已在 9月中旬完成。对于开发以太坊相关DAPP等,需要获取 Goerli 网络中使用的测试 Ether。要在 Goerli 测试网上获取 ETH,需要准备一个 Twitter 帐户、Metamask。获取测试 ETH 的方法打开 Metamask 钱包并选择 Goerli 网络:复制 ETH 地址并发布一条包含以太坊地址的推文。打开 faucet.goerli.mudit.blog/ 并将推文的 URL 粘贴到输入框中。在输入框右侧选择 6.25 Ethers / 9 days完毕!几分钟后,6.25 Goerli 测试 ETH 将添加到 Metamask 钱包中。挖矿获取通过一个挖矿型的网页,把钱包地址输入进去,无需链接钱包,即可在线挖矿,只要页面不关闭就可以了。经测试,挖矿速度时快时慢,快的时候2分钟就能挖出零点几个测试ETH,慢的时候可能10多分才能挖出零点零几测试ETH,但是做为紧急情况时使用,完全足够。挖矿地址:goerli-faucet.pk910.de/这是一个在Goerli Testnet上运行的以太坊水龙头,这个水龙头需要一些挖矿工作来完成交换免费的testnet资金。建议不要使用代理只需输入ETH地址并开始挖矿,当你收集到足够的ETH时,停止挖矿并领取你的奖励。
2023年03月24日
7 阅读
0 评论
0 点赞
1
...
74
75
76
...
109