上手搭建一条自己的智能合约

上手搭建一条自己的智能合约,第1张

搭建一条智能合约

在实际 *** 作智能合约之前,我们首先回顾一下以太坊,以太坊又称以太坊钱包。以太坊钱包提供了包括账户管理,以太坊转账、Dapp 部署与使用在内的一些常规功能。

以太坊社区提供了多种语言实现的客户端和开发库,多数客户端支持 JSON-RPC2.0 标准,目前支持的客户版本有 Go-ethereum(Go 语言)、Parity(Rust 语言)、Cpp-ethereum(C++ 语言)、Ethereum-lib(Javascript)、EthererumJ(Java 语言)、Pyethapp(Python 语言),基本涵盖了主流编程语言。

 官方推荐使用的版本是 Go-ethererum,这是 Go 语言实现的版本,又称 Geth 客户端。

1. 下载与安装 Geth

本文使用 Geth 来进行测试,首先我们要获取 Geth 客户端,如果用户使用的是 Ubuntu 环境的话,可以直接从 PPA 安装。


 # apt-get install software-properties-common
 # add-apt-repository -y ppa:ethereum/ethereum
 # apt-get update
 # apt-get install ethereum

安装成功后,我们可以查看 Geth 的版本。

2. 搭建以太坊私链

如果在以太坊的主网上运行和开发测试智能合约,这是不明智的,因为会消耗真实的以太币,不过我们可以使用 Geth 搭建一条属于自己的以太坊区块链,也就是以太坊私链。怎么搭建呢?其实很简单,只需要修改配置文件和一些运行参数即可。 


   {
"config": {
    "chainId": 98,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
},
"difficulty": "200000000",
"gasLimit": "2100000",
"alloc": {
    "7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
    "f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
}
}

然后执行:


    $ geth --datadir /root/geth-test/ init genesis.json

这样,我们就初始化了属于自己的创世区块信息。接下来我们创建一个账户,由于是用户私链挖矿,只有你一个人挖矿,所以使用 CPU 挖矿完全没有问题。我们通过如下命令进入 Geth 命令行交互页面:


 $ geth --datadir /root/geth-test/ --networkid 98 console

如上图所示的那样,运行通过。我们创建了一个新账户,这个账户就是 EOA 账户,并通过 eth.getBalance 获取了当前地址的余额,显示为 0。

输入 Exit 退出后,我们开始以挖矿模式启动,这里我们最好记录一下我们的地址:

【0xf8f7ff845596f0bab1e973859bfcaec6cd2a82ab】

我们使用如下命令启动挖矿,注意在 Etherbase 的地方填上述地址:


$ geth --datadir /root/geth-test/ --networkid 98 --mine --minerthreads=1 --etherbase=0xf8f7ff845596f0bab1e973859bfcaec6cd2a82ab

 以太坊的 PoW 挖矿算法是内存困难型的,首先需要生成 DAG,这个视你设备的性能而定,需要耗费一定时间,请耐心等待,如下图所示,我们可以看到 DAG 生成非常耗费时间。

在我的远程开发机上一共耗费了 6 分半,又经过了 4 分钟,我挖到了第一个块,如下图所示。 

这期间机器的负载如下。

 现在我们再去检查一下 Etherbase 所指向地址的余额。

可以看到已经有 5 个以太币了,以太币的最小单位 wei,所以 5 后面 18 个零表示 5 个以太币。

3. 编写并部署属于自己的智能合约

智能合约的开发与钱包是独立的,用户可以使用 IDE 进行调试等 *** 作,目前 Dapp 的 IDE 并不多,常见有 Truffle、Embark、Remix 几种;这篇文章中,我并不使用 IDE,这里仅仅会给出一些示例代码,即经典的 Hello Word,你如果想尝试编写自己的智能合约,可以使用在线 IDE。 https://ethereum.github.io/browser-solidity/

首先我们要获取 Solidity 编译器,通过 apt-get install solc 来安装。安装成功后,我们新建一个 Solidity 源码文件,命名为 helloword.sol,并且写入代码如下。


pragma solidity ^0.4.11;
contract helloWorld {
function renderHelloWorld () returns (string) {
 return 'helloWorld';
}
}

执行 solc --bin helloword.sol 获得 EVM 二进制码。

编译器警告我们暂时不必理会,接下来我们还需要生成 ABI 部署参数,使用命令 solc --abi helloword.sol。

 开始部署,我们进入 console,定义 code 和 abi 两个变量如下,注意 code 的值最前面有 0x,二进制数据是用十六进制表示的。


 >code="0x6060604052341561000f57600080fd5b6101578061001e6000396000f300606060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063942ae0a714610046575b600080fd5b341561005157600080fd5b6100596100d4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561009957808201518184015260208101905061007e565b50505050905090810190601f1680156100c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100dc610117565b6040805190810160405280600a81526020017f68656c6c6f576f726c6400000000000000000000000000000000000000000000815250905090565b6020604051908101604052806000815250905600a165627a7a72305820fcce0b6910e479539e4796b7d56620a6f90e03ba47449c843bec54958f68bf700029"

