当前位置: 首页 > 后端技术 > PHP

泰山众筹研究案例(讲解)

时间:2023-03-29 18:58:24 PHP

一个简单的智能合约从一个非常基本的示例合约开始ZhaoxiStorage{uintstoredData;functionset(uintx){storedData=x;}functionget()constantreturns(uintretVal){returnstoredData;}}在Solidity中,合约由一组代码(合约的函数)和数据(合约的状态)组成。合同位于以太坊区块链上的一个地址。uint存储数据;这行代码声明了一个名为storedData的状态变量,其类型为无符号整数uint。可以看成是数据库中的一条记录,可以通过调用函数进行查询和修改。在以太坊中,通常只有合约的所有者才能这样做。在本例中,set和get函数分别用于修改和查询变量的值。与许多其他语言一样,在访问状态变量时,不需要像这样添加前缀。在它的前面。任何人都可以调用set方法来设置一个不同的号码来覆盖您发布的号码。但你的号码将保留在区块链的历史中。稍后我们将学习如何增加访问限制。加密货币示例以下合约将以最简单的形式实施加密货币。通过这个代码,只要有以太坊的一对公私钥,任何人都可以在不注册用户名和密码的情况下向他人发送货币。contractZhaoxiCoin{//关键字“public”允许从合约外部访问变量。addresspublicminter;mapping(address=>uint)publicbalances;//事件允许轻客户端有效地对变化做出反应。eventSent(addressfrom,addressto,uintamount);//此构造函数的代码仅在创建合约时运行。functionZhaoxiCoin(){minter=msg.sender;}//合约创建者可以调用mintfunctionmint(addressreceiver,uintamount){if(msg.sender!=minter)return;balances[receiver]+=amount;}//send可以被任何有tokens的人调用functionsend(addressreceiver,uintamount){if(balances[msg.sender]uint)publicbalances;创建一个公共状态变量,但它的类型更复杂。这种类型将一些地址映射到一个无符号整数。Mapping可以认为是一个哈希表,每一个可能的key对应的value都被虚拟初始化为全0。对于一个映射,不可能得到一个包含它所有键或值的链表。所以我们必须记住我们添加到映射中的内容。本例中,public关键字生成的access函数会比较复杂,其代码大致如下:addressto,uintvalue)这行代码声明了一个“事件”。由发送函数中的最后一行代码触发。客户可以收听这些区块链触发的事件。当事件被触发时,监听器会同时收到from、to、value的参数值,可以方便的用来跟踪交易。要监控此事件,可以使用以下代码:ZhaoxiCoin.Sent().watch({},'',function(error,result){if(!error){console.log("ZhaoxiCointransfer:"+result.args.amount+"coinsweresentfrom"+result.args.from+"to"+result.args.to+".");console.log("Balancesnow:\n"+"Sender:"+ZhaoxiCoin.balances.call(result.args.from)+"Receiver:"+ZhaoxiCoin.balances.call(result.args.to));}}ZhaoxiCoin这里有一个特殊的函数,它是一个构造函数,将在它在合约创建时运行,之后无法调用。它将永久存储合约创建者的地址。msg(以及tx和block)是一个全局变量,包含一些属于区块链的数据,可以被访问合约代码属性。msg.sender总是存储当前函数的外部调用者的地址。最后是用户或其他合约实际调用的函数来完成这个合约的功能是mint和发送。如果合约创建者之外的其他人调用mint,则什么也不会发生。任何人(拥有一定数量的代币)都可以调用send将一些代币发送给其他人。以上是一个简单的加密货币的完整代码和描述。