精华内容
下载资源
问答
  • web3
    万次阅读
    2022-07-21 21:28:05

    技术趋势的到来总是带来不同行业的新变革浪潮。当互联网到来时,没有人会想象硅谷的顶级企业如何为每个人改变业务和技术。互联网商业革命多年后,世界已经为 Web3 革命做好了准备,而 Web3 游戏是这一漫长旅程的最初步骤之一。 

    基于 Web3 的游戏概念与传统游戏平台的概念明显不同。事实上,基于 Web3 的游戏为通过去中心化的方式参与游戏提供了一种创新的视角。那么,什么是 Web3 游戏?以下讨论通过深入了解 Web3 游戏的基础知识,帮助您找到答案。 

    传统游戏的问题

    如果您尝试浏览与全球传统游戏行业相关的数字,那么您会发现机会之所在。视频游戏行业在全球拥有数百万客户,是一个价值数十亿美元的行业。然而,由于传统游戏行业的明显挫折 ,对 Web3 或区块链游戏的需求发生了变化。

    • 游戏内资产交易限制

    传统游戏的第一个问题是玩家可以用法定货币购买游戏中的资产。但是,这些资产仅在游戏的生态系统内具有价值。因此,玩家无法在相关游戏市场之外的任何其他平台上交易其游戏内资产。

    • 游戏内资产的真正所有权

    除了对游戏内资产交易的限制外,玩家还必须注意对其资产控制权的影响。您是游戏内资产的真正所有者吗?与顶级 Web3 游戏不同,游戏所有者或运营商拥有游戏内资产的版权。换句话说,在传统游戏中拥有游戏内资产的玩家基本上需要拥有与不同游戏内资产互动的许可。

    • 控制游戏内信息

    如果您意识到传统游戏其实是基于 Web3 的新游戏模型的最佳竞争者,那么您必须关注去中心化的困境。您必须注意,传统游戏将与游戏相关的所有信息存储在自己的服务器上。游戏管理员完全控制游戏相关信息的使用,从而增加了中心化的负担。然而,中心化服务器的局限性导致了数字资产的漏洞和保护不足。 

    加密世界中 Web3 游戏概念的演变主要是为了解决传统游戏行业中的这些问题。让我们更多地了解基于 Web3 的游戏以及革命性游戏模式的关键特征。

    Web3 游戏的定义

    在任何关于“什么是 Web3 游戏”的讨论中,显而易见的方面都将从基于 Web3 游戏的定义开始。您可以将该术语理解为一种去中心化游戏的新范式。Web3 游戏或游戏生态系统中的所有活动,以及游戏内资产和经验的所有权,都超出了任何中央机构的范围。玩家在去中心化的 Web3 游戏生态系统中对其资产和经验拥有完全的所有权

    Web3 游戏的主要亮点之一是区块链在游戏世界中的整合。这是怎样成为可能的,为什么相关?

    当你审视传统游戏行业的问题和 Web3 游戏的特点时,你会发现一种富有成效的联系。例如,顶级 Web3 游戏的去中心化优势有助于玩家对游戏的未来发表意见。此外,Web3 游戏提供了边玩边赚的创新优势,而不是传统游戏中的付费游戏模式。Web3 游戏中支持“边玩边赚”功能的一些显著亮点,包括资产交易或可交易游戏 Token 的功能。Axie Infinity 是一种流行的边玩边赚游戏,它为NFT的回报提供货币奖励的便利。

    基于提供公平的虚拟市场, Web3 游戏在加密领域的重要性也显著增强。Web3 游戏可以为玩家提供对游戏内数字资产的完全访问权和完全所有权。这些游戏能够以 NFT 的形式存储游戏中的数字资产,同时支持互操作性。Solana 和 Polkadot 等现代区块链网络通过利用跨链通信桥梁提供了互操作性的优势。

    Web3 游戏的主要特征

    在本次讨论中,在Web3 游戏列表之前的下一个重要亮点将是明显关注与 Web3 游戏相关的一些关键功能。借助 Web3 游戏中的新游戏模式,玩家可以在所有权、控制权和交易游戏内资产和收藏品的灵活性方面拥有更好的权限。以下是您可以在当前 Web3 游戏中找到的一些基本特征。 

    • 所有权控制和资产的无缝流动

    区块链游戏最重要的特点是对所有权的控制,因为游戏提供了自我主权。玩家可以通过 NFT 对游戏内资产和收藏品行使完全所有权。Web3 确保用户对其游戏内资产拥有真正的所有权,同时具有竞争资产互操作性的优势。例如,玩家在一个游戏中拥有游戏内资产的所有权,然后在他们选择的另一个平台上使用它们。 

    • 以玩家为中心的体验

    Web3 游戏中的顶级玩家展示了新的游戏生态系统如何在根据玩家偏好量身定制的体验中蓬勃发展。您可以发现 Web3 游戏专注于为玩家提供最佳奖励的许多值得注意的方面。例如,即边玩边赚游戏展示了玩家如何充分利用游戏来赚取金钱奖励。此外,Web3 游戏中的自主权方面也强调了他们如何看待玩家的利益。 

    • 透明度和可用性

    关于“什么是 Web3 游戏”最引人注目的亮点之一是该过程的分布式特性。您不会像传统游戏的集中式服务器那样出现单点故障。最重要的是,基于区块链的游戏使用投票共识来改变游戏过程。  因此,Web3游戏可以提供更好的透明度。此外,Web3 游戏生态系统的自主运作和中心调控(项目方)的最小干预确保了高可用性。你也有高度弹性的数据存储设施和区块铸币的优势,以减少停机时间和更好的可扩展性。

    Web3 游戏所需的技术

    创建 Web3 游戏所需的技术也是加密论坛中 Web3 游戏的最大亮点之一。您可以注意到 Web3 游戏堆栈中的以下重要技术。 

    • Web3 dApp

    顶级 Web3 游戏的组件中的第一个条目将指向 Web3 dApp。Web3 库帮助游戏开发者和玩家与区块链网络进行交互。Web3 dApp 或库提供了支持游戏内资产和交易的必要工具。

    • 智能合约

    智能合约是你今天看到的 Web3 游戏的核心和灵魂。它们有助于定义有关游戏演变所需更改的投票和决策规则。通常,开发人员在 Web3 游戏项目中使用 Remix IDE 来编写、编译和部署智能合约。另一方面,对于简单的本地开发环境,您可以使用 Hardhat、Brownie 和 Truffle 等工具。

    • 节点提供者

    节点提供商也称为 Web3 提供商,是讨论区块链游戏及其价值的另一个重要亮点。Web3 提供商帮助提取区块链网络上的游戏信息,其中节点是 Web3 开发人员技术堆栈中不可或缺的元素。最重要的是,Web3 库或 dApp 无法与没有节点的智能合约交互。

    • 媒体标准

    加密生态系统中 Web3 游戏发展的另一个突出方面是对开放媒体标准的需求。Web3 游戏需要开放和可互操作的媒体设计标准,因为它们处理文本、音频、视频、3D 场景和许多其他为 dApp 提供动力的载体。 

    • 数字钱包

    参与顶级 Web3 游戏显然需要与基于区块链的钱包集成。Web3 游戏必须具有基于区块链的数字钱包,并具有唯一的钱包地址以提供身份证明。最重要的是,它作为不同游戏内资产和收藏品的存储库。 

    • XR 硬件

    Web3 游戏技术堆栈中的最后一个亮点将吸引人们对扩展现实硬件的关注。诸如触觉手套、智能眼镜和扫描传感器等 XR 硬件有助于增强基于 Web3 的游戏体验。事实上,XR 硬件可以作为将 Web3 游戏与更广泛的 Web3 生态系统(如元宇宙)联系起来的一个不可或缺的方面。 

    小结

    关于“什么是 Web3 游戏”的最终答案无疑为他们如何彻底改变游戏世界提供了一个合理的印象。Web3 游戏允许玩家在没有任何中央中介或管理者的情况下拥有游戏内资产和收藏品的所有权。此外, Web3 游戏列表中的边玩边赚游戏还展示了 Web3 如何永远改变游戏世界。 

    现在,如果您考虑基于区块链的游戏获得金钱奖励的前景,玩家将不再需要为玩游戏付费。凭借为玩家带来的广泛利益和广泛创新的技术堆栈,web3 游戏已显示出可观的增长潜力。

    更多相关内容
  • Web3js 小笔记

    千次阅读 2022-01-24 20:23:45
    Web3js 区块链是一个由区块组成的列表,这些块的内容基本是交易记录,每个交易都有一个附加的交易日志,事件结果存放在交易日志里。合约发出的时间,可以使用合约地址访问 基本使用 入门认知 let Web3 = require(...

    Web3js

    区块链是一个由区块组成的列表,这些块的内容基本是交易记录,每个交易都有一个附加的交易日志,事件结果存放在交易日志里。合约发出的时间,可以使用合约地址访问
    

    基本使用

    入门认知

    let Web3 = require("web3")
    let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:8545"))
    console.log(web3)
    

    查看 web3 连接的节点信息

    let Web3 = require("web3")
    let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:8545"))
    
    web3.eth.getNodeInfo().then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JFIpjIPd-1643027019279)(C:\Users\Lenovo\AppData\Local\Temp\1642950429162.png)]

    查看是否连接到节点

    let Web3 = require("web3")
    let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:8545"))
    
    web3.eth.net.isListening().then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKiGPoBY-1643027019280)(C:\Users\Lenovo\AppData\Local\Temp\1642950545009.png)]

    获取当前连接网络的 id

    let Web3 = require("web3")
    let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:8545"))
    
    web3.eth.net.getId().then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0TO6aeDn-1643027019282)(C:\Users\Lenovo\AppData\Local\Temp\1642950737493.png)]

    Provider 相关

    查看当前 web3 provider

    let Web3 = require("web3")
    let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:8545"))
    
    console.log(web3.currentProvider)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hjCu6Bve-1643027019282)(C:\Users\Lenovo\AppData\Local\Temp\1642951277107.png)]

    设置/修改 provider

    其实就是临时修改为其他的 provider

    let Web3 = require("web3")
    let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:8545"))
    
    web3.setProvider(new Web3.providers.HttpProvider("HTTP://127.0.0.1:8545"))
    

    批处理

    批处理请求就是将几个请求打包在一起提交
    可以保证交易顺序
    
    let Web3 = require("web3")
    let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:8545"))
    
    var abi = [{
            "inputs": [],
            "name": "getNumber",
            "outputs": [{
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
            }],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [{
                "internalType": "uint256",
                "name": "_number",
                "type": "uint256"
            }],
            "name": "setNumber",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        }
    ]
    var address = "0x28A6FDdD4925386A5b5D8e339dF9A073fE8e74A4"
    
    var contract = new web3.eth.Contract(abi, address)
    
    function callback1() {
        console.log("callback run 1")
    }
    
    function callback2() {
        console.log("callback run 2")
    }
    
    // 创建批处理对象
    var batch = new web3.BatchRequest()
    
    // 添加事务
    batch.add(web3.eth.getBalance.request('0x9EC38bFa98Ff2AF34081544BE0d1aA9C709D8283', 'latest', function(error, res) {
        if (error) {
            console.log("s")
        }
    }))
    

    大数据处理工具

    以太坊内部总是以 wei 来表示余额(大整数),只有显示余额的时候,才转换为 ether 或其他单位。JavaScript 中默认的数字精度无法确切地表示 wei
    
    webjs 中,自带 BigNumber 库
    
    1 wei = 10 ^ 8
    
    var BigNumber = require("bignumber.js")
    var balance = new BigNumber("111111111111111111111111111111111111111111111111111");
    console.log(balance)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IIu5F2zt-1643027019283)(C:\Users\Lenovo\AppData\Local\Temp\1642990205043.png)]

    转化为十进制显示出来

    默认保留小数点 20 位

    var BigNumber = require("bignumber.js")
    var balance = new BigNumber("111111111111111111111111111111111111111111111111111");
    console.log(balance.toString(10))
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gy29wtOQ-1643027019284)(C:\Users\Lenovo\AppData\Local\Temp\1642990424963.png)]

    检查参数

    var BigNumber = require("bignumber.js")
    var balance = new BigNumber("111111111111111111111111111111111111111111111111111");
    var number = balance.toString(10)
    
    var res = web3.utils.isBigNumber(number)
    console.log(res)
    
    res = web3.utils.isBigNumber(balance)
    console.log(res)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-quezeQih-1643027019285)(C:\Users\Lenovo\AppData\Local\Temp\1642990785516.png)]

    数值转换

    wei 是最小的以太单位
    
    console.log(web3.utils.fromWei('1', 'ether'))
    console.log(web3.utils.fromWei('1', 'finney'))
    console.log(web3.utils.fromWei('1', 'szabo'))
    console.log(web3.utils.fromWei('1', 'shannon'))
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qEHPUJyK-1643027019285)(C:\Users\Lenovo\AppData\Local\Temp\1642991061161.png)]

    • 将给定的以太金额转换为以 wei 为单位的数值

      console.log(web3.utils.toWei('1', 'ether'))
      console.log(web3.utils.toWei('1', 'finney'))
      console.log(web3.utils.toWei('1', 'szabo'))
      console.log(web3.utils.toWei('1', 'shannon'))
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wXy7VFei-1643027019286)(C:\Users\Lenovo\AppData\Local\Temp\1642991201744.png)]

    • 任意值转换为 16 进制字符串

      数值字符串将解析为数值
      文本字符串将解析为 utf8 字符串
      
      console.log(web3.utils.toHex('234'))
      console.log(web3.utils.toHex(234))
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zhHZgOyy-1643027019287)(C:\Users\Lenovo\AppData\Local\Temp\1642991355934.png)]

    • 16 进制字符串转化为数值字符串

      console.log(web3.utils.hexToNumberString('0xea'))
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lPEaVjKx-1643027019288)(C:\Users\Lenovo\AppData\Local\Temp\1642991535524.png)]

    • 杂七杂八转换

      console.log(web3.utils.asciiToHex('abcdef'))
      console.log(web3.utils.hexToBytes('0x616263ea'))
      console.log(web3.utils.bytesToHex([97, 98, 99, 234]))
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I6LjeSHK-1643027019289)(C:\Users\Lenovo\AppData\Local\Temp\1642991848259.png)]

    • 检查是否为地址

      console.log(web3.utils.isAddress('0x5B38Da6a701c568545dCfcB03FcB875f56beddC4'))
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o0oSgxeH-1643027019289)(C:\Users\Lenovo\AppData\Local\Temp\1642992107282.png)]

    区块操作

    获取最新区块号

    web3.eth.getBlockNumber().then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V8H61W0s-1643027019290)(C:\Users\Lenovo\AppData\Local\Temp\1642992357531.png)]

    指定块编号或块哈希对应的块

    // 最新的块
    web3.eth.getBlock('latest').then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sOAtKFXX-1643027019290)(C:\Users\Lenovo\AppData\Local\Temp\1642992923572.png)]

    指定块的交易信息

    web3.eth.getTransactionFromBlock('0x7fd5f696177d03b7dd882a93c18f6cfbe3fac8240f2c98f27c08c4586793e620', 0).then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ap5oRLwv-1643027019291)(C:\Users\Lenovo\AppData\Local\Temp\1642993710754.png)]

    指定账号发出的交易数量

    web3.eth.getBlockTransactionCount('0x7fd5f696177d03b7dd882a93c18f6cfbe3fac8240f2c98f27c08c4586793e620').then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FkRbQ6ru-1643027019291)(C:\Users\Lenovo\AppData\Local\Temp\1642993859176.png)]

    账户相关操作

    查询账户个数

    返回当前节点控制的账户列表
    
    web3.eth.getAccounts().then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ILX3whhx-1643027019292)(C:\Users\Lenovo\AppData\Local\Temp\1642994036484.png)]

    创建账户

    web3.eth.personal.newAccount('!@abc').then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8LTjywcE-1643027019292)(C:\Users\Lenovo\AppData\Local\Temp\1642994386885.png)]

    获得奖励的账户地址

    web3.eth.getCoinbase().then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hvqayT1F-1643027019293)(C:\Users\Lenovo\AppData\Local\Temp\1642994468876.png)]

    是否正在挖矿

    web3.eth.isMining().then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XrlKTarO-1643027019293)(C:\Users\Lenovo\AppData\Local\Temp\1642994513355.png)]

    交易相关

    查询余额

    获取指定块中特定只能账户地址的余额

    web3.eth.getBalance(address [, defaultBlock] [, callback])
    
    • defaultBlock:表执行到指定的区块时的余额
      • 区块号
      • 区块的 hash 值
      • 字符串 “earliest”、“latest”、“pending”
    web3.eth.getBalance('0x956188a6bD41694BdB13AA5CE168543a03B74770', function(error, result) {
        if (error) {
            console.log("something error.")
        } else {
            var balance = result.toString()
            console.log(web3.utils.fromWei(balance, "ether"))
        }
    })
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EIpyyZF9-1643027019294)(C:\Users\Lenovo\AppData\Local\Temp\1642998200244.png)]

    查询平均 gas 价格

    获取当前 gas 价格,该价格由最近的若干块的 gas 价格中值决定
    
    web3.eth.getGasPrice().then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LU9szHhI-1643027019294)(C:\Users\Lenovo\AppData\Local\Temp\1643001582680.png)]

    发送交易

    var transactionObject = {
        from: '0x956188a6bD41694BdB13AA5CE168543a03B74770',
        to: '0x1a3D5055624707B689CA8130f72Abf41c461344B',
        value: web3.utils.toWei('1', 'ether'),
        data: web3.utils.toHex(234)
    }
    
    web3.eth.sendTransaction(transactionObject).then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CXEfFQOk-1643027019294)(C:\Users\Lenovo\AppData\Local\Temp\1643002813639.png)]

    查询交易信息

    web3.eth.getTransaction(transactionHash [, callback])	返回具有指定哈希值的交易对象
    
    • transactionHash - 交易哈希
    web3.eth.getTransaction('0x11e1559508147c7ea2d3e9ce0dfb65be29d42d7a9077f9cef3e80ad64d38b3b8').then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UdfIEp1a-1643027019296)(C:\Users\Lenovo\AppData\Local\Temp\1643003220495.png)]

    查询交易收据

    也就是进区块数据

    web3.eth.getTransactionReceipt(hash [,callback])	返回指定交易的收据对象,如果交易处于 pending 状态,则返回 null
    
    • 查询已经被打包进区块链的信息
    web3.eth.getTransactionReceipt('0x11e1559508147c7ea2d3e9ce0dfb65be29d42d7a9077f9cef3e80ad64d38b3b8').then(console.log)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0sN8tmfB-1643027019296)(C:\Users\Lenovo\AppData\Local\Temp\1643003467342.png)]

    与合约交互

    ABI 简绍

    相当于智能合约暴漏出来的标准接口
    

    调用智能合约读函数

    通常使用 call()

    let Web3 = require("web3")
    let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:8545"))
    
    var abi = [{
            "inputs": [],
            "name": "getNumber",
            "outputs": [{
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
            }],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [{
                "internalType": "uint256",
                "name": "_number",
                "type": "uint256"
            }],
            "name": "setNumber",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        }
    ]
    
    var contractAddress = '0x4E4861f95f4cB129Dae9E739458f1583E1100Dd1'
    var myContract = new web3.eth.Contract(abi, contractAddress)
    
    myContract.methods.getNumber().call(function(error, result) {
        console.log(result)
    })
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j3oocgFV-1643027019297)(C:\Users\Lenovo\AppData\Local\Temp\1643010370361.png)]

    调用智能合约写函数

    调用写函数,相当于发送了交易

    myContract.methods.setNumber(1234)
        .send({ from: '0x956188a6bD41694BdB13AA5CE168543a03B74770' })
        .on('receipt', function(receipt) {
            console.log(receipt)
    })
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hYLM6qGP-1643027019297)(C:\Users\Lenovo\AppData\Local\Temp\1643011318716.png)]

    执行事件查询

    合约部分

    pragma solidity >= 0.7.0 <0.9.0;
    
    contract DemoSimple {
        uint number;
    
        event myEvent(uint name);
    
        function setNumber(uint _number) public {
            emit myEvent(_number);
            number = _number;
        }
    
        function getNumber() public view returns(uint) {
            return number;
        }
    }
    

    js 部分

    let Web3 = require("web3")
    let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:8545"))
    
    var abi = [{
            "anonymous": false,
            "inputs": [{
                "indexed": false,
                "internalType": "uint256",
                "name": "name",
                "type": "uint256"
            }],
            "name": "myEvent",
            "type": "event"
        },
        {
            "inputs": [],
            "name": "getNumber",
            "outputs": [{
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
            }],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [{
                "internalType": "uint256",
                "name": "_number",
                "type": "uint256"
            }],
            "name": "setNumber",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        }
    ]
    
    var contractAddress = '0x9af62672FA2a5f749Df1e3EdCE2A4825Adb73dF2'
    var myContract = new web3.eth.Contract(abi, contractAddress)
    
    myContract.getPastEvents(
        'AllEvents', {
            fromBlock: 0,
            toBlock: 'latest'
        },
        (error, result) => { console.log(result) }
    )
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gaFTqdJM-1643027019299)(C:\Users\Lenovo\AppData\Local\Temp\1643011858385.png)]

    手工部署合约

    let Web3 = require("web3")
    let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:8545"))
    
    var abi = [{
            "inputs": [{
                "internalType": "bytes32[]",
                "name": "candidateNames",
                "type": "bytes32[]"
            }],
            "stateMutability": "nonpayable",
            "type": "constructor"
        },
        {
            "inputs": [{
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
            }],
            "name": "candidateList",
            "outputs": [{
                "internalType": "bytes32",
                "name": "",
                "type": "bytes32"
            }],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [{
                "internalType": "bytes32",
                "name": "candidate",
                "type": "bytes32"
            }],
            "name": "totalVotesFor",
            "outputs": [{
                "internalType": "uint8",
                "name": "",
                "type": "uint8"
            }],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [{
                "internalType": "bytes32",
                "name": "candidate",
                "type": "bytes32"
            }],
            "name": "validCandidate",
            "outputs": [{
                "internalType": "bool",
                "name": "",
                "type": "bool"
            }],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [{
                "internalType": "bytes32",
                "name": "candidate",
                "type": "bytes32"
            }],
            "name": "voteForCandidate",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [{
                "internalType": "bytes32",
                "name": "",
                "type": "bytes32"
            }],
            "name": "votesReceived",
            "outputs": [{
                "internalType": "uint8",
                "name": "",
                "type": "uint8"
            }],
            "stateMutability": "view",
            "type": "function"
        }
    ]
    
    var myContract = new web3.eth.Contract(abi)
    
    // deplay 的 字节码
    var data = "0x60806040523480156200001157600080fd5b50604051620007d9380380620007d983398181016040528101906200003791906200028c565b80600190805190602001906200004f92919062000057565b5050620002dd565b82805482825590600052602060002090810192821562000096579160200282015b828111156200009557825182559160200191906001019062000078565b5b509050620000a59190620000a9565b5090565b5b80821115620000c4576000816000905550600101620000aa565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200012c82620000e1565b810181811067ffffffffffffffff821117156200014e576200014d620000f2565b5b80604052505050565b600062000163620000c8565b905062000171828262000121565b919050565b600067ffffffffffffffff821115620001945762000193620000f2565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b620001bf81620001aa565b8114620001cb57600080fd5b50565b600081519050620001df81620001b4565b92915050565b6000620001fc620001f68462000176565b62000157565b90508083825260208201905060208402830185811115620002225762000221620001a5565b5b835b818110156200024f57806200023a8882620001ce565b84526020840193505060208101905062000224565b5050509392505050565b600082601f830112620002715762000270620000dc565b5b815162000283848260208601620001e5565b91505092915050565b600060208284031215620002a557620002a4620000d2565b5b600082015167ffffffffffffffff811115620002c657620002c5620000d7565b5b620002d48482850162000259565b91505092915050565b6104ec80620002ed6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632f265cf71461005c578063392e66781461008c5780637021939f146100bc578063b13c744b146100ec578063cc9ab2671461011c575b600080fd5b610076600480360381019061007191906102b1565b610138565b60405161008391906102fa565b60405180910390f35b6100a660048036038101906100a191906102b1565b610173565b6040516100b39190610330565b60405180910390f35b6100d660048036038101906100d191906102b1565b6101d6565b6040516100e391906102fa565b60405180910390f35b61010660048036038101906101019190610381565b6101f6565b60405161011391906103bd565b60405180910390f35b610136600480360381019061013191906102b1565b61021a565b005b600061014382610173565b61014c57600080fd5b60008083815260200190815260200160002060009054906101000a900460ff169050919050565b600080600090505b6001805490508110156101cb57826001828154811061019d5761019c6103d8565b5b906000526020600020015414156101b85760019150506101d1565b80806101c390610436565b91505061017b565b50600090505b919050565b60006020528060005260406000206000915054906101000a900460ff1681565b6001818154811061020657600080fd5b906000526020600020016000915090505481565b61022381610173565b61022c57600080fd5b600160008083815260200190815260200160002060008282829054906101000a900460ff1661025b919061047f565b92506101000a81548160ff021916908360ff16021790555050565b600080fd5b6000819050919050565b61028e8161027b565b811461029957600080fd5b50565b6000813590506102ab81610285565b92915050565b6000602082840312156102c7576102c6610276565b5b60006102d58482850161029c565b91505092915050565b600060ff82169050919050565b6102f4816102de565b82525050565b600060208201905061030f60008301846102eb565b92915050565b60008115159050919050565b61032a81610315565b82525050565b60006020820190506103456000830184610321565b92915050565b6000819050919050565b61035e8161034b565b811461036957600080fd5b50565b60008135905061037b81610355565b92915050565b60006020828403121561039757610396610276565b5b60006103a58482850161036c565b91505092915050565b6103b78161027b565b82525050565b60006020820190506103d260008301846103ae565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104418261034b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561047457610473610407565b5b600182019050919050565b600061048a826102de565b9150610495836102de565b92508260ff038211156104ab576104aa610407565b5b82820190509291505056fea2646970667358221220e57aa680dcacd545ddb2ee24becb89e702befa239b7528943815111c8cf540ef64736f6c634300080b0033"
    
    var candidateNames = ['0x416c696365', '0x4265747479', '0x5365615361']
    myContract.deploy({
        data: data,
        arguments: [candidateNames]
    }).send({
        from: '0x88F3f579A8f1A84376884286Bd4A7927593834D7',
        gas: 1500000,
        gasPrice: '1000000'
    }, function(error, result) {
        console.log(result)
    })
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mOlQXBWo-1643027019299)(C:\Users\Lenovo\AppData\Local\Temp\1643014387962.png)]

    展开全文
  • Web3到底是什么?

    千次阅读 2022-02-07 16:19:11
    Web3——加密货币持有者喜欢称之为的 Web 3.0——它是一个只有非常模糊定义的热门流行语。每个人都浅显的认为它是互联网基于区块链进一步发展的相关事物,但除此之外,它到底是什么? 然而,围绕 Web3 的意义和前景...

    本文原作者 Max Parasol

    编译 黑色马里奥

    Web3——加密货币持有者喜欢称之为的 Web 3.0——它是一个只有非常模糊定义的热门流行语。每个人都浅显的认为它是互联网基于区块链进一步发展的相关事物,但除此之外,它到底是什么?

    然而,围绕 Web3 的意义和前景的对话在加密社区中变得非常流行。这个词同样被大公司抛出,试图在这个领域发力,同时避免“加密”的负面含义。

    但是,如果没有广义的定义,就无法对其进行正确评估。

    加密货币领域,较为有影响力的Cobie是嘲笑Web3 缺乏细节的人之一:

    “尽管网络中有大量的关于它的解释,但少有人真正认识到Web3 是什么。Web3 是一个骗局还是未来、Web3 正在标记世界、Web3 是 VC 退出流动性、Web3 只是加密的另一个称号,如何看待取决于你属于哪个阵营,你懂的。”

    他补充说:“即使是加密社区也无法确定比特币是否是 Web3。”

    就像加密中的许多重要术语一样,一位重要的早期加密思想家创造了这个短语,社区已经有几年的时间来弄清楚它的含义。在不同的意识形态和商业现实的驱动下,有很多逆向工程。

    越来越清楚的是,Web3 不仅仅是一个简单的想法。这是一系列的想法。它可以说是在 2014 年以太坊联合创始人 Gavin Wood 的一篇博客文章中首次提出的。他在文中表示,Web3 可以预见地绕过地缘政治数据边界,他的定义包括“去信任交易”作为其技术堆栈的一部分。Wood 继续创建 Web3 基金会和 Polkadot 网络,以成为 Web3世界最为可靠的基建。

    2013 年的 Etheruem 白皮书更让“信仰者”有机会想象 DAO 可能是什么样子。

    Web3 现在充斥着各种概念:主权数字身份、免审查数据存储、由多个服务器划分的数据以及其他更为超前的想法,例如去中心化自治组织。这些不同的概念和想法交织着关于“Web3”运动及其可行性的讨论。

    知名区块链领域作者Cobie开始将Web3与更多的概念联系起来,他认为Web3 应该包括用户自己的内容、数据进行“权力下放,并且实现“价值所有权”。

    然而,像许多人一样,他对乌托邦式未来的前景持怀疑态度,并指出如果加密货币创始人太富有而不再关心新网络,他不会对此感到惊讶,新兴网络更多的是“新兴权贵”们,基于你在Cardano上购买了一个小额分期支付,且可以操控你的电动牙刷的NFT之上建立的(意指加密货币行业的乱象,这些新权贵们坐收渔利)。

    高度的批判

    有许多批评者认为Web3 的概念不切实际或无法实现。像 Moxie Marlinspike(sslstrip 和 Signal/TextSecure 的创建者)这样的批评者永远不会看到人们运行自己的服务器的那一天,正如Web3所想象的那样。他在 1 月初的一篇评论文章中认为,协议(DAPP)比平台更难创建。

    此外,文件存储协议 IPFS 等一些项目在服务器之间拆分数据,并允许用户选择在哪些司法管辖区之间共享数据,虽然这可能是真的,但完全去中心化是一个难以解决的问题。

    博主 suhaza回复Moxie 指出:

    “人们不想运行自己的服务器…已经出现了一些公司,它们将 API 访问权出售给他们作为服务运行的以太坊节点…几乎所有 DApp 都使用Infura或Alchemy来与区块链交互。事实上,即使你将像 MetaMask 这样的钱包连接到 DApp,并且 DApp 通过你的钱包与区块链交互,MetaMask 也只是在调用 Infura!”

    那么,这里有需要回答的问题:什么是 Web3?可行吗?真的会那么去中心化吗?

    人们对Web2表示失望,这推动了Web3发展?

    这是一个关于互联网如何被颠倒过来的故事……

    首先,有愿景、内容创建免费、每个人都可以访问。它被分散的开源信徒推广,包括互联网的发明者Tim Berners-Lee。

    然后现实则是,创建的内容以及数据,难以在价格与可访问性之间进行权衡。

    Web1 就像一个巨大的 Wikipedia 页面与庞大的 Craig’s List 结合在一起,它并没有广告,它并不允许用户进行登录或者基于此建立属于自己的私有网络空间。Web 2 是当前的算法定向广告时代,通常免费使用以换取您的隐私和数据。

    在这里插入图片描述

    Berners-Lee 对互联网的现状非常失望,因此,去中心化的 Web3反映了Berners-Lee 最初的愿景:“发布任何内容都不需要中央机构的许可……没有中央控制节点,因此,没有单点故障。” 他现在运行Solid,这是他自己的 Web3 数据存储游戏。

    因此,Web3 也将从数据隐私和去中心化服务器开始。

    Web3 从去中心化数据存储开始

    数据的去中心化存储是新兴 Web3 技术栈的关键组成部分。在 Web2 中,公司控制封闭的数据库,包括 Facebook、谷歌和其他常见的知名互联网公司都在不遗余力地囤积、控制和货币化他们收集的数据,但Web3 正在试图改变这一点。

    在这里插入图片描述

                         即使到了 2019 年,Web3 也正在以惊人的速度构建
    

    根据 Gartner 的数据,目前有五家公司控制着全球 80% 的云基础设施市场:亚马逊、谷歌、微软、阿里巴巴和华为,而Web3 试图打破这种现状。

    去中心化意味着通过给予参与者部分网络的直接所有权来增强这些权力结构,在 Web3 领域的很多项目中,用户都能够在开放的加密网络上真实拥有他们的数据。

    Filecoin 和 IPFS 等抗审查的 P2P 数据文件存储和数据共享应用程序引领了这一潮流,Web3 存储提供商(如 Filecoin)的一个共同特征是数据在网络中的多个节点中复制。

    然而,新兴的技术堆栈和意识形态仍然留下许多未解决的问题。

    授权用户控制自己的数据

    Verida 的首席运营官 Ryan Kris 正在这个领域建设,他在杂志中将“Web3 愿景”描述为“使人们能够控制自己的数据”。

    Verida 的目标受众是解决 Web3 堆栈中的软件开发工具包 (SDK)的问题:身份、消息传递、个人存储和数据互操作性。

    一套雄心勃勃的应用程序?“是的,但这是一项前沿技术,”他说,“一个没有围墙的花园。” 务实地说,他们不仅针对加密客户,而且目前正在为百慕大的去中心化医疗建立一个认证系统。

    但是,Web3 将如何通过使个人成为主权者来为我们带来更公平的互联网体验?Kris 在电信、金融、网络安全和区块链咨询领域拥有数十年的工作背景,他承认这是一个艰难的问题:

    “作为 Web3 可行性的一部分,还有一些值得商榷的商业问题,”他说。“锁定在中心化平台的个人数据如何被用户收回?如何激励初创公司构建产品和工具以实现这一转变?如何激励现有的二三线 Web2 公司转向 Web3 商业模式,以便与现有的市场领导者竞争?”

    Kris 指出,新技术也存在监管和实际问题:

    “在存储方面,IPFS 非常适合以冗余和分布式方式共享公共数据,但它并不是为保护私人个人数据而设计的。它以用户无法控制的方式分发,当无法保证数据存储在特定国家/地区时,这会引入监管问题。”

    每个项目也有不同程度的权力下放,如果 DApp 使用集中式存储,他们就不再被顽固分子视为“Web3”公司,但是,完全去中心化的技术很难构建。

    在这里插入图片描述

    更像Web2.5?

    一些人认为,我们目前实际构建的是 Web2.5,指的是加密原生但在运营中并未完全去中心化的业务。这种区别很重要,例如,NFT 本身可能存在于区块链上,但有与之相连的集中式数据存储库,例如 OpenSea,如果服务器出现故障,有价值的数据可能会丢失。

    Apollo Capital 加密分析师 David Angliss 指出,OpenSea 是 NFT 销售中最引人注目的平台,但它“并非完全由社区主导”。2021 年,OpenSea 还接受了主要的风险投资,并在纳斯达克 IPO 尝试失败,这让加密货币领域的人士非常懊恼。

    这就是 Web2.5 定义出现的地方。

    “Web3 不是加密领域的一部分。Web3 可以是任何使用区块链来抵抗审查的东西,包括 NFT 和 DeFi 游戏平台。”Angliss 表示。

    “Web3 将使用户能够对自己的数据和身份拥有主权,这在 Web2 数字环境中不存在。”

    “Web2 类似于封建主义,就像在封闭的生态系统中一样,由少数人统治。例如,Instagram 上一个诚实的用户拥有(帐户名称)“Meta”,Facebook 在此前重新更名后,Instagram不得不编造一个理由来暂停该无辜用户的长期帐户。Web3 可以阻止这种情况再次发生,在以太坊的名称服务中,如果我购买了“Ethereum.ens”,任何人都无法将其从我身上拿走。”

    Angliss 引用 OpenSea 作为 Web2.5 业务的示例,对于像 OpenSea 这样的大型企业来说,过于去中心化,就像完全抵制审查一样,在商业上可能是不受欢迎的。例如,OpenSea“促进了 NFT 的买卖,但是,在某些情况下,它也禁止出售被盗的无聊猿。”

    Web3(或者可能是 Web2.5,取决于所指的内容)被描述为互联网私有化的另一种方式。

    “仅仅因为它存在于加密生态系统中,但这并不能使其成为 Web3,”Angliss 说。最大的危险是我们只能看到集中的封闭生态系统,而不是蓬勃发展的 Web3。

    比 OpenSea 更加去中心化的社区主导平台正在兴起,包括 LooksRare 和 OpenDAO。

    LooksRare 甚至一直在对 OpenSea 进行“吸血鬼攻击”(以更大的激励措施窃取用户),这意味着 Web2.5 NFT 之王的 Web3 竞争对手可能会受到青睐。

    代币的引入为这些新的 NFT 平台,在如何建立客户忠诚度方面提供了更多选择。例如,OpenSea 收取费用,但没有一项是直接返回给社区的。LooksRare 对每笔基本销售收取类似的费用(每次交易2%的手续费),LOOKS 代币质押者赚取 100% 的交易费用。

    那么,也许 Web3 的时代即将到来?

    在这里插入图片描述

    到底是谁的数据?

    对 Web3 平台去中心化程度的持续批评,可能意味着我们仍旧处于这个领域的早期。新的商业模式和空间,如元宇宙和P2E游戏,意味着用户希望在去中心化平台上拥有和存放他们的游戏内资产和 NFT。比如 Arweave、Sia 和 Aleph.im 这样的 Web3 原生初创公司,就正在致力于此。

    Web3 真正去中心化需要创建新的链下模型,以消除云计算和 Web2.5 的定义。

    根据 2021 年 Messari 的报告:“今年,Arweave 和 Sia 成为了强大的竞争对手。” 他们试图保护 NFT 丢失的风险,因为中心化的服务器上的部分数据很容易被黑客入侵。

    另一个 Web3 云竞争对手 Aleph.im 寻求用替代服务网络取代云计算层。它是一个支持多个区块链的去中心化计算网络,通过消息协议与它们通信以检索和加密重要数据。

    Aleph.im 的创始人 Johnathan Schemoul 解释说:“Aleph.im 网络提供的解决方案是真正去中心化的替代方案,在最需要它的地方进行存储和计算。区块链并非旨在解决大容量存储或高性能计算,因为它们通常专注于共识和安全性。”

    这意味着大量数据通常存储在链下,增加了 OpenSea 等集中式数据库的数据存储风险。

    Aleph.im 使用户能够依赖区块链以及链下分散式云技术,来提供数字资产的真正所有权。

    “为了建立一个强大的去中心化网络,我们需要将去中心化扩展到处理共识和安全性的第 0 层和第 1 层之外。Aleph.im 生态系统的发展证明 Web3 可以去中心化,我们将继续努力。”

    Aleph.im 在 2022 年 1 月中旬筹集了 1000 万美元,例如,游戏公司 Ubisoft 将其网络用于其 NFT 存储,这是大众消费类型的游戏工作室,第一次将这种去中心化的所有权授予用户。

    重要的是,它还表明 Web3 可以以B2B的模式取得成功,即使普通消费者并不关心“去中心化”,并且加密趋势通常始于游戏。

    在这里插入图片描述

    代币经济学能否成为推动Web3的催化剂?

    不同的用户将会在不同的领域来采用一些Web3设施,但他们可能并不关心其是否去中心化。我们这个时代的问题更多的在于:用户在某种程度上更加重视隐私而不是便利、代币经济学能否对隐私与便利平衡的难题进行权衡?

    Holon Global Investments 董事总经理 Jonathan Hooker 认为,人类的互联网行为将会发生改变。他通过询问来开始他的 Web3 解释:“你拥有比特币吗?拥有和控制自己的自主财富让你感觉如何?” 接着他表示:

    “如果告诉你,你可以像控制比特币一样拥有和控制自己的数据会如何?”

    “商业模式必须找到潜在用户认为更重要的东西。这些用户又是否怀疑政府或将自己的健康记录放在他们无法控制的集中系统上?”

    “对于用户来说,在关键时刻拥、随时获取有这些医疗记录有多重要?Filecoin 和 IPFS 可以解决这些数据问题。”

    NFT 存储的竞争对于 Web3 的采用非常重要。Filecoin于 2021 年 4 月推出了 NFT.Storage,还提供 NFT 元数据和资产的免费链下存储。

    去国有化,以及区块链技术最重要的因素,是数据所有权的借出、质押或使用该数据的补偿领域。这是 Web3 的开创性的宗旨,Web3 通过代币化和与智能合约的复杂集成为用户提供价值。

    Hooker 说,代币经济学可以提供“超越互联网的价值体系”。

    然而,由于许多人只是通过 Facebook API 登录 Web2 应用程序而没有三思而后行,我们不得不质疑代币经济学到底能在多大程度上改变人类行为。互联网巨头公司比如谷歌、百度、腾讯和 Facebook(及其母公司 Meta)都已经拥有我们的数据,再进行整体的重塑是不是太晚了?

    也许不会。“数据就像水果,一开始它是新鲜的,但随着时间的推移它会腐烂,”他说。“大型科技公司关于我们的数据将有一个保质期。”

    Kris 同意 Hooker 的观点,“隐私不是问题,数据的价值才是问题”。人们接受他们将失去数据隐私,因此他们不妨将其标记化。人们很容易放弃他们的数据,为什么不为此获得报酬呢?

    “个性化数据提供在特定个性化环境中很有价值,例如,我会出售我的社交媒体数据,但不会出售我的健康数据。”

    密钥管理,是Web3 纯粹主义者和大众消费者都会面临的问题

    也有人对这种对数据代币经济学的乐观态度,持质疑态度。云计算公司 Box 的创始人 Aaron Levie 在指出其巨大潜力的同时,曾质疑Web3 模型的可行性:

    “为什么?因为数据几乎总是在应用程序的环境中工作、运行。Twitter 社交图谱、YouTube 频道、Spotify 播放列表、Airbnb 列表、Shopify 商店:这些都是在产品和 API 的背景下开发的,这些产品和 API 随着时间的推移迅速建立价值和信任。”

    Levie 进一步认为,代币经济学可能会使事情变得更加困难。“有了 Web3 的理想,我们可能已经将社区治理和代币经济学加入其中,这增加了一个新的协商向量。”

    这就是采用的难易程度问题:“这些是关于人类协调的难题,而不是关于软件或区块链的问题。” 许多人会选择 Facebook API 以方便使用,至关重要的是商业模式和 UX/UI 体验。

    例如,有一个常见的迷因,即加密忠实者很容易登录到 Web3,这是非常具有误导性的。它类似于:在 Web1 中有用户名和密码。在 Web 2 中,您可以通过 Google、Facebook 或 Twitter API 登录,而在 Web3 中,您只需连接您的钱包。例如,登录 MetaMask 并使用以太坊付款。

    但事实上,Levie是对的。这个模因忽略了区块链密钥管理的压力。即使是经验丰富的加密货币人士也会时不时地“心脏病发作”,更不用说新手了。

    初创公司创始人 Kris 认为:“Web3 需要更好的用户体验,公钥密码学是一种不同的登录方式,需要改进。对于用户来说,如何对密钥进行恢复?”

    而且,在这个阶段,任何可能的解决方案很可能都不是 100% 去中心化的。因此,Web3 密钥管理还有改进的空间。“一旦有人失去对密钥的控制,它就不再是 Web3,”Angliss 说。

    因此,完全分散的密钥管理对于 Web3 纯粹主义者来说仍然是一个主要问题。

    在这里插入图片描述

    2022年会是Web3元年吗?

    Web3 在被主流接受之前需要先解决各种问题。重要的是,它需要比 Web2.5 更好、更便宜——或者具有其他显着优势。

    在不牺牲去中心化协议的情况下实现可扩展性,仍然是 Web3 的明确目标。但是,去中心化很难,而中心化服务在很多方面,似乎都更加友好用户。

    以太坊联合创始人 Vitalik Buterin 本人最近表示,这就是为什么无论是中心化的Binance平台,还是Binance的交易业务在某些地方胜过以太坊支付,因为它们无需经过 12 次验证即可处理。

    谈到非常高的 Etheruem 汽油费,他接着说:“我确实认为很多人关心去中心化,但如果去中心化成本为每笔交易 8 美元,他们就不会接受去中心化。”

    “为了让区块链真正成为人们将要用于主流应用程序的东西,它必须便宜……不是按照 2014 年巨鲸购买加密货币的标准,但对于不断进入到区块链中的人来说,它必须便宜”

    就目前而言,Web3 似乎仍然是一个理想的概念,受可扩展性、代币经济学、主流采用和 Web3顽固信徒之间的交叉影响。

    就像很多加密货币历史一样。

    但是,Web3仍旧具备相当的发展空间。

    展开全文
  • Web3j使用教程(1)

    千次阅读 2022-03-01 17:14:46
    //获取客户端版本号,通常用来判断是否连接上 Web3ClientVersion web3clientversion = web3j.web3ClientVersion().send(); String clientVersion = web3clientversion.getWeb3ClientVersion(); System.out.println...

    开发环境:

    windows

    java 17.0.1

    maven 3.8.3

    node 14.17.0

    实验步骤:

    1.启动以太坊客户端节点

    安装ganache-cli(用于搭建以太坊私链),并启动ganache-cli

    npm install -g ganache-cli
    
    ganache-cli

     启动后可以看到如下信息

    2.测试以太坊通用的RPC接口,获取区块,交易,余额什么的

    新建一个maven项目,加上下面两个依赖

    <dependency>

    <groupId>org.web3j</groupId>

    <artifactId>core</artifactId>

    <version>4.8.7</version>

    </dependency>

    <dependency>

    <groupId>org.slf4j</groupId>

    <artifactId>slf4j-simple</artifactId>

    <version>1.6.6</version>

    </dependency>

    代码如下(暂时没有智能合约,只是简单的获取区块链信息和普通交易):

    package com.example;
    import org.web3j.crypto.Credentials;
    import org.web3j.protocol.Web3j;
    import org.web3j.protocol.core.DefaultBlockParameterName;
    import org.web3j.protocol.core.methods.request.Transaction;
    import org.web3j.protocol.core.methods.response.*;
    import org.web3j.protocol.core.methods.response.EthBlock.Block;
    import org.web3j.protocol.core.methods.response.EthBlock.TransactionResult;
    import org.web3j.protocol.http.HttpService;
    import org.web3j.tx.Transfer;
    import org.web3j.utils.Convert;
    import org.web3j.utils.Convert.Unit;
    import java.math.BigDecimal;
    import java.math.BigInteger;
    import java.util.List;
    
    /**
     * Hello world!
     *
     */
    public class App 
    {
        
        public static void main( String[] args )
        {
            try {
                //连接以太坊客户端节点,可以是ganache,geth等,注意地址端口和RPC协议(ws ,http)
                Web3j web3j = Web3j.build(new HttpService("http://127.0.0.1:8545"));
                //获取客户端版本号,通常用来判断是否连接上
                Web3ClientVersion web3clientversion = web3j.web3ClientVersion().send();
                String clientVersion = web3clientversion.getWeb3ClientVersion();
                System.out.println("web3clientVersion : " + clientVersion);
                //获取节点上所有的账户,在ganache中,每个账户有100ETH,允许你用上面用户交易
                //注意绝大多数以太坊客户端节点不会允许你用它上面的账户交易,你要自己创建钱包(见后面的Cpp类main函数)
                List<String> addressList = web3j.ethAccounts().send().getAccounts();
                System.out.println("addressList : "+addressList); 
                //交易前,获取前两个账户余额
                BigInteger balance0 = web3j.ethGetBalance(addressList.get(0), DefaultBlockParameterName.LATEST).send().getBalance();
                BigInteger balance1 = web3j.ethGetBalance(addressList.get(1), DefaultBlockParameterName.LATEST).send().getBalance();
                System.out.println("before Transaction:");
                System.out.println("balance0 : " + addressList.get(0) + " : " + balance0);
                System.out.println("balance1 : " + addressList.get(1) + " : " + balance1);
    
                //生成交易,参数包括谁发送,发给谁,发多少,给矿工的小费等等,由于ganache允许我们操作它上面的账户,所以不用签名。
                BigInteger mynounce = web3j.ethGetTransactionCount(addressList.get(0), DefaultBlockParameterName.LATEST).send().getTransactionCount();
                BigInteger gasPrice = web3j.ethGasPrice().send().getGasPrice();
                BigInteger gasLimit = BigInteger.valueOf(21000);
                BigInteger value = Convert.toWei(BigDecimal.valueOf(0.5), Unit.ETHER).toBigInteger() ;
                Transaction mytesttransaction= Transaction.createEtherTransaction(addressList.get(0),mynounce, gasPrice, gasLimit, addressList.get(1),value);
                System.out.println("mytesttransaction : ");
                printTransaction(mytesttransaction);
                //发送交易,获取交易哈希
                String txhash = web3j.ethSendTransaction(mytesttransaction).send().getTransactionHash();
                System.out.println("txhash : " + txhash);
                //交易对应的收据,这个对于智能合约交易非常有用,对普通交易没多大用
                TransactionReceipt transactionReceipt = web3j.ethGetTransactionReceipt(txhash).send().getTransactionReceipt().get();
                System.out.println("transactionReceipt : " + transactionReceipt);
    
                //交易后的余额
                balance0 = web3j.ethGetBalance(addressList.get(0), DefaultBlockParameterName.LATEST).send().getBalance();
                balance1 = web3j.ethGetBalance(addressList.get(1), DefaultBlockParameterName.LATEST).send().getBalance();
                System.out.println("after Transaction:");
                System.out.println("balance0 : " + addressList.get(0) + " : " + balance0);
                System.out.println("balance1 : " + addressList.get(1) + " : " + balance1);
    
                //获取当前最新区块,并获取它上面的所有交易
                Block latestBlock = web3j.ethGetBlockByNumber(DefaultBlockParameterName.LATEST, false).send().getBlock();
                System.out.println("latestBlock: " + latestBlock.getHash());
                //获取区块上的所有交易
                List<TransactionResult> txlist = latestBlock.getTransactions();
                System.out.println("get TransactionBy Block :" );
                for (TransactionResult transactionResult : txlist) {
                    System.out.println(transactionResult.get());
                }
            } catch (Exception e) {
                System.out.println(e);
                e.printStackTrace();
            }
        }
        public static void printTransaction(Transaction x) {
            //打印交易信息
            System.out.println("From:"+x.getFrom());
            System.out.println("GasLimit:"+x.getGas());
            System.out.println("Nonce:"+x.getNonce());
            System.out.println("GasPrice:"+x.getGasPrice());
            System.out.println("To:"+x.getTo());
            System.out.println("Value:"+x.getValue()); 
        }
        
    }
    class Cpp {
        public static void main(String[] args) {
            try {
                Web3j web3j = Web3j.build(new HttpService("http://127.0.0.1:8545"));
                //通常情况下,以太坊节点是不会让其他人用它上面的账户,我们要自己创建钱包,用自己的私钥对交易签名,
                //下面的私钥是ganache上第一个账户的私钥,虽然交易发起者和上面的交易一样,但两者本质是不同的。
                Credentials mysigner = Credentials.create("0xfd468e650d82240e739c18ea1aaa0a7316febec3e7bb056ff1437bd3d0ede99b");
                List<String> addressList = web3j.ethAccounts().send().getAccounts();
                String txhash = Transfer.sendFunds(web3j, mysigner, addressList.get(1),BigDecimal.valueOf(1.0), Unit.ETHER).send().getTransactionHash();
                System.out.println("txhash:"+txhash);
                TransactionReceipt receipt = web3j.ethGetTransactionReceipt(txhash).send().getTransactionReceipt().get();
                System.out.println(receipt);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    App中main执行结果:

    Cpp中main执行结果:

    展开全文
  • nodejs使用web3js开发以太坊

    千次阅读 2022-02-25 18:17:24
    安装web3 tx npm install web3 --save npm install ethereumjs-tx --save 注册节点 infura官网 service/ethService.js const Web3 = require('web3') const Tx = require('ethereumjs-tx').Transaction var ...
  • web3.js socket心跳重连,WebsocketProvider

    万次阅读 2021-10-24 14:37:22
    如果您的团队在生产中使用Web3JS,那么您必须意识到Web3JS中没有内置的重新连接功能来处理区块链断开或重新启动。 因此,通常,当连接断开时,NodeJS服务也需要重新启动才能再次连接到区块链。 代码: let ...
  • Web3j签名与验签

    万次阅读 2022-01-24 17:24:11
    主要是针对Java程序员围绕web3j库进行区块链以太坊开发,本地签名与验签。 代码实例: /** * @Description: Web3j签名验签 */ public class Web3j { // 钱包私钥 private static final String priKey = "e...
  • 目录标题web3.js介绍web3 模块加载异步回调(callback)回调 Promise 事件(v1.0.0)常用 API —— 基本信息查询查看 web3 版本查看 web3 连接到的节点版本(clientVersion)基本信息查询获取 network id获取节点的...
  • ganache 的安装 2.1 npm 安装 npm install -g ganache-cli 启动 ganache-cli 2.2 搭建 ganache 交互 mkdir ganache npm install web3 -save const Web3 = require("web3") console.log("判断浏览器是否启用Metamask...
  • web3类的介绍 | PHP实现ETH 1

    千次阅读 2022-02-26 18:53:59
    web3类的介绍 | PHP实现ETH 1
  • 快速学习-web3.js简介与入门

    千次阅读 2020-04-15 09:46:17
    web3.js简介与入门 web3.js简介 Web3 JavaScript app API web3.js 是一个JavaScript API库。要使DApp在以太坊上运行,我们可以使用web3.js库提供的web3对象 web3.js 通过RPC调用与本地节点通信,它可以用于任何暴露...
  • Web3对于我们普通人意味着什么?

    千次阅读 2022-02-10 14:24:52
    上一篇文章中我们了解了互联网的前世今生:Web 1.0、2.0、3.0,我们对Web的前两个阶段都不陌生,特别是 Web 2.0 移动互联网正是我们当下所处的时代,我们享受着这个时代给我们带来的便利。但同时,Web 2.0 移动...
  • Python使用Web3
  • 通过web3js部署调用智能合约1、在线编译智能合约2、部署合约 参考视频:https://www.bilibili.com/video/BV14z4y1Z7Jd?p=1 1、在线编译智能合约 https://remix.ethereum.org/ pragma solidity ^0.4.0; contract ...
  • 在vue中使用web3.js开发以太坊dapp

    万次阅读 热门讨论 2021-01-22 11:34:07
    前端如何使用以太坊智能合约方法 这里讲的是前端与MetaMask之间的交互 文中涉及到的官方文档 web3.js 1.0中文手册 MetaMask官方文档 ...import Web3 from 'web3' Vue.prototype.Web3 = Web3 一、唤起Me
  • web3.py 安装以及主币查询 - bsc链

    万次阅读 2021-12-25 16:42:41
    安装web3 pip install pip3 我的电脑会提示一个c++ 14.0的报错,按照以下步骤可以解决 error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“ # 百度云链接...
  • win10系统web3.js安装以及如何使用

    千次阅读 2022-04-21 19:50:42
    win10系统web3.js安装以及如何使用安装:使用: 安装: 需要:node.js(本人node.js版本14.17.6) 直接打开命令行输入: npm install web3 //当前安装的是最新版本的web3.js 查看安装的web3.js的版本: npm view web3 --...
  • web3调用智能合约读函数出现undefined

    万次阅读 2021-11-22 16:00:47
    本地Vscode编译js文件使用web3库调用智能合约读函数 源代码 智能合约MyContract.sol内容: // 需求:写一个可以获取值和设置值的智能合约 // 1.声明solidity版本 pragma solidity ^0.5.0; contract MyContract ...
  • ctfshow-WEB-web3

    万次阅读 2021-08-19 20:48:39
    ctf.show WEB模块的第3关是一个文件包含漏洞,include()函数包含的文件会被执行,我们使用PHP伪协议配合抓包工具进行命令执行,从而获取flag 这一关的flag就存放在网站跟路径下的文件中 php://input可以访问请求的...
  • Web3.js

    千次阅读 2022-04-23 18:39:10
    1 Web3.js基础 1.1 Web3.js 简介 Web3.js是一个库,使用它可以通过HTTP或IPC与本地或者以太坊远程节点交互 各种高级语言编写的程序可以使用web3 interface来与EVM交互,在此过程中使用是的JSON-RPC(一个无状态且轻...
  • 友友们是否安装web3js始终安装不下来呀,安装后是不是想是否能成功连接私链呢,接下来就解决了各位小伙伴的烦恼 安装方法 sudo npm install web3 -save 解决方法 若出错,首先可以更换指令,使用 npm install web3@...
  • web3j的基础用法-1连接钱包

    万次阅读 2021-12-02 14:43:47
    web3j,以太坊使用
  • web3 批量请求 BatchRequest batch.execute()

    万次阅读 2021-11-13 16:40:08
    web3.js BatchRequest batch.execute() 批量请求示例 这个是官方示例,用的时候一直有问题,不能正常调用。 原因是,我的方法原来使用的是异步函数,但是batch.execute(),只能同步调用。 Talk is cheap ,show me ...
  • 本地链使用web3js发送签名交易

    千次阅读 2021-11-28 16:14:52
    这是我查阅了网上教程和参考同学文章,自己动手调好的一个例子,探究的过程也是坑坑洼洼。话不多说,咱们实用派直接上代码。 转账签名交易 const Tx = require('ethereumjs-...// const web3 = new Web3(new Web3.pr
  • 1.web3.js中文文档 https://learnblockchain.cn/docs/web3.js/getting-started.html 2.metamask官方文档:https://docs.metamask.io/ 第一种方法:连接钱包 // 参考网址:...
  • web3py应该是python上跟智能合约交互最好用的包了,首先我们安装一下。 直接使用:pip install web3 进行安装。 教程 查询余额 我们新建一个py文件,开始编码吧~ from web3 import Web3, HTTPProvider ad
  • 这里用到 web3js 1.3.5 版本了,如果版本是新版,可以用下面的方法连接。 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="renderer" content="webkit"/> &...
  • 以太坊:主对象 web3

    万次阅读 2019-05-09 09:14:39
    web3 web3对象提供了所有方法 示例 var Web3 = require('web3'); // create an instance of web3 using the HTTP provider. // NOTE in mist web3 is already available, so check first if it's available ...
  • web3j 命令行

    千次阅读 2021-09-10 11:52:27
    1. 下载 最新的版本已经没有直接的...3. 命令 version: 版本号 wallet: create: 生成一个新的以太坊钱包 update:更新现有钱包的密码 send: 将以太币发送到另一个地址 solidity: 智能合约 new: import: ...
  • web3.eth.accounts 返回 undefined

    万次阅读 2021-09-28 16:24:22
    文章目录`web3.eth.accounts` 返回 undefined web3.eth.accounts 返回 undefined 错误: truffle(develop)> web3.eth.accounts[0] undefined web3.eth.accounts 已被启用 最新版本v1.5.2 可以这么写 web3.eth....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,280,332
精华内容 2,512,132
关键字:

web3