• 智能合约入门


    一个简单的智能合约

    先从一个非常基础的例子开始

     
    contract ZhaoxiStorage {
    
        uint storedData;
    
        function set(uint x) {
            storedData = x;
        }
    
        function get() constant returns (uint retVal) {
            return storedData;
        }
    }

    在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成。合约位于以太坊区块链上的一个地址。

    uint storedData; 这行代码声明了一个状态变量,变量名为storedData,类型为无符号整数uint。可以看做数据库里面的一条记录,可以通过调用函数查询和修改它。在以太坊中,通常只有合约的拥有者才能这样做。在这个例子中,函数 set 和 get 分别用于修改和查询变量的值。

    跟很多其他语言一样,访问状态变量时,不需要在前面增加 this. 这样的前缀。

    任何人都可以调用set方法设置一个不同的数字覆盖你发布的数字。但是你的数字将会留存在区块链的历史上。稍后我们会学习如何增加存取限制。

    一个加密货币列子

    接下来的合约将实现一个形式最简单的加密货币。通过这份代码,任何人都可以发送货币给其他人,不需要注册用户名和密码,只要有一对以太坊的公私钥即可。

     
    contract ZhaoxiCoin {
    
        // 关键字“public”使变量能从合约外部访问。
        address public minter;
        mapping (address => uint) public balances;
    
        // 事件让轻客户端能高效的对变化做出反应。
        event Sent(address from, address to, uint amount);
    
        // 这个构造函数的代码仅仅只在合约创建的时候被运行。
        function ZhaoxiCoin() {
            minter = msg.sender;
        }
    
        // 合约创建者可以调用mint
        function mint(address receiver, uint amount) {
            if (msg.sender != minter) return;
            balances[receiver] += amount;
        }
    
        // send可以被拥有代币的任何人调用
        function send(address receiver, uint amount) {
            if (balances[msg.sender] < amount) return;
            balances[msg.sender] -= amount;
            balances[receiver] += amount;
            Sent(msg.sender, receiver, amount);
        }
    }

    address public minter 这行代码声明了一个可公开访问的状态变量,类型为address。address类型的值大小为160 bits,适用于存储合约的地址或其他人的公私钥。public关键字会自动为其修饰的状态变量生成访问函数。没有public关键字的变量将无法被其他合约访问。另外只有本合约内的代码才能写入。自动生成的函数如下:

    1
    
    function minter() returns (address) { return minter; }

    下一行代码mapping (address => uint) public balances; 创建了一个public的状态变量,但是其类型更加的复杂。该类型将一些address映射到无符号整数。mapping可以被认为是一个哈希表,每一个可能的key对应的value被虚拟的初始化为全0。对于一个mapping,无法获取一个包含其所有key或者value的链表。所以我们得自己记着添加了哪些东西到mapping中。在这个例子中由public关键字生成的访问函数将会更加复杂,其代码大致如下:

     
    function balances(address _account) returns (uint balance) {
        return balances[_account];
    }

    event Sent(address from, address to, uint value)这行代码声明了一个“事件”。由send函数的最后一行代码触发。客户端可以监听这些由区块链触发的事件。事件触发时,监听者会同时接收到from,to,value这些参数值,可以方便的用于跟踪交易。为了监听这个事件,你可以使用如下代码:

     
    ZhaoxiCoin.Sent().watch({}, '', function(error, result) {
        if (!error) {
            console.log("ZhaoxiCoin transfer: " + result.args.amount +
                " coins were sent from " + result.args.from +
                " to " + result.args.to + ".");
            console.log("Balances now:
    " +
                "Sender: " + ZhaoxiCoin.balances.call(result.args.from) +
                "Receiver: " + ZhaoxiCoin.balances.call(result.args.to));
        }
    }

    这里有个比较特殊的函数 ZhaoxiCoin。它是一个构造函数,会在合约创建的时候运行,之后就无法被调用。它会永久得存储合约创建者的地址。msg(以及tx和block)是一个全局变量,它包含了一些可以被合约代码访问的属于区块链的属性。msg.sender 总是存放着当前函数的外部调用者的地址。

    最后,真正被用户或者其他合约调用,用来完成本合约功能的函数是mint和send。如果合约创建者之外的其他人调用mint,什么都不会发生。而send可以被任何人(拥有一定数量的代币)调用,发送一些币给其他人。

    以上就是一个简单的加密货币的完整代码和说明。

  • 相关阅读:
    HDFS被设计成能够在一个大集群中跨机器可靠地存储超大文件
    NameNode实现了三个接口
    MongoDB Connector for Hadoop
    Java Virtual Machine (JVM) objects 虚拟机实例的产生 退出 两种线程
    Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data.
    配置hadoop用户SSH无密码登陆 的2种方式 落脚点是 可以ssh免密进入的主机名写入动作发出主机的 known_hosts,而被无密进入主机的authorized_keys文件 免密登录
    Java Virtual Machine Process Status Tool
    Problem binding to [bigdata-server-01:9000] java.net.BindException: Cannot assign requested address;
    a completely rewritten architecture of Hadoop cluster
    curl is a tool to transfer data from or to a server curl POST
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13313441.html
Copyright © 2020-2023  润新知