分类 技术前沿 下的文章 - 六币之门
首页
视频教程
网站导航
活动日历
关于我们
用户投稿
推荐
新闻动态
搜 索
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领投
67 阅读
5
【ETH钱包开发06】查询某个地址的交易记录
43 阅读
新闻动态
每日快报
一周精选
融资情况
项目投研
自治组织
数字藏品
去中心化应用
去中心化游戏
去中心化社交
去中心化金融
区块链交易所
科普知识
小白入门
用户手册
开发文档
行业报告
技术前沿
登录
搜 索
标签搜索
新闻
日报
元歌Eden
累计撰写
1,087
篇文章
累计收到
0
条评论
首页
栏目
新闻动态
每日快报
一周精选
融资情况
项目投研
自治组织
数字藏品
去中心化应用
去中心化游戏
去中心化社交
去中心化金融
区块链交易所
科普知识
小白入门
用户手册
开发文档
行业报告
技术前沿
页面
视频教程
网站导航
活动日历
关于我们
用户投稿
推荐
新闻动态
用户登录
登录
找到
109
篇与
技术前沿
相关的结果
2023-03-06
如何获取持有代币的合约地址
一、如何通过web3使用python获取etherscan上面的持币数据 或者还有其他办法吗要通过Web3使用Python获取Etherscan上的持币数据,您可以使用Etherscan API。Etherscan API提供了各种方法来查询以太坊地址和交易数据,包括查询余额、交易历史记录和代币持有量等。以下是获取以太坊地址的代币余额的Python代码示例: # Etherscan API endpoint url = "https://api.etherscan.io/api" # Replace with your own API key api_key = "YourApiKeyToken" # Ethereum address to query address = "0x1234567890abcdef1234567890abcdef12345678" # Token contract address to query contract_address = "0x1234567890abcdef1234567890abcdef12345678" # API parameters payload = { "module": "account", "action": "tokenbalance", "contractaddress": contract_address, "address": address, "tag": "latest", "apikey": api_key, } # Make API request response = requests.get(url, params=payload) # Parse response data if response.status_code == 200: data = response.json() balance = data["result"] print("Balance: ", balance) else: print("Error: ", response.status_code) 复制代码您需要替换api_key、address和contract_address参数来适应您的实际情况。您可以在Etherscan网站上获取API密钥,还可以在网站上找到其他API方法和参数的文档。另外,您也可以使用其他第三方API服务提供商的API来查询以太坊地址和交易数据,例如Infura和Alchemy。这些服务提供商也提供Python SDK,使得使用API变得更加方便二、我想获取持有token代币的合约地址 如何获取要获取持有特定代币的合约地址,您可以使用Etherscan的Token Holders API。此API允许您查询指定代币的持有者列表和他们的持币量。以下是使用Python获取代币持有者列表的代码示例: # Etherscan API endpoint url = "https://api.etherscan.io/api" # Replace with your own API key api_key = "YourApiKeyToken" # Token contract address to query contract_address = "0x1234567890abcdef1234567890abcdef12345678" # API parameters payload = { "module": "stats", "action": "tokenholders", "contractaddress": contract_address, "apikey": api_key, } # Make API request response = requests.get(url, params=payload) # Parse response data if response.status_code == 200: data = response.json() holders = data["result"] for holder in holders: address = holder["address"] balance = holder["balance"] print(address, balance) else: print("Error: ", response.status_code) 复制代码您需要替换api_key和contract_address参数来适应您的实际情况。请注意,此API仅返回前100个持有者,如果有更多持有者,您需要使用分页参数来获取完整的列表。此外,该API返回的持币量是以最小代币单位(如Wei)表示的,您需要将其转换为实际的代币数量。注意:有时候Token Holders API不能够查询到所有的代币持有者,这可能是因为某些持有者选择了隐私选项,因此他们的信息不会出现在公共的代币持有者列表中。三、如果不通过Api获取 如何通过其他方式获取呢 # Initialize Web3 instance w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/your-project-id')) # Token contract address to query contract_address = '0x1234567890abcdef1234567890abcdef12345678' # Token contract ABI contract_abi = [ { "constant": True, "inputs": [], "name": "balanceOf", "outputs": [], "payable": False, "type": "function" } ] # Create contract instance contract = w3.eth.contract(address=contract_address, abi=contract_abi) # Ethereum address to query address = '0x1234567890abcdef1234567890abcdef12345678' # Get token balance for address balance = contract.functions.balanceOf(address).call() print('Token balance:', balance) 复制代码在这个例子中,我们首先使用Web3库初始化了一个连接到以太坊网络的实例。然后,我们指定要查询的代币合约地址和合约ABI。我们使用这些信息创建了一个合约实例。接下来,我们查询了代币合约的转账事件,并获取了所有转入地址(即代币持有者)的列表。最后,我们使用Python的set类型获取所有唯一的地址,这将去除重复的地址。最终,我们打印出所有唯一的地址。请注意,您需要替换contract_address和Infura项目ID来适应您的实际情况。此外,您需要了解代币合约的ABI,以便正确地调用其事件。四、如何查代币合约的转账事件呢 普通的转账里面是否有代币的持有者?查询代币合约转账事件通常需要使用区块链浏览器或者开发工具。大多数区块链浏览器,如Etherscan、Alchemy、Infura等,都支持查询代币合约的交易和事件。您可以在区块链浏览器中输入代币合约的地址以查看其相关的交易和事件。然后,您可以筛选出转账事件并查看该事件的详细信息。一般情况下,转账事件会记录资产转移的发送地址、接收地址和数量。如果您想查询普通转账(不是代币转移)中的代币持有者,可能会有困难。因为普通转账并不会记录代币的所有者信息。因此,您必须通过查询代币合约的余额或者相关的代币转账事件来获取代币持有者的信息。五、如何利用Python操作web3来查询合约转账事件呢 需要从0开始扫描块数吗 还是有其他的办法呢利用Python操作web3查询合约转账事件,可以使用web3.py库来实现。以下是一个简单的示例代码,演示如何查询ERC20代币转账事件:from web3 import Web3 # 连接到以太坊节点 w3 = Web3(Web3.HTTPProvider("https://mainnet.infura.io/v3/<your-infura-project-id>")) # ERC20代币合约地址 token_address = "0x<ERC20-Token-Address>" # 转账事件的名称和参数 event_name = "Transfer" event_args = # 获取合约实例 contract = w3.eth.contract(token_address, abi=<ERC20-Token-ABI>) # 获取块高度 latest_block = w3.eth.blockNumber # 开始扫描区块 for block_number in range(latest_block - 1000, latest_block): block = w3.eth.getBlock(block_number, True) # 遍历区块中的交易 for tx in block.transactions: # 判断交易是否调用了ERC20代币合约 if tx.to == token_address: # 解码交易的输入数据 input_data = contract.decode_function_input(tx.input) # 判断交易是否是转账事件 if input_data[0].fn_name == event_name: # 解码事件的参数 args = input_data[1] # 判断事件的参数是否符合查询条件 if args[0] == event_args["from"] and args[1] == event_args["to"]: # 打印事件信息 print(f"Block : transferred tokens to ") 复制代码上述代码中,首先使用Web3类连接到以太坊节点。然后,指定ERC20代币合约的地址和ABI(应该替换为实际的值),并获取合约实例。接下来,获取最新块的高度,并从最新块开始向前扫描一定数量的块。对于每个块,遍历其中的交易。如果交易的接收地址是ERC20代币合约地址,那么解码交易的输入数据,并判断是否是转账事件。如果是转账事件,再解码事件的参数,并判断是否符合查询条件。如果符合条件,打印事件信息。需要注意的是,上述代码是从最新块开始向前扫描一定数量的块。这种方式可能会漏掉早期的转账事件。如果要确保获取所有的转账事件,可以使用历史数据的API或者事件订阅的方式来获取数据。例如,可以使用web3.eth.getLogs()方法来查询历史事件,或者使用web3.eth.subscribe()方法来订阅事件。六、从最新的块往前查询岂不是很慢 还有其他的方式吗从最新块往前查询确实会比较慢,因为需要遍历所有的区块并检查其中的交易。为了提高效率,可以考虑以下两种方式:使用事件订阅 可以使用web3.py提供的web3.eth.subscribe()方法来订阅合约的转账事件。这样,当有新的转账事件发生时,程序会自动接收到相关信息。相对于从最新块往前扫描,使用事件订阅可以减少查询的次数,提高效率。以下是一个简单的示例代码:from web3.eth import Contract # 连接到以太坊节点 w3 = Web3(Web3.HTTPProvider("https://mainnet.infura.io/v3/<your-infura-project-id>")) # ERC20代币合约地址 token_address = "0x<ERC20-Token-Address>" # 转账事件的名称和参数 event_name = "Transfer" event_args = # 获取合约实例 contract = Contract.from_abi("MyToken", address=token_address, abi=<ERC20-Token-ABI>, w3=w3) # 定义事件处理函数 def handle_event(event): if event["event"] == event_name and event["args"]["from"] == event_args["from"] and event["args"]["to"] == event_args["to"]: print(f"Block : transferred tokens to ") # 订阅转账事件 contract.events.Transfer().on("data", handle_event) 复制代码上述代码中,首先连接到以太坊节点,并指定ERC20代币合约的地址和ABI(应该替换为实际的值)。然后,获取合约实例,并定义一个事件处理函数。该函数会在收到符合条件的转账事件时打印相关信息。最后,使用contract.events.Transfer().on("data", handle_event)方法来订阅转账事件。使用历史数据的API 如果需要查询一段时间内的转账记录,可以使用web3.py提供的web3.eth.get_logs()方法来获取历史数据。该方法可以指定查询的范围、查询的条件、返回的字段等。以下是一个简单的示例代码:from web3.eth import Contract # 连接到以太坊节点 w3 = Web3(Web3.HTTPProvider("https://mainnet.infura.io/v3/<your-infura-project-id>")) # ERC20代币合约地址 token_address = "0x<ERC20-Token-Address>" # 转账事件的名称和参数 event_name = "Transfer" event_args = # 获取合约实例 contract = Contract.from_abi("MyToken", address=token_address, abi=<ERC20-Token-ABI>, w3=w3) # 查询转账事件 logs = contract 复制代码查询转账事件logs = contract.events.Transfer().getLogs(fromBlock=, toBlock=, argument_filters=event_args)处理转账事件for log in logs: print(f"Block : transferred tokens to ")上述代码中,首先连接到以太坊节点,并指定ERC20代币合约的地址和ABI(应该替换为实际的值)。然后,获取合约实例,并指定查询的条件,包括起始块号、结束块号、转账事件的名称和参数。使用`contract.events.Transfer().getLogs()`方法来查询符合条件的转账事件,并返回日志数据。最后,遍历日志数据,处理转账事件。 需要注意的是,使用历史数据的API可以指定查询的范围,但是需要指定起始块号和结束块号,因此需要预先知道要查询的块号范围。另外,历史数据可能存在缺失或不完整的情况,因此需要特别注意数据的准确性。 复制代码七、以太坊如何自己搭建节点 这样读数据是没有限制的要在以太坊网络中读取数据,你可以连接到以太坊节点并查询数据。如果你拥有自己的以太坊节点,则可以完全控制节点并读取任何你需要的数据,而不受任何限制。以下是在Ubuntu操作系统上设置以太坊节点的步骤:安装Geth:在终端中运行以下命令以安装Geth。 sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get update sudo apt-get install ethereum 复制代码启动节点:在终端中运行以下命令以启动以太坊节点。 geth --datadir /path/to/data/dir --networkid <network-id> --rpc --rpcapi <api-list> 复制代码其中,/path/to/data/dir指定了以太坊节点的数据目录,<network-id>指定了以太坊网络的ID,<api-list>指定了要启用的JSON-RPC API。连接节点:使用Python的web3.py库,你可以连接到自己的以太坊节点并查询数据。在Python中,可以使用以下代码连接到节点。 from web3 import Web3 w3 = Web3(Web3.HTTPProvider('http://localhost:8545')) 复制代码在此代码中,`http://localhost:8545`是你以太坊节点的JSON-RPC API地址。 复制代码4. 查询数据:在连接到以太坊节点后,你可以使用web3.py库查询数据。例如,以下代码查询最新的区块号。 block_number = w3.eth.blockNumber print("Latest block number:", block_number) 复制代码在这个例子中,`w3.eth.blockNumber`返回当前以太坊网络上最新的块号。 复制代码这些步骤可以帮助你在Ubuntu操作系统上设置一个以太坊节点,并使用Python的web3.py库读取以太坊数据。注意,搭建自己的以太坊节点需要消耗大量的计算资源和网络带宽,因此需要合理安排资源,并避免对网络造成过多的负担。八、Etherscan、Alchemy、Infura 这些是什么?他们都是节点吗 链上转账是需要多个节点认证吗 他们是如何认证的呢Etherscan、Alchemy和Infura都是以太坊节点服务提供商。它们提供了基础设施和工具,使得开发者可以轻松地访问以太坊网络并与之交互。 复制代码具体来说,这些服务提供商提供以下功能:以太坊节点服务:他们运行自己的以太坊节点,并提供API接口,使得开发者可以连接到这些节点并查询数据。 区块浏览器:这些服务提供商提供了基于Web的用户界面,可以方便地浏览以太坊网络上的交易、合约和地址等信息。 交易推送:这些服务提供商可以向以太坊网络推送交易,从而使得开发者可以轻松地发送交易而无需担心节点同步等问题。 在以太坊网络中,链上转账需要节点共识,这是由矿工节点完成的。具体来说,当一个用户向另一个用户发送以太币或代币时,这笔交易将被广播到整个网络中,并且需要被节点验证和确认。在确认之后,这笔交易将被打包进一个区块中,并广播到整个网络中。矿工节点将竞争打包这个区块,这需要消耗一定的计算资源和电力。一旦一个矿工节点成功地打包了一个区块,这个区块将被广播到整个网络中,并成为区块链的一部分。Etherscan、Alchemy和Infura等服务提供商都运行自己的以太坊节点,并参与到节点共识中。这些节点需要共同验证和确认交易,并打包区块。因此,这些服务提供商是在以太坊网络中的节点之一,而不是认证节点。九、我们自己是否可以搭建自己的以太坊服务 供我们自己读取数据是的,您可以搭建自己的以太坊节点,以便自己读取和分析以太坊网络的数据。搭建一个本地的以太坊节点可以使您无需依赖第三方服务提供商,获得更高的数据隐私性和安全性,并获得更高的可定制性和灵活性。 复制代码以下是一些流程上的概述,以帮助您开始:安装以太坊客户端程序:您需要安装以太坊客户端程序,如Geth或Parity,以连接到以太坊网络。您可以从官方网站上下载并安装这些程序。 同步区块数据:一旦您安装并启动以太坊客户端程序,您需要等待客户端程序同步以太坊网络的区块数据。这可能需要一些时间,具体取决于您的网络连接速度和以太坊网络的状态。 与以太坊网络交互:一旦您的以太坊节点已经完成了同步,您可以使用以太坊客户端程序提供的API来与以太坊网络进行交互,例如查询账户余额、交易历史和智能合约等信息。 请注意,搭建一个自己的以太坊节点需要一些技术知识,并需要您具备一定的计算机和网络知识。如果您是初学者,建议先从一些较简单的任务开始,例如查询以太坊账户的余额,逐渐掌握一些基本的API调用和以太坊的核心概念,然后再尝试搭建自己的以太坊节点。十、自己搭建的以太坊节点 数据是从哪读取的 从以太坊网络还是第三方的服务提供商您自己搭建的以太坊节点会直接连接到以太坊网络,并从网络中的其它节点获取区块数据和交易数据。这些区块数据和交易数据是直接从以太坊网络中获取的,因此不存在第三方服务提供商对数据的控制或限制。 复制代码当您启动一个以太坊节点时,该节点会自动加入到以太坊网络中,并开始下载最新的区块数据和交易数据。一旦您的节点完成了同步,您就可以从自己的节点上查询以太坊网络中的数据,而不必依赖于任何第三方服务提供商。请注意,由于以太坊网络非常庞大且数据量巨大,因此同步区块数据可能需要一些时间。如果您想尽快完成同步,您可以使用更快的计算机和更快的网络连接,或者选择从较早的区块数据开始同步。十一、代币持有的合约地址上面的备注 是如何知道这个地址是谁的一般情况下,代币持有的合约地址上面并不包含持有人的具体信息,只包含一个代币数量的数据。 复制代码如果您需要确定一个代币地址属于谁,您可以尝试通过以下方式:在代币合约的官方网站或文档中查找相关信息。有些代币发行者会在其官方网站或文档中提供有关代币地址和持有人的信息。 在以太坊区块浏览器上搜索代币地址,查看与该地址相关的交易和智能合约。通过分析这些交易和智能合约,您可能会找到与该地址关联的其他信息,例如交易的发送方和接收方。 通过与代币地址相关联的交易或智能合约来跟踪该地址的持有人。通过分析代币交易记录,您可能会找到与该地址关联的其他地址,这些地址可能是该地址的持有人或与该地址相关联的其他地址。 请注意,这些方法可能并不总是有效,并且需要一些技术知识和经验才能执行。对于一些隐私保护比较好的代币,地址的持有人可能不易被追踪。此外,对于大多数代币,其发行者并不会公开其持有人的信息,因此有时很难确定代币地址的真实持有人。
2023年03月06日
4 阅读
0 评论
0 点赞
2023-03-06
基于NOSTR协议的“公有制”版本的Twitter,去中心化社交软件Damus用后感,一个极端走向另一个极端
最近,一个幽灵,Web3的幽灵,在网络游荡,它叫Damus,这玩意诠释了什么叫做病毒式营销,滑稽的是,一个Web3产品却在Web2的产品链上疯狂传销,各方大佬纷纷为其背书,到底发生了什么?Damus的葫芦里,卖的是什么药?注册和简单实用很少有什么产品在用户注册环节会有什么噱头,但Damus确实出其不意,它抛开了传统的Web3产品“区块链钱包先行”的策略,直接一键式生成秘钥对,没有了任何门槛,即使是对Web3完全没有任何概念的普通人,也可以直接上手使用,这里我们使用Damus的网页版,直接访问 snort.social/login:点击页面中的Generate Key按钮即可注册。注册成功后,进入settings,选择profile,账户设置页面。在这里我们可以像传统的web2.0社交产品一样,填写昵称,上传头像或者banner,以及其他的一些个人资料,总体上乏善可陈,设置完毕后是这样的:值得一提的是,这里用户的唯一标识是一串公钥(Public Key)地址:npub16mu2qn54ehx3eh04jy5naq72xkhx3wz6shmkmlr35cpjccgyy5ksvm0pluDamus的用户可以根据公钥地址来选择关注其他用户,也可以进行“发帖”操作,发布的“帖子”会被关注者们看到,玩惯了Twitter的用户对这些都不陌生。在个人设置页面中:snort.social/settings/pr… ,有一个很关键的私钥(Private Key),这个东西是唯一能够证明“你是你自己”的凭证,有点像区块链钱包Metamask中的助记词,登录Damus的时候,可以选择使用私钥进行登录。NOSTR协议Damus底层基于NOSTR协议,那么什么是NOSTR协议?其实和我们熟识的HTTP协议也差不了太多,也分为两个端,只不过HTTP协议是客户端和服务端,而NOSTR协议则没有服务端,取而代之的是中继端(relay)。说白了,没有了中心化的服务器端,变成点对点的中继器,这个中继器可以理解为“共产化”的服务器,每个人都可以搭建并且传输数据,如此就形成了一个完全去中心化的社交网络。好处就是用户不再受中心化服务器的制约,只要中继器存在,就可以发布想要发布的所有信息。在后台我们也可以自由的设置和添加NOSTR协议的中继器,甚至可以修改读写权限:数据交换形式则采用websocket + JSON 的方式:具体的交互数据包括当前用户的档案信息,比如公钥地址、用户头像,用户简介等等,用户发送的信息内容,也就是帖子内容,最后,是用户推送给关注者的中继器地址,例如上文中的wss://relay.snort.social。一个极端走向另一个极端NOSTR协议赋予了Damus网络用户极致的“自由”,可是“自由”也是需要付出代价的,那就是负面有害信息的肆意传播和增长,由于任何人都可以运行一个或多个中继器,所以,就很难有人能控制所有的中继器,也就没法针对某些散发有害信息的公钥地址进行限制,这就意味着,没有了任何所谓的“规则”,变成了彻头彻尾的“黑暗森林法则”。不得不承认,去中心化带来的并非都是美好的事物。它同样刺激了信息操纵和误导我们的判断,从而给去中心化网络带来了诸多问题。这些问题就像顽疾一样,让人们痛苦却无可奈何。我们往往并不清楚自己真正需要的是什么,而这个弱点常常会被利益集团抓住,并加以充分利用。这就是他们的欺骗行为。欺骗行为的不可避免性未必源于那些品质恶劣的人,而是很可能源于去中心化的自然运作。举个例子,20世纪40、50年代,逐步有医学证据表明吸烟和肺癌之间的关系。但是由烟草公司资助的研究,指出吸烟与癌症之间的关系还没有被证实。哥伦比亚广播公司的电视节目里安排的论战,显得“抽烟导致癌症”和“抽烟不会导致癌症”的证据难分胜负。但美国1964年卫生总署发布报告,明确指出,抽烟有害健康。该报告代表了美国政府的官方立场。1973年,在公共场所吸烟被禁止。为了应对烟草行业联盟“抽烟很潇洒”的诱惑,反烟草运动持续传播“抽烟很愚蠢”这一信念。1964年发布的卫生总署报告在这方面居功至伟,这,就是监管的力量。结语成也去中心化,败也去中心化,在去中心化网络中,拿着钓竿坐等鱼上钩的“姜太公”无处不在,根据简单的概率原理,就算我们谨小慎微、如履薄冰,最终,迟早都会被人“钓”到,没有人能够幸免。
2023年03月06日
4 阅读
0 评论
0 点赞
2023-03-06
建议收藏,轻松搞懂区块链!
未来已来,只是不均衡地分布在当下大家好,我是菜农,欢迎来到我的频道。本文共 5844字,预计阅读 30 分钟区块链是近些年来最热门的前沿技术,被认为是未来十几年对金融、物联网、医疗等诸多领域产生最大影响的"黑科技"之一。在本篇中我们将掌握区块链的基本概念、技术构成 与 逻辑结构一、基本概念“区块链” 这个概念是由一个网名为中本聪的人在2008年发表的《比特币:一种点对点的电子现金系统》中提出的。随后他实现了一个比特币系统,并发布了加密数字货币—比特币。接下来出现了以太坊和超级账本这样的大型区块链项目。那么在你的认知中,区块链是什么样的?下面整理了几种选项,看下是否有符合你认知的选项。区块链是比特币,比特币就是区块链 区块链很值钱 区块链可以运用在任何领域 区块链是免费的 区块链是非常安全的 通常来说,选项1是大多倾向的结果。但比特币和区块链两者不能等同,实际上,区块链是比特币的底层技术,如果要举例比喻的话,就好比用面粉可以做包子,但不能说面粉等于包子,包子等于面粉。而这里的面粉就相当于是包子。当然了作为底层技术的存在,不仅仅应用于比特币的实现中,还有很多其他基于区块链技术的应用。那么区块链究竟是什么?从比较专业的维度上看,可以从以下三点来解释区块链是底层技术 作为一个底层技术,它是包含了 P2P动态组网、基于密码学的共享账本、共识机制、智能合约 等关键技术区块链是一个数字货币和账本系统 从货币学的角度看,区块链是数字货币系统的分布式共享账本系统,这是一个去中心化的、网内用户共同维护的账本系统。区块链是互联网的基础设施 它提供了分布式去中心化的价值互联网,为更多大规模的共享、协作应用创造可能。作为解释依据,这里提取了来自中本聪在2008年发表的《比特币:一种点对点的电子现金系统》中的一段描述:时间戳服务器对以区块(Block)形式存在的一组数据是实施随机散列并加上时间戳,然后将该随机散列进行广播,就像在新闻后世界性新闻组网络(Usenet)的发帖一样。显然,该时间戳能够证实特定数据于某特定时间是的确存在的,因为只有在该时刻存在了才能获取相应的随机散列值。每个时间戳应当将前一个时间戳纳入其随机散列值中,每一个随后的时间戳都对之前的一个时间戳进行增强(Reinforcing),这样就形成了一个(Chain),即区块链,如下图所示:文字较为苍白,我们看图可以很清晰的看出 区块链就是由 区块 和 链 构成的1)区块区块是区块链的组成单元,就像金字塔是由一块块石头组成的一样,区块链就是一个个区块组成的。区块是由一系列特征值和一段时间内的交易记录组成的一个数据结构。区块的数据结构是由 区块头 和 区块体 组成。其中区块头包含了当前区块的特征值,区块体中包含的是实际的交易记录数据。1、数据结构1️⃣ 区块头区块头是由 80 个字节组成,主要由版本号、前一个区块的哈希值、Merkle根、时间戳、bits、Nonce 这几项区块的特征值组成。ver: 版本号,表示本区块遵守的验证规则 prev_block: 父区块哈希值,指的是这个区块连接的上一个区块的哈希值 mrkl_root: mrkl_root 根,是该区块链交易的 Merkle 树根的哈希值(Merkle 是一种哈希树的数据结构) time: 时间戳,区块生成的时间 bits: 区块的难度值,该区块工作量证明算法的难度目标,使用特定的算法编码 Nonce: 是一个随机数,为了找到满足难度目标所设定的 2️⃣ 区块体区块体主要包括了 交易数量(n_tx)、区块大小(size)和长度不定的交易记录(tx 字段包含的交易列表) 等信息。但这只是比特币中的区块体结构,实际上区块体重可以包括任何内容,比如以太坊的区块体中除了交易数据还包含智能合约。2)区块特点区块是由计算机通过加密算法生成的。如果成功地生成一个有效的区块,该计算机(节点)就能获得一定的奖励,这个奖励就是加密数字货币,也就是所谓的 挖矿。加密算法并不是容易生成结果的,而是该区块的哈希值必须满足一定的条件。这个条件就是能够使得区块头中特征值相加生成的哈希值需要符合一定格式,比如难度值为 000,由于哈希值随着输入的不同而不同,因此计算机要不断尝试改变区块头的 Nonce 值直至最终生成的哈希值满足条件才算生成了一个有效的区块。我们可以借助 Blockchain Demo 工具来尝试生成一个区块。从图中可以看出在 HASH 一栏中的数据是红色的,说明该哈希值是无效的。因为未满足 000 开头的数据。那么我们需要再次计算后查看结果可以看出这次的结果为绿色,是有效的,因为该数据满足 000 开头。我们将上面的区块结果进行解读,可以分为以下几部分:索引: 表示区块在区块链中的位置,其中第一个区块为 创世区块(索引为 0) ,第二个区块的索引为1,第三个区块的索引为2,以此类推。 时间戳: 表示该区块的生成时间,根据时间戳可以判断区块链中各个区块生成的先后顺序。 哈希值: 表示每个区块的唯一标识,也可称为区块的 数字指纹。哈希值的长度是固定的,而且和区块的内容紧密关联,一旦区块内容发生改变,该区块的哈希值也会发生改变。而且,区块中的哈希值还有 有效 和 无效 之分,满足特定条件的哈希值是有效的,否则就是无效的。这个特定条件一般称称为 *困难度(Difficulty) *。父区块哈希值就是区块中特定区块前一个区块的哈希值。 数据: 区块中的数据可以是任何内容,比特币区块链的区块中的数据为一串串交易记录。 Nonce: 是一个随机数,用来生成一个有效的哈希值。Nonce 会根据区块数据的不同而不同,每个区块都需要经过大量计算才能找到对应的 Nonce 值。 创世区块: 区块链中的第一个区块,它没有父区块,故创世区块的父区块哈希值为空或者为 0。 2)运行原理综上所述,区块链就是一个链表,而这个链表就是由一个个区块组成的,这些区块依次连接,形成一个不可篡改的链条,那么其中的运行过程我们也可以由此推出:首先构成区块链的去中心化网络中的第一个节点,生成一个 创世区块 然后通过 挖矿 生成新的区块添加到区块链中 新的节点加入到去中心化网络中会先生成一个最新的区块链数据 随后每个节点生成的区块都会向网络中的其他节点进行广播 其他节点收到广播后会判断自己是否已经收到该区块,是的话就忽略,否的话会先校验该区块是否有效,如果是有效的区块则会添加到自己的区块链中 3)小结区块链中的节点始终都讲最长的链条作为正确的链,并持续延长和维护这条链。当节点发现有更长的链条并且本身的链条不是最新时,就会使用最长的链条提花你当前节点的链条。若一个节点判断出本身的区块链是最新的,再收到新的区块信息时,节点就会把新的区块添加到自身链条的最后。 当一个区块链的节点掌握了整个区块链中 51% 以上的计算能力时,它就可以重写整个区块链。基于这个原因,区块链中的计算能力过度集中会很危险。只有一个庞大且均匀分布的区块链才比较安全。 二、技术构成区块链主要由三个核心技术构成,分别是 共识机制、智能合约、去中心化网络。1)共识机制共识机制是区块链中的重要机制,不同的区块链项目可能使用不同的共识机制。网络中的各个节点根据共识机制达成共识,共同维护整个区块链网络。1、PoW 机制工作量证明机制(Proof of Work,PoW),工作量证明就是一份证明,它用来确定完成了一定量的工作并可以因此获得一定的奖励。工作量证明是一种对应服务与资源滥用,或是阻断服务供给的对策。一般要求发起者进行一些耗时的复杂运算,并且结果能被快速验算。在计算过程中耗用的时间和资源作为成本,据此来确定建立或惩罚,以此来维护系统的一致性。工作量证明机制最常用的技术原理是哈希函数,工作量证明机制如下:取得一些公开的数据,并加上一个随机数(Nonce) 以数据和随机数作为输入值计算哈希值 检查生成的哈希值是否符合一定的条件。若符合就几下这个随机数的值并退出。若不符合则改变随机数的值再重新计算。 由于工作量证明机制需要消耗巨大的算力,如果有人尝试恶意破坏,需要付出巨大的经济成本,这就防止了恶意的数据修改。缺点: 只有第一个获取有效哈希值的节点能得到奖励,其他节点的计算会被浪费掉。2、PoS机制权益证明机制(Proof of Stake,PoS)试图解决在 PoW 机制中大量资源被浪费的问题。不同于 PoW 机制要求进行一定量的计算,PoS 机制要求提供的是保证金,或者说是一定数量数字货币的拥有权。PoS 机制的工作原理是通过保证金来确认一个合法的块成为新的区块,收益为保证金的利息和交易服务费。提供证明的保证金越多,则获得记账权的概率越大。比如系统中有A、B、C、D4个人,A有40个币,B有30个币,C有20个币,D有10个币,那么A获得记账权的概率就是D的4倍PoS 机制的好处是在一定程度上缩短了共识达成的时间,不再需要大量消耗能源挖矿,其与 PoW 机制的区别如下:3、DPoS 机制股份授权证明机制(Delegated Proof of Stake,DPoS),与 PoS 机制基本原理相同,只是选举了若干代理人,由代理人执行验证和记账功能,工作原理如下:在 DPoS 机制下,每个节点按其持币比例拥有影响力,51%节点投票的结果将是不可逆切有约束力的。其过程为:每个节点可以将其投票权授予一名代表,获票数最多的前 100 位代表按既定时间表轮流产生区块。每名代表分配到一个时间段来生产区块。所有的代表将收到等同于一个平均水平的区块所含交易费的 10% 作为报酬。如果一个平均水平的区块含有 100 股作为交易费,每个节点将获得 1 股作为报酬DPoS 的好处是大幅缩小了参与验证和记账节点的数量,可以达到秒级的共识验证4、DAG 机制有向无环图(Direct Acyclic Graph,DAG),DAG 是一个没有有向循环的、有限的有向图。它由有限个顶点和有向边组成,每条有向边都从一个顶点指向另一个顶点;从任意一个顶点出发都不能通过这些有向边回到原来的顶点传统的区块链只有一条单链,而在一条单链上无法并发打包区块。而DAG 是一种拓扑结构,在区块打包时间不变的情况下,可以并行打包N个区块,那么区块链的交易容纳能力就可以变成原来单链情况下的N倍。2)智能合约智能合约不是区块链的必要组成,它是区块链 2.0 之后出现的技术。如果把区块链比作一个公司,智能合约相当于公司中的规章制度,员工工作的时候会依据规章制度形式,而在有智能合约的区块链中,链上的节点会依据智能合约进行工作。智能合约不只是一个可以自动执行的计算机程度,它还是一个基于区块链的参与者。它对接收到的信息进行回应,它可以接收和存储价值,也可以向外发送信息和价值。智能合约具体是指运行在可复制、共享的账本上的计算机程序,可以处理信息,接收、存储和发送价值的脚本特点不可篡改 分布式 自动触发 不依赖第三方 3)去中心化网络去中心化网络不同于中心化网络。在中心化网络中,需要中心服务器,是一种星型的辐射结构。中心化网络 去中心化网络 我们演化成区块链的形式:三、逻辑结构从架构上来说,区块链大致可以分为4层,从下到上依次为 数据层、网络层、合约层 和 应用层1)数据层数据层是区块链的逻辑架构中最基础的一层,功能主要包括区块数据的存储、哈希值和 Merkle 树的计算以及链式结构的生成,其中进行数据的存储时需要重点考虑数据存储的性能和稳定性。在比特币和以太坊中的存储功能选择的是 LevelDB数据库。数据层的功能是把交易数据存储到区块中并将区块加入到区块链中。当节点之间发生交易后会将交易数据广播到区块链的去中心化网络上,网络中其他节点负责校验这些交易。交易被确认有效后会存储到区块中,并加入到区块链。2)网络层网络层主要包括 P2P 网络 和 共识算法 两个组成部分。P2P (Peer to Peer)网络也称为点对点网络或对等网络,根据去中心化程度的不同可以将其分为以下三种:纯P2P网络 节点同时作为客户端和服务器 没有中心服务器 没有中心路由器 杂P2P网络 有一个中心服务器保存节点的信息并对请求这些信息的客户端作出响应 节点负责发布信息(因为中心服务器并不保存文件),让中心服务器知道哪些文件被共享,让需要的节点下载其可下载其可使用的资源 路由重点使用地址,通过被一组索引引用来获取绝对地址 混合P2P网络 同时含有纯P2P网络和杂P2P网络的特点在 P2P 网络中,各个节点需要对区块链中的各个区块达成共识才能共同维护同一分布式账本。这个共识的机制就是共识算法,比较最为常用的共识算法有工作量证明机制(Proof of Work,PoW)、权益证明机制(Proof of Stake,PoS)、股份授权证明机制(Delegated Proof of Stake,DPoS)3)合约层合约层的功能使得区块链中的区块具有可编程的特性,并且赋予了区块链智能的特性,在区块链中智能合约的作用如同一个智能助理,对区块链中的数据和事件按照预先设定的逻辑进行处理。4)应用层应用层泛指基于区块链技术并结合具体业务场景开发的应用,包括加密数字货币钱包、交易所、去中心化应用等。四、分类随着区块链的快速发展、区块链的应用范围越来越广,不同的区块链应用之间也有了比较大的差异1)公有链公有链是对外公开、任何人都可以参与的区块链。公有链是真正意义上的完全无中心化的区块链。它通过加密技术保证交易不可篡改,在不可信的网络环境中建立共识,从而形成去中心化的信用机制。公有链使用于数字货币、电子商务、互联网金融、知识产权等应用场景。2)联盟链联盟链仅限于联盟成员使用,因其只针对成员开放全部或部分功能,所以联盟链上的读写权限、以及记账规则都按联盟链规则来控制。联盟链适用于机构间的交易、结算、清算等B2B场景。超级账本项目即属于联盟链。3)私有链私有链对单独的个人或实体开放,仅供在私有组织,比如公司内部使用,私有链上的读写权限,参与记账的权限都由私有组织来决定。私有链适用于企业、组织内部。4)特点比较5)侧链侧链的概念最早产生于比特币的应用过程中,侧链实质上是指遵守侧链协议的所有区块链。侧链协议是一种可以让比特币安全地从比特币主链转移到其他区块链,又可以从其他区块链安全地比特币主链的协议。侧链本质上是一种跨区块链解决方案。通过这种解决方案,可以实现数字资产从第一个区块链到第二个区块链的转移,又可以在稍后的时间点从第二个区块链安全返回到第一个区块链。6)闪电网络在比特币交易网络中,最为人诟病的问题便是交易性能:全网约每秒7笔左右的交易速度远低于传统金融交易系统。同时,等待6个区块的可信确认将导致约1个小时的最终确认时间。为了提升性能,比特币社区提出了闪电网络等创新的设计。闪电网络的主要思路十分简单—将大量交易放到比特币区块链之外进行,只把关键环节放到链上进行确认。闪电网络的工作原理是用比特币拥有权的承诺来替代拥有权。五、总结区块链的主要特点包括去中心化、去信任、集体维护、匿名性、可靠的数据库。去中心化: 区块链技术基于P2P去中心化网络,区块链网络上的节点都是平等的,没有中心服务器,故区块链是去中心化的。 去信任: 区块链中的数据都是公开透明的,交易数据通过加密技术进行验证和记录,无须第三方信任机构的参与,故有去信任的特点。 集体维护: 区块链由全网节点共同参与维护,某一节点上数据的更新需要其他节点进行计算和验证,不会受少数节点控制。 可靠的数据库: 区块链中的每一个节点上的数据都是全网数据,单个节点的退出或瘫痪不会影响整个系统。 好了,以上便是本篇的所有内容,如果觉得对你有帮助的小伙伴不妨点个关注做个伴,便是对小菜最大的支持。不要空谈,不要贪懒,和小菜一起做个吹着牛X做架构的程序猿吧~ 咱们下文再见!今天的你多努力一点,明天的你就能少说一句求人的话!我是小菜,一个和你一起变强的男人。 ????微信公众号已开启,菜农曰,没关注的同学们记得关注哦!
2023年03月06日
3 阅读
0 评论
0 点赞
2023-03-06
区块链到底能不能落地,去中心化有没有必要
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情各位JYM好,我是一名Android工程师,但我今天要讲的内容跟Android没有太大的关系。首先阐述一点,本文仅从技术角度阐述区块链这个新事物,不牵扯任何的与加密货币相关的东西。如果你炒比特币亏钱了,属于个人的高风险行为,与本文无关。区块链概述那么什么是区块链?顾名思义,区块链就是一个个区块构成的链条。而一个区块就是一个数据对象,里面可以存很多信息。那么将数据,按顺序堆积起来,就形成了区块链。有人说,这还不容易吗?我把所有数据都存在自己的电脑里面,不就行了吗?这样固然是没有毛病的,但是如果你把电脑关了,或者硬盘损坏了,那么数据是不是就没了。那这样的区块链也太脆弱了吧!去中心化系统和去中心化网络于是就有个叫中本聪的人,写了一个去中心化的区块链系统,叫作Bitcoin。这个系统就是一个简单的记账的功能,某某给某某转了多少数字。你可以拥有这个系统中的一个钱包的地址,你通过私钥可以生成钱包地址,但钱包地址不能反推私钥。有了私钥,你才能将这个地址的数字转出。那么什么是去中心化呢?讲这个之前,我们来理解下什么是中心化。我们传统的互联网就是中心化的结构,一个星状结构的网络,很多人访问同一台服务器或由一个机构或组织控制的服务器集群。这样的服务带来一个问题,那就是这个控制服务器或服务器集群的人的权限太大了,它可以随意读取用户的数据或对其进行篡改。这是一种不公平的服务与被服务的关系,让你用钱买了服务之后,你就完全处于了劣势,服务商可以随意修改服务规则。再来聊聊去中心化,去中心化就是到处都是中心,也就是没有中心,所有志愿者提供服务器,任意一个或多个志愿者退出,不影响服务的持续进行。因为有人退出就有人进入来更换新鲜血液。这些志愿者有一定几率从这个去中心化的网络中获取到一定的数字,这样别人也愿意来一起维护这个网络。去中心化网络是一个网状结构,技术层面基于P2P通信(Peer-to-Peer对等网络),P2P通信是个成熟的技术,应用点主要在于聊天软件的点对点的视频通话和视频会议。共识是区块链的基础这样一种很多人一起做某件事是有共识来维持的,简单来说,就是少数服从多数。如果你一个人捣蛋篡改数据,别人就不认你的数据。有人耍小聪明了,我有钱,我有很多的算力,可以篡改数据后然后还要让其他的正确的数据认可我的篡改过的数据。有过半的算力,任性,对吧。没有关系,这个共识的社区一旦发现有人有过半的算力,就会发生共识的分裂。你这个对大多数人来说不公平的数据,就只有你一个去玩了,别人不跟你玩了。在技术层面我们有专业的术语,叫作分支的硬分叉。回答问题一区块链到底能不能落地?准确来说,是能不能实现互联网服务的落地。如果只是简单的记账,Bitcoin这个系统已经实现了。如果是帮别人实现记账,Ethereum以太坊这个系统已经实现了。我们再来看看传统互联网都实现了哪些服务?聊天、点外卖、听歌、刷短视频、玩游戏等。这些都是非常耗网络带宽的服务,因为大多数都牵扯到流媒体服务,尽管不是直接就是做流媒体行业的。而如果很多人同时访问某一个互联网资源,保存该资源的所有节点的提供者,能不能扛住并发的请求,并保证高传输效率传输流媒体数据,这是一个严峻的挑战。如果不能高效传输数据,那么就会流失用户,除非这个行业不太需要马上给你你想要的数据,而只需要把正确的数据给到你。这种数据就是重要但不紧急的数据。有这种数据吗?有,鉴权的数据。平时不会用到,只有要确认所有权的时候才会拿出来验证。这个就是我们通常所说的知识产权、房产证、大学毕业证等证件的数据。个人观点,区块链要想成功,也就是通常所说的Web3的说法,需要依赖高吞吐量TPS,这个就牵扯到硬件的革命。而每一次硬件的革命,传统的说法也叫工业革命,都会大幅提升生产力水平,必然带来软件的革命。Web3绝对是区块链最大的应用了,如果传统互联网服务都不是由单一的企业或集团能单方面控制的,那么就标志着Web3成功了。从历史的角度看,这个事件发生平均需要几个世纪。所以从长远看,区块链的落地几乎是一个必然事件,但在我们有生之年能看到则是一个概率不那么大的事件。回答问题二我们再来看看去中心化到底有没有必要?我的回答是,去中心化太有必要了。去中心化的革命将会是人类信任的革命,The revolution of human's trust。你可以不相信任何除你自己之外的任何人,但你必须不得不被迫相信代码的执行。代码可以不用知道你的小秘密,因为它没有感情,你也可以毫不担心它会泄露你的秘密,当你需要的时候,它就可以帮你证明你的这个秘密属于你。再从哲学的角度来看,世界的本源就不应该由谁控制或创造出来的。虽然工具由我们人类的意识所创造,但我们可以放弃控制权,而把控制权交给计算机。总结区块链是一个前沿技术,我们主观想让它短期成功,但这个需要天时地利人和的客观条件达成。我们有生之年,可遇而不可求。
2023年03月06日
5 阅读
0 评论
0 点赞
2023-03-06
solidity合约安全之重入攻击
重入攻击是智能合约最常见的攻击之一,理解好重入攻击使得写出solidity合约代码更具有安全性。重入攻击曾导致以太坊分叉为ETH和ETC(经典)。接下来将逐步深入介绍重入攻击。一些著名的重入攻击事件:2016年,The DAO合约被重入攻击,黑客盗走了合约中的 3,600,000 枚 ETH,并导致以太坊分叉为 ETH 链和 ETC(以太经典)链。 2019年,合成资产平台 Synthetix 遭受重入攻击,被盗 3,700,000 枚 sETH。 2020年,借贷平台 Lendf.me 遭受重入攻击,被盗 $25,000,000。 2021年,借贷平台 CREAM FINANCE 遭受重入攻击,被盗 $18,800,000。 2022年,算法稳定币项目 Fei 遭受重入攻击,被盗 $80,000,000。 距离 The DAO 被重入攻击已经6年了,但每年还是会有几次因重入漏洞而损失千万美元的项目,因此理解这个漏洞非常重要。一、The DAO被攻击事件在2015年之前,还在早期的以太坊社区讨论DAO(Decentralized Automated Organization)。DAO是通过智能合约来实现人与人之间的协作,同时通过社区的协议来进行去中心化的决策。2016年,一个名叫“The DAO”的DAO建立了。它是一个去中心化的,由社区控制的投资基金。它通过销售自己的社区通证募集了价值1亿 5000 万的美元的 ether(大概有354万 ETH)。人们通过存储 ETH 来购买 The DAO 的社区通证,这些存储在 The DAO 中的 ETH 就变成了投资基金。The DAO 会代表持有社区通证的投资者来进行投资。在The DAO 开始不到三个月的时间里,就被一个“黑帽”黑客攻击了。在接下来的几周,这个黑客从The DAO中被偷走了价值1亿5000万美元的ETH。这种攻击方式被称为“重入攻击”。这次攻击对 DAO 进行了非常严重的破坏,使其失去了投资者的信任,同时也严重影响了以太坊的信誉。行业内的人都看到了资金在 The DAO 中被偷走,并就如何处理这次事件进行了激烈的讨论。一部分人认为,密码学保证了区块链的不可篡改,如果强行修改,即使是为了正确的原因,也属于篡改。另一方面,有人觉得人们在 The DAO 中资产正在缓慢地偷走,这会破坏公众的信心。为了阻止严重的后果,大家有责任去阻止资产被盗。在这些讨论进行的时候,一个“白帽”黑客组织进行反击,他们属于要干预的阵营,他们使用黑客的同样手段进行重入攻击。尝试比黑客更快地把The DAO的资金转走,他们想要拯救这笔资金,然后返还给投资者。大量的资金被返回给了投资者,这样很多投资者就能够通过这个“逃生舱”取回他们的投资。因为黑客将大量的资金盗走的行为还在继续,以太坊核心团队面临一个艰难的决策。一种阻止黑客的方式是分叉以太坊,这样就可以修改历史,让这个事件没有发生过。在这个例子中,通过分叉以太坊,黑客在攻击中获得的 ETH 只会存在于以前的旧的网络中。如果用户都接受了新的分叉而把旧的网络废除的话,黑客偷走的 ETH 将不再值钱。虽然这次分叉将会让黑客攻击发生的那些区块不再有效,但是这个极端的操作将会完全违背以太坊的原则:这种干预正是以太坊自身想要避免的一种中心化的,单方面的行为。那些投票给分叉的人也同意同时有两条以太坊区块链,这个意愿占到了总投票的 85%,然后分叉就发生了(尽管矿工抵制这个做法,因为以太坊合约没有任何问题,这是人的疏忽)。这也就是为什么现在有两个以太坊链 – 以太经典和我们今天在用的以太坊。它们都有原生 ETH 通证,当时这些通证在市场上的价格差别很大。二、什么是重入攻击?重入攻击通过一个叫做“fallback”的函数执行。Fallback函数是solidity中一个特殊的结构,在某些特殊的场景下会被触发。fallback()功能有下面这些特点:1.他们是不被命名的2.他们是被外部调用,不能被自己合约内的函数调用3.一个合约中只有0个或者1个fallback函数,不会更多。4.他们会在别的合约调用一个本合约不存在的函数时调用5.当ETH被发送给这个合约时,如果该交易没有calldata同时没有receive()函数时,fallback函数会被触发。并且fallback函数必须标记为payable以便可以接受ETH6.fallback函数可以包含自己的逻辑上面的第五个和第六个特性,导致fallback函数被重入攻击三、代码示例银行合约(被攻击合约)// SPDX-License-Identifier: MIT pragma solidity 0.8.4; contract Bank{ //地址=>余额 mapping(address => uint) balance; //充值 function deposit() public payable{ balance[msg.sender] += msg.value; } //提款msg.sender的全部ether function withdraw() public { require(balance[msg.sender] > 0); //这里具有重入攻击的风险 (bool success,) = msg.sender.call(""); require(success); balance[msg.sender] = 0; } //获取本合约的余额 function getBalance() public view returns(uint){ return address(this).balance; } } 复制代码攻击合约contract Attack{ Bank bank; constructor(address _bank) payable{ bank = Bank(_bank); } fallback() external { if(bank.getBalance() > 1 ether){ bank.withdraw(); } } function attack() public payable{ bank.deposit(); bank.withdraw(); } } 复制代码attack() 先给自己账户充值ETH,才可以提取金额,调用bank合约的withdraw方法获得ETHfallback() 先判断bank合约中是否还有ETH,如果有,则调用withdraw方法,这里会无限次调用withdraw函数,直到合约里面没有钱该案例重入攻击的逻辑1.先部署Bank合约,调用deposit函数并充值2.部署Attack合约3.在attack()函数中调用了Bank合约的withdraw(),此次转向Bank合约,在withdraw()方法中的msg.sender.call()这一行,call()函数会找Attack合约中的receive(),若没有则看是否有fallback(),在我们这个攻击合约中,有fallback(),则call()函数会调用fallback()。4.在本来的fallback()函数中是写的正确的逻辑,不会导致重入攻击,但我们这个攻击合约中的fallback()中的逻辑会导致一直withdraw,直到将全部的钱转走。四、如何修复方法一最简单的方式是将被攻击的合约Bank合约里面的withdraw()方法balance[msg.sender] = 0这一行放到 (bool success,) = msg.sender.call("")上面。更改后的函数如下: //提款msg.sender的全部ether function withdraw() public { require(balance[msg.sender] > 0); balance[msg.sender] = 0; (bool success,) = msg.sender.call(""); require(success); } 复制代码这样,当call函数触发攻击合约中的fallback函数时,尝试调用withdraw方法,是不可行的,因为此时的余额已经为0了,require()函数就为false,黑客只能取回自己的钱,不会有更多的钱了。方法二使用锁机制,添加一个函数修改器modifier,用于防止重入攻击的修饰器,包含一个默认变量_status,在第一次调用withdraw函数时,会先判断_status是否为01,如果是,将其置为1,表示此时正在调用函数,还未结束,当攻击合约攻击时,_status还是1,函数并未结束,攻击合约调用就会报错,重入攻击失败。uint256 private _status; // 重入锁 // 重入锁 modifier Lock() { // 在第一次调用 Lock时,_status 将是 0 require(_status == 0, "Lock: reentrant call"); // 在此之后对 Lock 的任何调用都将失败 _status = 1; _; // 调用结束,将 _status 恢复为0 _status = 0; } //提款msg.sender的全部ether function withdraw() public Lock{ require(balance[msg.sender] > 0); balance[msg.sender] = 0; (bool success,) = msg.sender.call(""); require(success); } 复制代码
2023年03月06日
7 阅读
0 评论
0 点赞
2023-03-06
Aptos SDK交互笔记(一)
背景之前我们已经了解TS的一些语法,接下来可以实战训练下,这系列的文章就会介绍如何通过Aptos官网提供的TypeScript SDK与Aptos进行交互,这篇文章主要讲的就是如何使用提供API在aptos区块链上转帐。官网示例官网提供了交互的例子,我们需要先clone下仓库git clone https://github.com/aptos-labs/aptos-core.git 复制代码然后进入例子的文件中cd ~/aptos-core/ecosystem/typescript/sdk/examples/typescript 复制代码然后安装必要的依赖,这里使用的是pnpm,如果没有安装pnpm则需要先安装一下,然后用一下命令来安装依赖pnpm install 复制代码然后通过以下命令来运行例子pnpm run transfer_coin 复制代码接着就会看到以下输出:=== Addresses === Alice: 0x98b90c8febd6a248374f11d409045e9e06a68e3ae8688b00c99cf6c2218cbc18 Bob: 0x5a22c7704392910541ee53960477722c3aec0667b2bcb3da954f8e06490b39d3 === Initial Balances === Alice: 100000000 Bob: 0 === Intermediate Balances === Alice: 99944800 Bob: 1000 === Final Balances === Alice: 99889600 Bob: 2000 复制代码这期间经过具体的步骤如下初始化REST和facuet客户端 创建两个账户Alice和Bob Alice账户从facuet领取代币 Alice转账1000代币个Bob并支付gas费 Alice再次转帐1000代币给Bob并支付gas费 实现过程之前我们已经大概了解了这个例子做的事情,那么这又是怎么实现的呢,接下来我们可以一步一步看代码:初始化客户端第一步我们就要初始化REST和facuet客户端。REST客户端是用来和REST API交互的 facuet客户端是用来与开发网Faucet服务交互的,可以创建账户和获取测试代币 const client = new AptosClient(NODE_URL); const faucetClient = new FaucetClient(NODE_URL, FAUCET_URL); 复制代码使用API client我们可以创建一个CoinClient,使用CoinClient可以进行常规的账户操作如转帐和检查余额。const coinClient = new CoinClient(client); 复制代码在common.ts中初始化来URL如下export const NODE_URL = process.env.APTOS_NODE_URL || "https://fullnode.devnet.aptoslabs.com"; export const FAUCET_URL = process.env.APTOS_FAUCET_URL || "https://faucet.devnet.aptoslabs.com"; 复制代码❝在默认情况下URL都是指向开发网的服务,但是我们也可以通过以下两个环境变量配置:❞- APTOS_NODE_URL - APTOS_FAUCET_URL 复制代码创建本地账户接下来需要创建两个本地账户,账户有链上状态和链下状态,链下状态由一个地址和一个公钥/私钥对组成,私钥是用来验证所有权的,下面代码创建了链下状态:const alice = new AptosAccount(); const bob = new AptosAccount(); 复制代码创建区块链账户在Aptos中,每一个账户都必须要有一个链上代表用于接收代币以及与其他dAPP交互,一个账户代表了存储资产的媒介,以下代码说明了如何使用Faucet创建账户,然后获取代币。await faucetClient.fundAccount(alice.address(), 100_000_000); await faucetClient.fundAccount(bob.address(), 0); 复制代码读取余额以下代码说明如何去获取账户余额,在这个背景下,SDK中的CoinClient函数checkBalance可以查询现在存储的值console.log(`Alice: $`); console.log(`Bob: $`); 复制代码async checkBalance( account: AptosAccount | MaybeHexString, extraArgs?: { // The coin type to use, defaults to 0x1::aptos_coin::AptosCoin coinType?: string; }, ): Promise<bigint> { const coinType = extraArgs?.coinType ?? APTOS_COIN; const typeTag = `0x1::coin::CoinStore<$>`; const address = getAddressFromAccountOrAddress(account); const accountResource = await this.aptosClient.getAccountResource(address, typeTag); return BigInt((accountResource.data as any).coin.value); } 复制代码转帐与上一步一样,这是另一个帮助步骤,它构建了一个将硬币从 Alice 转移到 Bob 的交易。对于正确生成的交易,API 将返回交易哈希,可在后续步骤中使用该哈希来检查交易状态。 Aptos 区块链确实对提交进行了一些验证检查;如果其中任何一个失败,用户将收到错误消息。这些验证使用交易签名和未使用的序列号,并将交易提交到适当的链。let txnHash = await coinClient.transfer(alice, bob, 1_000, ); 复制代码在幕后,传输函数生成交易负载并让客户端签名、发送并等待它:async transfer( from: AptosAccount, to: AptosAccount | MaybeHexString, amount: number | bigint, extraArgs?: OptionalTransactionArgs & { // The coin type to use, defaults to 0x1::aptos_coin::AptosCoin coinType?: string; // If set, create the `receiver` account if it doesn't exist on-chain. // This is done by calling `0x1::aptos_account::transfer` instead, which // will create the account on-chain first if it doesn't exist before // transferring the coins to it. createReceiverIfMissing?: boolean; }, ): Promise<string> { // If none is explicitly given, use 0x1::aptos_coin::AptosCoin as the coin type. const coinTypeToTransfer = extraArgs?.coinType ?? APTOS_COIN; // If we should create the receiver account if it doesn't exist on-chain, // use the `0x1::aptos_account::transfer` function. const func = extraArgs?.createReceiverIfMissing ? "0x1::aptos_account::transfer" : "0x1::coin::transfer"; // If we're using the `0x1::aptos_account::transfer` function, we don't // need type args. const typeArgs = extraArgs?.createReceiverIfMissing ? [] : [coinTypeToTransfer]; // Get the receiver address from the AptosAccount or MaybeHexString. const toAddress = getAddressFromAccountOrAddress(to); const payload = this.transactionBuilder.buildTransactionPayload(func, typeArgs, [toAddress, amount]); return this.aptosClient.generateSignSubmitTransaction(from, payload, extraArgs); } 复制代码generateSignSubmitTransaction的内容如下const rawTransaction = await this.generateRawTransaction(sender.address(), payload, extraArgs); const bcsTxn = AptosClient.generateBCSTransaction(sender, rawTransaction); const pendingTransaction = await this.submitSignedBCSTransaction(bcsTxn); return pendingTransaction.hash; 复制代码等待交易处理在 TypeScript 中,只需调用 coinClient.transfer 就足以等待交易完成。一旦处理(成功或不成功),该函数将返回 API 返回的事务,或者如果处理时间超过超时则抛出错误。如果您希望在事务未成功提交时抛出错误,则可以在调用 transfer 时将 checkSuccess 设置为 true:await client.waitForTransaction(txnHash); 复制代码最后这篇文章主要讲述了如何与Aptos区块链进行交互,更多内容可以关注公众号QStack。
2023年03月06日
7 阅读
0 评论
0 点赞
2023-03-06
区块链开发-RainbowKit简单使用
在区块链项目中,我们往往需要跟链进行交互,而在浏览器中最直接最大众的就是使用Metamask小狐狸钱包,只要链接到了小狐狸,那就可以跟链上进行交互。在区块链项目中,往往不会直接使用ethers.js或者web3.js来与小狐狸交互,因为这样会比较麻烦,为了解决更快的与链上连接和交互,衍生出了很多第三方库web3-react、web3-modal、rainbow-kit(基于wagmi进行封装)、wagmi,当然还有很多,这里只说了在项目中使用相对来说比较多的一些库。就拿YaSol我自己来说,刚开始是用web3-modal后面朋友推荐说用web3-react,然后就一直使用web3-react,毕竟web3-react是uniswap搞得,所以热度还是比较高,但是在去年年底左右,发现了一个黑马wagmi,发现这头黑马还是因为在年底的一些区块链项目中,好多项目都在使用rainbowKit作为链接小狐狸的工具下面就简单介绍一下rainbowKit的使用,后续也会继续讲解wagmi的一些使用方法简介借用官方的描述: rainbowKit是连接钱包的最佳方法,转为每个人设计,专为开发人员打造。其实这句话也确实是有道理,rainbowKit其实有点像web3-modal他都是提供好了一套连接钱包的UI给你,你直接用就行,而web3-react只是提供了一些功能,需要自己配置和开发UI,下面是rainbowKit的弹窗样式,感觉还是挺不错的。全部帮你搞定了,不需要你再设置UI界面,不需要你再去配置钱包,开箱即用,还自带移动端官网链接: www.rainbowkit.com/使用rainbowkit提供了官方demodemo使用的技术栈是Next.js+wagmi+rainbowKitnpm init @rainbow-me/rainbowkit@latest # or pnpm create @rainbow-me/rainbowkit@latest # or yarn create @rainbow-me/rainbowkit 复制代码当然我们也可以直接安装使用1.第一步:在项目中安装库yarn add @rainbow-me/rainbowkit wagmi ethers 复制代码2.在项目的/pages/_app.tsxor/app/layout.tsx中引入并配置next.js12版本配置方法// pages/_app.tsx import '../styles/globals.css'; import '@rainbow-me/rainbowkit/styles.css'; import type from 'next/app'; import from '@rainbow-me/rainbowkit'; import from 'wagmi'; import from 'wagmi/chains'; import from 'wagmi/providers/public'; import from 'next'; import from 'react'; //配置支持的链以及rpc const = configureChains( [ mainnet, polygon, goerli, polygonMumbai // 下面这行可以检测不同的环境 // 比如在测试环境中支持测试网 // ...(process.env.NEXT_PUBLIC_ENABLE_TESTNETS === 'true' ? [goerli] : []), ], [ publicProvider(), ] ); //配置名字,链接coinbase的时候或者有些地方链接会显示名字,则在这里配置 const = getDefaultWallets({ appName: 'YaSol RainbowKit demo', chains, }); const wagmiClient = createClient({ autoConnect: true, connectors, provider, webSocketProvider, }); function MyApp(:AppProps) { return ( <WagmiConfig client=> <RainbowKitProvider chains=> <Component /> </RainbowKitProvider> </WagmiConfig> ); } export default MyApp; 复制代码next13.js配置方法//app/layout.tsx /* eslint-disable @next/next/no-head-element */ import Link from 'next/link'; import './globals.css'; import '@rainbow-me/rainbowkit/styles.css'; import from '@rainbow-me/rainbowkit'; import from 'wagmi'; import from 'wagmi/chains'; import from 'wagmi/providers/public'; //配置支持的链以及rpc const = configureChains( [ mainnet, polygon, goerli, polygonMumbai // 下面这行可以检测不同的环境 // 比如在测试环境中支持测试网 // ...(process.env.NEXT_PUBLIC_ENABLE_TESTNETS === 'true' ? [goerli] : []), ], [ publicProvider(), ] ); //配置名字,链接coinbase的时候或者有些地方链接会显示名字,则在这里配置 const = getDefaultWallets({ appName: 'YaSol RainbowKit demo', chains, }); const wagmiClient = createClient({ autoConnect: true, connectors, provider, webSocketProvider, }); export default function RootLayout({ children, }: { children: React.ReactNode; }) { return ( <html> <body> <WagmiConfig client=> <RainbowKitProvider chains=> <main> </main> </RainbowKitProvider> </WagmiConfig> </body> </html> ); } 复制代码3.在项目中使用rainbowKit已经帮我们定制好了UI,我们只需要调用特定的方法或者特定的组件就可以//index.tsx import from '@rainbow-me/rainbowkit'; const Home = () => { return( <div> <ConnectButton /> </div> ) }; export default Home 复制代码将上面的<ConnectButton/>组件加载到页面中即可看见Connect Wallet按钮点击connect Wallet按钮后,会弹窗rainbowKit自带的连接钱包弹窗选择其中一个钱包进行连接,连接后就能看到我们选择的链,我们的余额,我们的ENS或者钱包地址3.1修改按钮文字如果需要更改按钮的字体,可以使用在组件中转入label属性<ConnectButton label="我是自定义按钮文字" /> 复制代码3.2 链接钱包后链的显示// 只显示全部 <ConnectButton chainStatus="full" /> // 只显示图标 <ConnectButton chainStatus="icon" /> //只显示名字 <ConnectButton chainStatus="name" /> //不显示 <ConnectButton chainStatus="none" /> 复制代码3.3 连接钱包后不显示余额<ConnectButton showBalance= /> 复制代码3.4 用户不显示头像或者不显示Ens或者全部显示//显示全部 <ConnectButton accountStatus= /> //显示头像 <ConnectButton accountStatus= /> //显示ENS或者地址 <ConnectButton accountStatus= /> 复制代码3.5自定义按钮以及主题自定义这块,YaSol就不过多的讲解了,下面是官方的一些demo,可以根据demo中的一些参数进行定义自己的样式import from '@rainbow-me/rainbowkit'; export const YourApp = () => { return ( <ConnectButton.Custom> {({ account, chain, openAccountModal, openChainModal, openConnectModal, authenticationStatus, mounted, }) => { // Note: If your app doesn't use authentication, you // can remove all 'authenticationStatus' checks const ready = mounted && authenticationStatus !== 'loading'; const connected = ready && account && chain && (!authenticationStatus || authenticationStatus === 'authenticated'); return ( <div {...(!ready && { 'aria-hidden': true, 'style': { opacity: 0, pointerEvents: 'none', userSelect: 'none', }, })} > {(() => { if (!connected) { return ( <button onClick= type="button"> Connect Wallet </button> ); } if (chain.unsupported) { return ( <button onClick= type="button"> Wrong network </button> ); } return ( <div style=}> <button onClick= style=} type="button" > {chain.hasIcon && ( <div style={{ background: chain.iconBackground, width: 12, height: 12, borderRadius: 999, overflow: 'hidden', marginRight: 4, }} > {chain.iconUrl && ( <img alt= src= style=} /> )} </div> )} </button> <button onClick= type="button"> {account.displayBalance ? ` ($)` : ''} </button> </div> ); })()} </div> ); }} </ConnectButton.Custom> ); }; 复制代码????????上面代码的样式就是原始样式,大家可以自行更改就自己的UI风格3.6更改主题现在越来越多的网站都会有有暗色和亮色双模式,或者设置为跟随系统,那RainbowKit在默认就自带了light和dark双色系主题的下面是我这边使用next-theme来控制RainbowKit的暗色和亮色主题,大家可以根据自己的项目自行改function MyApp(:AppProps) { return ( <WagmiConfig client=> <RainbowKitProvider theme={ isDark ? // lightMode: lightTheme(), darkTheme() : lightTheme() } chains=> <Component /> </RainbowKitProvider> </WagmiConfig> ); } 复制代码4.部分方法有时候并不想通过用户点击来触发连接钱包弹窗,或者说并不想通过他的按钮组件来触发弹窗,那我们要咋办呢,方法还是有的,只能说RainbowKit考虑还是比较周到的,还特意提供了钩子方法import { useConnectModal, useAccountModal, useChainModal, } from '@rainbow-me/rainbowkit'; export const YourApp = () => { const = useConnectModal(); const = useAccountModal(); const = useChainModal(); return ( <> //调用openConnectModal即可调起连接钱包弹窗 {openConnectModal && ( <button onClick= type="button"> Open Connect Modal </button> )} //调用openAccountModal即可调起用户弹窗可以复制和退出 {openAccountModal && ( <button onClick= type="button"> Open Account Modal </button> )} //调用openChainModal即可调起切换链的弹窗 {openChainModal && ( <button onClick= type="button"> Open Chain Modal </button> )} </> ); }; 复制代码????调用openChainModal方法即可调起切换链的弹窗???? 调用openAccountModa方法l即可调起用户弹窗可以复制和退出????调用openConnectModal方法即可调起连接钱包弹窗总结其实RainbowKit真的比web3-react方便很多,开箱即用,web3-react需要自己配置各种东西,且需要自己设计UI,只能说各有优劣,web3-react给你提供很多,你想要哪个就哪个,你想要UI长什么样就什么样,定制化程度高,而rainbowKit则全部帮你封装好了,你不需要经过复杂的配置即可使用,当然也提供自定义方法,就是有些地方定制化会比较麻烦一些而已,总的来说,RainbowKit确实是一款很优秀的库,目前用起来少了很多bug。后续会继续写一篇关于wagmi库的使用,欢迎大家持续关注和交流学习
2023年03月06日
5 阅读
0 评论
0 点赞
2023-03-06
Node.js 基于区块链的游戏应用的首选
使用 Node.js 的开发可以提升开发效率,可以同时处理多个连接。该技术得到数百万专业开发人员的支持,并提供出色的用户体验。它有一个巨大的模块库,减少重复造轮子,还增强了灵活性和可扩展性。Node.js 开发人员在移动应用程序开发和 Web 应用程序开发中使用的代码减少了 33% (很多可用的模板库),以提供与其他编码语言一样的结果。什么是NodeJSNode.js 是一个开源的、事件驱动的 JavaScript 运行时环境,起初的目的是为了在客户端浏览器之外运行 Web 应用程序或移动应用程序。开发者能够使用 Node.js 中的跨平台框架创建命令行程序和服务器端脚本。它用于创建可扩展的WEB和服务器端应用程序。它促进了事件驱动和异步编程,从而加快了应用程序的创建。Node.js 开发框架各种移动应用程序技术提供的众多框架中的每一个都支持移动应用程序开发生命周期中的一个独特用例。下面列出了三种类型的 Node.js 框架。1. MVC框架模型-视图-控制器 (MVC) 框架提供了一种将应用程序逻辑划分为视图、控制器和模型的有效设计模式。开发关注点的分离使得扩展和维护程序相对容易。Node.js 中一些著名的 MVC 框架示例包括 Express.js、Angular.js 和 React。2. 全栈 MVC 框架全栈 MVC 框架提供的模板引擎、框架和库以及其它开发工具对于创建实时应用程序非常有帮助,还有能力处理前端和后端开发。3. REST API 框架得益于 REST API 开发经验,Node.js 框架为更快地构建应用程序奠定了坚实的基础。因此,无需关心WEB应用的架构设计。借助现成的编程接口,这些框架显着缩短了开发时间。是什么让 Node.js 成为改变游戏规则的技术?它于 2009 年首次创建,将 Node.js 视为允许在服务器端执行 JavaScript 的运行时环境的一种方式。有很多企业在使用,包括沃尔玛、GoDaddy、Netflix、eBay、雅虎、PayPal、Linkedin 和 NASA,都使用 Node.js 来构建他们的应用程序。后来随着区块链技术的火热,也带动了一波 Node.js 的使用热潮。1. 能够开发高性能和不同的应用程序Node.js 完全没有冲突,允许开发人员从头开始构建程序。框架市场中 Node.js 的对手之一是 Ruby on Rails。Node.js 为开发人员提供了比 Ruby on Rails 更多的自由和空间来掌握特定软件服务,Ruby on Rails 为基于区块链的游戏应用程序开发目标强加了一组预定义的规则和规范。2. JavaScript是行业标准Node.js 可以避免很多不兼容问题并适用于各种主流操作系统,同时与其它语言相比,JavaScript 表现更好。如果将 Node.js 用作应用程序开发的后端框架,则可能会减少一些人为错误(借助依赖库)。3. 单一代码库的优势区块链应用程序开发公司提供基于区块链的自定义移动应用开发服务的方法肯定经历了一场革命,在移动应用开发领域,Node.js 让开发者能够为客户端和服务器端构建 JavaScript 单一代码库框架。这样客户端和服务端开发之间可以更加高效的沟通协作。4. Node.js 帮助大品牌取得成功大多数企业选择利用目前市场上几乎所有现代技术的潜力。据消息人士透露,沃尔玛、GoDaddy、Netflix、eBay、雅虎、PayPal、Linkedin 和 NASA 等大型互联网企业在 Node.js 还相对年轻时就使用了它,结果,这些公司见证了自己的移动流量的显着增长。5. 它在谷歌浏览器上运行卓越的性能和效率的标准是在 Node.js 隶属于谷歌后更加明显。基于 Node.js 的后端由 Google 的 V8 引擎提供支持。Node.js 可以像谷歌Chrome中的JavaScript一样进行前端和后端操作。通过将谷歌开发工具与Node.js调试功能相结合,开发人员可以在两端避免各种问题。
2023年03月06日
6 阅读
0 评论
0 点赞
2023-03-06
最近突然火爆朋友圈的Damus是个啥?
前言兔年过完刚上班没几天,今天看朋友圈的时候突然发现好多人在发以"npub1"开头的神秘字符串。搞的我差点怀疑是不是微信出bug了?于是稍微搜索一了下才知道这串神秘代码是个公钥,这个公钥是用来加好友的,在哪里加好友呢?在一个去中心化的社交网络客户端上加好友。这个客户端在iOS上叫Damus(音译:大妈们?)。在Android平台上叫Amethyst(我也不知道咋念)。如果你哪个客户端都不想装,人家还有网页端给你用snort.social(下面是我的公钥,供大家参考,没事的话也可以加一下,如果你也有公钥欢迎留在评论区)npub1prxq60wh5zm9s2mf8uw3fr6yy44uuf4l67kh5f7am4244svecjrsfm75vt看起来这玩意除了有个难念的名字和加好友要用一串根本没法记的字符串外,它就还是个社交软件嘛。是不是这样呢?我们接着来体验一下Damus。Damus咋玩?首先和普通的社交软件一样得注册,但Damus有个好处是你注册的时候不需要手机号也不需要邮箱,只需要填个用户名就行了。注册的同时会为你自动生成一个公钥和一个私钥。公钥--就是前面说的"npub1"开头的字符串--是用来加好友的,可以发给别人。私钥是用来登录的。一定要自己保管起来,千万别让外人看到。登录进去以后感觉就是个低配版的Twitter。支持#tag话题 毕竟是刚发布的客户端。好多东西还不完善。目前可以发文字。而且貌似没有140字的限制,但是不支持直接发图片,要发图片需要将图片上传到别的服务器生成链接以后才能使用。另外一个小细节,点赞图标不光有大拇指,它还有小拇指,就问你六不六?个人中心除了用户名,头像,个人网址等等常规设置外,还可以设置比特币闪电小费地址,也就是说这玩意想做成像微信那样既可以社交又可以支付?只不过支付应该只支持“数字货币”吧。从上面的使用体验可以看出Damus还比较基础,很多功能是赶不上现有的社交软件的,例如发帖不支持样式编辑、发帖后不可删除、点赞或转推后不可撤销、图片需要转成链接才能发布,此外,趋势、过滤器等高级需求也亟待添加。那它为啥突然爆火呢?Damus为啥火爆?首先是因为有Twitter创始人Jack Dorsey的背书。在Damus终于上线app store之后,Jack Dorsey发推称之为里程碑事件Jack Dorsey的推动让硅谷科技圈风投圈一下子躁动起来,不到24小时就已经蔓延到我的朋友圈了,可见世界之小,社交网络之强大。其次就是Damus自身的特点了。从其官网我们可以看到Damus宣称自己的6大优势。翻译一下就是:用户做主:建立在开放的互联网协议之上,没有任何平台可以禁止或审查,用户可以控制自己的数据和语音; 加密:端到端加密的消息传递; 无需注册:创建帐户不需要电话号码、电子邮件或姓名; 无需服务器:消息通过去中心化的中继分发,无需运行任何基础设施,也没有单点故障; 可编程:轻松集成机器人,帮助用户实现生活或业务自动化。Damus 也会在你的服务器出现故障时进行通知。 赚钱:支持用比特币和闪电网络打赏朋友的帖子和 stack sats。 Damus能火爆其实主要就是因为其第一个优势,“用户做主”。基于去中心化社交协议 Nostr,那,看到去中心化,那不就是区块链,Web3等等当下正火的概念吗?区块链,Web3一直缺少面向用户的杀手级应用。而Damus貌似被大佬们寄予厚望能成为这样的应用。所以才有里程碑一说吧。总结从Damus的突然火爆我们可以看出科技圈最新的风向如何了。我的感受就是之前总在说区块链,Web3等等概念似乎离我们前端圈子比较遥远。还有就是各种币圈新闻让人感觉看不懂,但大受震撼。但现在Damus的出现会不会终于让Web3概念杀到了前端圈的门口呢?我觉得作为前端人需要紧紧跟随观察起来。至于Damus命运如何,是蓬勃发展壮大?还是热闹一阵子之后一地鸡毛?还是过几天就404?谁也不知道。但是抢先体验一下总没有错。最后呢,再放一下我的Damus公钥npub1prxq60wh5zm9s2mf8uw3fr6yy44uuf4l67kh5f7am4244svecjrsfm75vt欢迎大家关注,也请大家把自己的公钥放在评论区方便互关。(全文完)
2023年03月06日
5 阅读
0 评论
0 点赞
1
...
10
11