>abi=[{"constant":false,"inputs":[],"name":"renderHelloWorld","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

你可以在控制台分别执行,由于结果比较长,这里就不放出来了。


  // 这一步解锁账户,用于方便部署合约 
  >personal.unlockAccount("0xf8f7ff845596f0bab1e973859bfcaec6cd2a82ab")
   // 使用上述定义的abi变量生成合约信息
  >myHelloWorld=eth.contract(abi)
  // 注入code信息,激活合约
>contract=myHelloWorld.new({from:"0xf8f7ff845596f0bab1e973859bfcaec6cd2a82ab",data:code,gas:1000000})   

最终执行结果如下。

我们可以通过 txpool 来查看未确认的交易。

接下来只要等待出块即可,你的合约就会成为正常运行的合约了,否则合约还不可以调用。

智能合约标准模板

当任何人都可以写代码自定义业务逻辑的时候,也就意味着需要一套标准让人们降低开发门槛,标准化的接口让产品之间可以协作。

我们接下来就来讨论一下以太坊上的三种智能合约标准模板。这三种模板都与 Token 有关。首先我们就来区分一下数字货币与 Token 的概念,数字货币一般指一个区块链项目的平台代币,比如以太坊上的以太币,元界上的 ETP 都是基础代币。而 Token 往往代表了一种资产,这些资产在已经存在的其他区块链之上运行,资产还可以像商品一样交易,例如消费积分、游戏虚拟资产。

Token 离具体的区块链应用也会更近,因为区块链应用的项目方通常也是 Token 的发行方。目前最广泛使用的三种 Token 标准都是基于以太坊的,它们分别是 ERC20、ERC223、ERC721。这里的 ERC 表示 Ethereum Request for Comments,翻译过来就是以太坊意见征求稿。 

1.ERC20

2015 年 11 月,V 神在 Github 上提交了 ERC20 代币的技术标准,随后 2016 年到 2017 年,大量的区块链项目都使用 ERC20 作为工具进行 ICO。这使得 ERC20 成为了区块链整个行业内的 Token 标准,可见这种标准的影响之大。

实际上 ERC20 代币是一类运行在以太坊区块链上的智能合约,只不过这些合约代码遵循一定的规范,这个规范就是 ERC20 标准,它规定了跨 Dapp 转移 Token、Token 交易以及一些使用接口。

ERC20 一共定义了 6 个函数和两个触发事件,他们都是使用 Solidity 语言编写的。6 个函数描述了如何转移以及 Token 的相关数据如何被访问,市面上 99% 的 ERC20 Token 都可以找到这 6 个函数。2 个事件提供了 Approve 和 Transfer 的格式化输出。下面我们重点看一看 ERC20 的接口。


 // ---------------------------------------------
 // ERC Token Standard #20 Interface
 // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
 // -------------------------------------------
contract ERC20Interface {
 function totalSupply() public constant returns (uint);
 function balanceOf(address tokenOwner) public constant returns (uint balance);
 function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
 function transfer(address to, uint tokens) public returns (bool success);
 function approve(address spender, uint tokens) public returns (bool success);
 function transferFrom(address from, address to, uint tokens) public returns (bool success);
 event Transfer(address indexed from, address indexed to, uint tokens);
 event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
Allowance:允许多次创建两个不同的地址之间的单向交易,Token 的拥有者可以从此智能合约中提取 Token;Approve:这个函数需要引用 Allowance,顾名思义,它定义了 Token 的拥有者同意创建属于自己的交易,这个函数要求两个参数作为输入,分别是花费者的地址,以及发送金额;BalanceOf:定义了查询目标地址账户余额的接口;Transfer 和 TransferFrom:定义了 Token 如何转移以及执行转移过程;TotalSupply:定义了这个 Token 最大发行量。 2.ERC223

在某些情况下,ERC20 也有些缺陷。例如某人使用 ERC20 发送 100 个 Token 到另外一个账户,如果目标账户是一个合约账户,目标账户的合约代码如果不兼容 ERC20 标准怎么办呢?这一点非常有可能,由于合约代码无法识别交易,所以这笔交易就会被拒绝。

我们知道以太坊使用的并不是 UTXO,这意味着合约之间不满足 ACID,那么很遗憾,发送方的这 100 个 Token 就永久地丢失了。为了解决这个问题,非官方的社区开发者提交了 ERC223模板,可以解决这个问题,使用者需要把既存的 ERC20 合约升级到 ERC223 合约。

3.ERC721

2018 年初,有一个区块链游戏火了,叫做以太坊养猫游戏,这个游戏也是一个智能合约。它基于 ERC721 标准,实际上它也是一种 Token 标准。ERC721 与 ERC20 最大的区别是:ERC721 定义了每一份 Token 都是唯一的,它们有唯一的标识。例如芒果和米饭是两种不同属性的资产,从物理世界来看,他们是不能直接混在一起使用的,我们不能把芒果加到大米中。这样一来,ERC721 中 Token 的含义也转变成了一种物权所有权凭证,不再是 ERC20 中的同质资产。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/1298702.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存