使用 Solidity 和 Node.js 构建简单的区块链预言机

使用 Solidity 和 Node.js 构建简单的区块链预言机

未标题-3

img

区块链上的预言机是允许区块链世界与来自网络其余部分的数据交互的框架,我们将其称为网络 2.0 世界。随着智能合约的应用不断扩大,处理独特用例所需的各种数据也将不断扩大。

事实上,web 2.0和web 3.0是两个截然不同的网络,目前最有用的数据都存在于web 2.0中。通过创建一组协议使智能合约能够访问这些数据,新一代的web、系统设计和区块链将出现。

目前的协议已经借鉴了预言机的概念,利用智能合约和链下api来构建混合系统,将web 2.0数据和其他区块链连接起来。最著名的预言机是Chainlink,它提供定价数据、与其他区块链的连接、对大多数api的访问以及各种其他数据馈送的服务。

其他主要的例子包括代币桥,它允许在链下服务的帮助下在链之间移动代币和数据。随着时间的推移,可能会出现更多独特的预言机。

事件驱动的预言机设计

img

在解决使用链下服务代表智能合约执行某些操作的问题时,最重要的是要记住,在智能合约和服务之间没有正式的消息传递过程。根据这个假设,我们知道智能合约不能“推送”,所以服务必须可听、可看。

只有两个链上项目,服务才有能力“监听”,就是状态变量和事件。观察状态变量很麻烦,因为它需要与合约进行多次交互。另一方面,事件不需要直接交互。

智能合约事件的触发方式如下:

emit newEvent(block.timestamp)

事件可以被看作是由开发人员定义的智能合约的操作日志。与其他类型的日志一样,其他服务也可以订阅此提要,以“监听”特定类型的事件,从它们的参数中收集数据,并对这些事件做任何它们想做的事情。这些日志对任何访问区块链的人都是可见的,并且可以通过像web3.js这样的库进行访问。

有了这种独特的通信系统,智能合约

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用 Solidity 和 Web3.js 实现登录、注册和权限管理的示例代码: Solidity 代码: ``` pragma solidity ^0.8.0; contract Auth { mapping(address => bool) public isAdmin; mapping(address => bool) public isUser; mapping(address => string) public username; mapping(string => address) public usernameToAddress; event NewAdmin(address admin); event NewUser(address user, string username); constructor() { isAdmin[msg.sender] = true; emit NewAdmin(msg.sender); } function register(string memory _username) public { require(usernameToAddress[_username] == address(0), "Username already exists"); require(!isUser[msg.sender], "Already registered"); isUser[msg.sender] = true; username[msg.sender] = _username; usernameToAddress[_username] = msg.sender; emit NewUser(msg.sender, _username); } function grantAdmin(address _admin) public { require(isAdmin[msg.sender], "Not authorized"); isAdmin[_admin] = true; emit NewAdmin(_admin); } function revokeAdmin(address _admin) public { require(isAdmin[msg.sender], "Not authorized"); isAdmin[_admin] = false; } } ``` 该合约维护了三个映射表: - `isAdmin`:存储管理员地址和其是否为管理员的状态。 - `isUser`:存储用户地址和其是否为用户的状态。 - `username`:存储用户地址和其用户名的映射关系。 合约提供了以下功能: - `constructor`:在合约部署时将合约创建者设为管理员。 - `register`:用户注册函数,将用户地址和用户名存储到映射表中。 - `grantAdmin`:授予管理员权限函数,只有管理员可以调用该函数。 - `revokeAdmin`:撤销管理员权限函数,只有管理员可以调用该函数。 Web3.js 代码: ``` const Web3 = require('web3'); const contractABI = require('path/to/contract-abi.json'); const web3 = new Web3('http://localhost:8545'); const contractAddress = '0x123456789abcdef'; const contractInstance = new web3.eth.Contract(contractABI, contractAddress); async function register(username) { const accounts = await web3.eth.getAccounts(); await contractInstance.methods.register(username).send({ from: accounts[0] }); } async function grantAdmin(address) { const accounts = await web3.eth.getAccounts(); await contractInstance.methods.grantAdmin(address).send({ from: accounts[0] }); } async function revokeAdmin(address) { const accounts = await web3.eth.getAccounts(); await contractInstance.methods.revokeAdmin(address).send({ from: accounts[0] }); } async function getUsername(address) { return await contractInstance.methods.username(address).call(); } async function getAddress(username) { return await contractInstance.methods.usernameToAddress(username).call(); } module.exports = { register, grantAdmin, revokeAdmin, getUsername, getAddress }; ``` 该代码包括以下功能: - `register`:调用合约的 `register` 函数,将用户名注册到合约中。 - `grantAdmin`:授权管理员权限。 - `revokeAdmin`:撤销管理员权限。 - `getUsername`:根据地址获取用户名。 - `getAddress`:根据用户名获取地址。 这些函数可以用于网站的登录和注册功能,以及管理员权限管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值