区块链学堂(28):用Mapping来实现一个简单的代币合约

在上一节里面我们通过mapping (bytes32 => uint) public balances; 实现了一个简单的mapping的hashtable. 但这样的hashTable无法部署在geth上面,也无法完成互相之间的代币转化。

这一节中我们将从0开始,撰写一个简单的合约

  • Step 1: 创建一个基础合约
pragma solidity 0.4.7;

contract Coin {
    address public minter;
    mapping (address => uint) public balances;
}

这里我们定义了一个address 作为key, uint做为value的hashTable balances; 我们还定义了一个address的变量minter;

  • Step 2: 添加一个构造函数Coin()
    function Coin() {
        minter = msg.sender;
    }

这里的代码minter = msg.sender; 代表创建这个合约的账户地址,被赋值给变量minter.

  • Step 3: 添加一个挖矿合约
      function mint(address receiver, uint amount) {
          if (msg.sender != minter) throw;
          balances[receiver] += amount;
      }
    

这里的核心代码在于,如果调用这个方法的账户,不是minter, 也就是创建合约的账户的话,这个mint()将无法被执行。 只有是创建合约的账户,也就是minter 才可以执行它

  • Step 4: 添加一个function send() 也就是从A转移X代币到B账户。代码如下:
      function send(address receiver, uint amount) {
          if (balances[msg.sender] < amount) return;
          balances[msg.sender] -= amount;
          balances[receiver] += amount;
      }
    

这个非常简单的转移货币的代码,也就是说msg.sender减少一定代币,接受者receiver增加一定代币

  • Step 5: 定义一个事件 Sent()
      event Sent(address from, address to, uint amount);
    
      function send(address receiver, uint amount) {
          if (balances[msg.sender] < amount) return;
          balances[msg.sender] -= amount;
          balances[receiver] += amount;
          Sent(msg.sender, receiver, amount);
      }
    
完整代码如下:
pragma solidity 0.4.7;

contract Coin {
    address public minter;
    mapping (address => uint) public balances;

    event Sent(address from, address to, uint amount);

    function Coin() {
        minter = msg.sender;
    }

    function mint(address receiver, uint amount) {
        if (msg.sender != minter) throw;
        balances[receiver] += amount;
    }

    function send(address receiver, uint amount) {
        if (balances[msg.sender] < amount) return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        Sent(msg.sender, receiver, amount);
    }
}

原文:http://www.ethchinese.com/?p=1120

QQ群:559649971 (区块链学堂粉丝群)
个人微信:steven_k_colin

获取最新区块链咨询,请关注《以太中文网》微信公众号:以太中文网

一个完整的身份认证系统需要包括用户注册、登录、身份验证、权限管理等功能。下面是一个基于区块链的完整身份认证系统的代码实现: 1. 定义数据结构 ``` struct User { address userAddress; // 用户地址 bytes32 passwordHash; // 密码哈希 bytes32 identityHash; // 身份哈希 } mapping(string => User) users; // 用户映射表 mapping(string => mapping(string => uint8)) permissions; // 权限映射表 ``` 2. 用户注册 ``` function register(string memory username, string memory password, string memory identity) public { require(users[username].userAddress == address(0), "User already exists"); address userAddress = msg.sender; bytes32 passwordHash = keccak256(bytes(password)); bytes32 identityHash = keccak256(bytes(identity)); users[username] = User(userAddress, passwordHash, identityHash); } ``` 3. 用户登录 ``` function login(string memory username, string memory password) public view returns (bool) { User storage user = users[username]; bytes32 passwordHash = keccak256(bytes(password)); return user.userAddress == msg.sender && user.passwordHash == passwordHash; } ``` 4. 用户信息修改 ``` function updateUserInfo(string memory username, string memory newUsername, string memory newPassword, string memory newIdentity) public { require(users[username].userAddress == msg.sender, "Not authorized"); bytes32 passwordHash = keccak256(bytes(newPassword)); bytes32 identityHash = keccak256(bytes(newIdentity)); users[newUsername] = User(msg.sender, passwordHash, identityHash); delete users[username]; } ``` 5. 身份验证 ``` function verifyIdentity(string memory username, string memory identity) public view returns (bool) { User storage user = users[username]; bytes32 identityHash = keccak256(bytes(identity)); return user.userAddress == msg.sender && user.identityHash == identityHash; } ``` 6. 权限管理 ``` function grantPermission(string memory username, string memory resource, uint8 permission) public { require(users[username].userAddress == msg.sender, "Not authorized"); permissions[username][resource] = permission; } function checkPermission(string memory username, string memory resource, uint8 permission) public view returns (bool) { return permissions[username][resource] >= permission; } ``` 需要注意的是,以上代码只是一个简单的示例,实际的身份认证系统需要考虑更多的安全性和可扩展性问题,如防止重放攻击、防止恶意用户注册等。同时,还需要将代码部署在区块链上,确保数据的安全性和不可篡改性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值