solidity通过 event返回结构体数据

  • Solidity
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract eventRequest {
// 结构体
    struct request_data {
        uint code;
        string message;
    }
    // event事件
    event EventRequest(string _desc,request_data);

    // 方法
    function addUser() public {
        emit EventRequest("register",request_data({
            code:200,
            message:"ok"
        }));
    }
}
  • Web3js
contract.methods.register().send({from:'钱包地址'})
	.on('receipt',receipt=>{
		contract.getPastEvents('EventRequest', {
			filter: {},
			fromBlock: receipt.blockNumber - 4000,
			toBlock: 'latest'
		}, function(error, events){ })
		.then(function(events){
			console.log('events',events)
			if(events.length > 0){
				let obj = {};
				let temp = events.find(v=>v.transactionHash === receipt.transactionHash)
				obj.code = temp.returnValues[1].code;
				obj.message = temp.returnValues[1].message;
				console.log('eventRequest',obj) //最终的结果
			}
		});
	})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是一个简单的登录注册合约示例,包括username和password结构体: ``` pragma solidity >=0.4.22 <0.8.0; contract Login { struct User { string username; string password; } mapping (address => User) users; function register(string memory _username, string memory _password) public { require(bytes(_username).length > 0 && bytes(_password).length > 0, "Username and password cannot be empty."); users[msg.sender].username = _username; users[msg.sender].password = _password; } function login(string memory _username, string memory _password) public view returns(bool) { require(bytes(_username).length > 0 && bytes(_password).length > 0, "Username and password cannot be empty."); return keccak256(bytes(users[msg.sender].username)) == keccak256(bytes(_username)) && keccak256(bytes(users[msg.sender].password)) == keccak256(bytes(_password)); } } ``` 这个合约中,我们定义了一个名为User的结构体,其中包含了username和password两个字符串类型的变量。我们使用mapping将用户的地址与其对应的User对象进行映射。 register函数用于用户注册,当注册时传入的用户名和密码都不为空时,将该用户的信息存储在mapping中。 login函数用于用户登录,当传入的用户名和密码与用户在mapping中存储的信息一致时,返回true,否则返回false。 需要注意的是,这个合约只是一个简单的示例,实际应用中还需要考虑安全性等方面的问题。 ### 回答2: 下面是一个使用Solidity编写的简单的登录注册合约: ```solidity pragma solidity ^0.8.0; contract LoginRegister { struct UserInfo { string username; string password; } mapping(address => UserInfo) private users; event Register(address indexed user, string username); event Login(address indexed user, string username); function register(string memory _username, string memory _password) public { users[msg.sender] = UserInfo(_username, _password); emit Register(msg.sender, _username); } function login(string memory _username, string memory _password) public view returns (bool) { UserInfo memory user = users[msg.sender]; if (keccak256(bytes(user.username)) == keccak256(bytes(_username)) && keccak256(bytes(user.password)) == keccak256(bytes(_password))) { emit Login(msg.sender, _username); return true; } else { return false; } } function getUserInfo(address _user) public view returns (string memory, string memory) { UserInfo memory user = users[_user]; return (user.username, user.password); } } ``` 这个合约包含`UserInfo`结构体,用于存储用户名和密码。在合约中使用了`mapping`类型来将用户地址与用户信息进行映射,并提供了注册和登录的方法。 `register`方法用于注册新用户,接收一个用户名和密码作为参数,并将其存储在`users`映射中。注册成功后,触发`Register`事件。 `login`方法用于用户登录,接收一个用户名和密码作为参数,并通过用户地址查找对应的用户信息。如果用户名和密码匹配,触发`Login`事件并返回`true`,否则返回`false`。 `getUserInfo`方法用于获取指定地址用户的用户名和密码信息。 注意:此合约只是一个简单示例,并未包含任何安全性检查或密码加密功能,仅用于演示Solidity的基本语法和合约编写。在实际应用中,请务必根据实际需求进行安全性和合规性的考量和实现。 ### 回答3: 下面是使用Solidity编写一个简单的登录和注册合约的例子,包含了用户名和密码的结构体: ``` pragma solidity ^0.8.0; contract LoginRegister { struct User { string username; string password; } mapping(address => User) private users; function register(string memory _username, string memory _password) public { require(bytes(_username).length > 0, "Username must not be empty"); require(bytes(_password).length > 0, "Password must not be empty"); require(bytes(users[msg.sender].username).length == 0, "User already exists"); User memory newUser = User(_username, _password); users[msg.sender] = newUser; } function login(string memory _username, string memory _password) public view returns(bool) { require(bytes(_username).length > 0, "Username must not be empty"); require(bytes(_password).length > 0, "Password must not be empty"); User memory user = users[msg.sender]; return (keccak256(bytes(user.username)) == keccak256(bytes(_username))) && (keccak256(bytes(user.password)) == keccak256(bytes(_password))); } } ``` 这个合约定义了一个名为`LoginRegister`的合约,其中包含了一个`User`结构体,该结构体包括了一个用户名和一个密码字段。合约使用了映射类型`mapping`来存储用户地址和用户对象之间的映射关系。 合约提供了两个函数:`register`和`login`。`register`函数用于注册新用户,其中需要提供一个非空的用户名和密码,并且检查该用户是否已经存在。`login`函数用于验证用户的用户名和密码是否正确,若验证通过则返回`true`,否则返回`false`。 请注意,这只是一个简单的示例合约,没有包含任何安全性和密码保护的功能。在实际使用中,应该针对具体的应用场景进行更加严格的安全性和密码保护措施的实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值