1. ERC20标准

https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md

pragma solidity ^0.4.;

//定义接口
contract ERC20Interface{
string public name;
string public symbol;
uint8 public decimals;
uint256 public totalSupply; /* function balanceOf(address _owner) view returns (uint256 balance); */
function transfer(address _to, uint256 _value) returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
function approve(address _spender, uint256 _value) returns (bool success);
function allowance(address _owner, address _spender) view returns (uint256 remaining); event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value); } contract ERC20 is ERC20Interface{
mapping(address => uint256) public balanceOf;
//委托,允许他人操作的金额数
mapping(address => mapping(address => uint256)) allowed; //构造方法
constructor() public {
name = "MyToken";
symbol = "weixuexi";
decimals = ;
totalSupply = ;
balanceOf[msg.sender] = totalSupply;
} /* function balanceOf(address _owner) view returns (uint256 balance){
return balanceOf[_owner];
} */
function transfer(address _to, uint256 _value) returns (bool success){
require(_to != address());
require(balanceOf[msg.sender] >= _value);
require(balanceOf[_to] + _value > balanceOf[_to]); balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
emit Transfer(msg.sender, _to, _value);
}
function transferFrom(address _from, address _to, uint256 _value) returns (bool success){ require(_from != address());
require(_to != address());
require(balanceOf[_from] >= _value);
require(allowed[msg.sender][_from] >= _value); //当前合约能操作_from的钱数要大于_value
require(balanceOf[_to] + _value > balanceOf[_to]); balanceOf[_from] -= _value;
balanceOf[_to] += _value;
emit Transfer(_from, _to, _value); success = true;
}
function approve(address _spender, uint256 _value) returns (bool success){
//当前账户允许—_spender操作的金额数
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
success = true;
}
function allowance(address _owner, address _spender) view returns (uint256 remaining){
return allowed[_owner][_spender];
}
}

2.DAPP去中心化应用开发【web项目】

  web3.js

  solidity

  truffle  https://truffleframework.com/docs/truffle/getting-started/installation

  ganache

开发流程:

  • 新建项目【初始化】
  • 编写合约
  • 合约编译、部署、测试
  • 与合约交互

安装truffle:

npm install -g truffle
查看版本:truffle.cmd version

创建项目:

  下载基本文件:

      cd pet-shop

    truffle init  【安装项目】

  下载pet-shop包文件:

    cd pet-shop

    truffle unbox pet-shop

编写智能合约:Adoption.sol

pragma solidity ^0.4.;

contract Adoption {
address[] public adoptors; //领养这地址 function adopt(uint petId) public returns(uint) {
adoptors[petId] = msg.sender;
return petId;
} function getAdoptors() public view returns (address[]) {
return adoptors;
}
}

编译: truffle.cmd compile【方式一,结合使用ganache】

  truffle develop 【方式二,truffle集成了testrpc】; compile;

部署合约:migrate

  部署合约脚本: 1_migration.js   改文件用于监听合约文件的动向,是否更新,变化

var MyContract = artifacts.require("MyContract");

module.exports = function(deployer) {
// deployment steps
deployer.deploy(MyContract);
};

  truffle.js:

module.exports = {
// See <http://truffleframework.com/docs/advanced/configuration>
// to customize your Truffle configuration!
networks: {
development: {
host: "127.0.0.1", //主机
port: 7545, //端口,和ganache对应
network_id: "*" // Match any network id
}
}
};

  部署合约:[truffle] migrate

输出结果:Adoption.json  [编译出的文件做出了更新]

这时,ganache中可以发现,已经出来了4个区块:

还有交易信息:

获取合约实例,调用函数:

pragma solidity ^0.4.;

contract Hello {
//如果使用pure修饰,可以通过合约对象直接调用,否则需要使用call方法调用
function test() pure public returns (string) {
return "hello world";
}
}

Hello.sol

/migrations/3_deploy_hello.js

var Hello = artifacts.require("./Hello.sol");

module.exports = function(deployer) {
deployer.deploy(Hello);
};

  使用web3获取合约实例: 

>truffle: let contract;   //声明contract变量

    contract = Hello.deployed().then(instance => contract=instance)             //Hello 是上面迁移文件的合约实例

pragma solidity ^0.4.;

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/Adoption.sol"; contract TestAdoption {
Adoption adoption = Adoption(DeployedAddresses.Adoption()); function testUserCatAdoptPet() public {
uint returnId = adoption.adopt(); uint expect = ;
Assert.equal(returnId, expect, "Adoption of pet Id 8 should be recorded");
} function testGetAdoptorAddByPetId() public {
address expect = this;
address adoptor = adoption.adoptors();
Assert.equal(expect, adoptor, "get adopt by pet id");
}
}

  注意:修改完合约文件后,重新编译【compile】后,重新部署命令【migrate --reset】

  调用合约方法:contract.test();

  使用断言测试:Assert

同时会多出很多新的区块和交易

3.web3.js api的使用

官网

  进入truffle开发环境:truffle.cmd develop

  获取账户余额:web3.eth.getBalace("").toString();

truffle(develop)> web3.eth.getBalance("0x627306090abab3a6e1400e9345bc60c78a8bef57").toString()
   ''

  获取所有账户:web3.eth.accounts;

truffle(develop)> null [
'0x627306090abab3a6e1400e9345bc60c78a8bef57',
'0xf17f52151ebef6c7334fad080c5704d77216b732',
'0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef',
'0x821aea9a577a9b44299b9c15c88cf3087f3b5544',
'0x0d1d4e623d10f9fba5db95830f7d3839406c6af2',
'0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e',
'0x2191ef87e392377ec08e7c08eb105ef5448eced5',
'0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5',
'0x6330a553fc93768f612722bb8c2ec78ac90b3bbc',
'0x5aeda56215b167893e80b4fe645ba6d5bab767de' ]

  获取当前账号:【数组中的第0个账号】

truffle(develop)> web3.eth.coinbase;
  '0x627306090abab3a6e1400e9345bc60c78a8bef57'

  web3.fromWei(num, 单位);

truffle(develop)> web3.fromWei(, 'ether')
'0.000000000000000005'

  web3.toWei(num,单位)

  默认的区块:

truffle(develop)> web3.eth.defaultBlock
  'latest'

  交易:

truffle(develop)> web3.eth.sendTransaction({from:account1, to:account2, value:})
  '0xb5065a9a03d75f08d7e704d352d08de5c8c4f8f19cc654cb1261d254f6194d90'
truffle(develop)> web3.eth.getBalance(account1)
  BigNumber { s: , e: , c: [ , ] }
truffle(develop)> web3.eth.getBalance(account2)
  BigNumber { s: , e: , c: [ ] }
truffle(develop)> web3.eth.getBalance(account1).toString()
  ''
truffle(develop)> web3.eth.getBalance(account2).toString()
  ''
truffle(develop)> web3.fromWei(web3.eth.getBalance(account1).toString(), 'ether')
  '99.899999999999979'
truffle(develop)> web3.fromWei(web3.eth.getBalance(account2).toString(), 'ether')
  '100.1'
truffle(develop)> web3.fromWei(web3.eth.getBalance(web3.eth.accounts[]).toString(), 'ether')
  ''

  

4. 代币合约的概念

pragma solidity ^0.4.;

contract EncryptedToken {
uint256 INITAL_SUPPLY = ;
mapping(address => uint) public balanceOf;
constructor() {
balanceOf[msg.sender] = INITAL_SUPPLY;
}
function transfer(address _to, uint256 _value) public {
require(_to != address());
require(balanceOf[msg.sender] >= _value);
require(balanceOf[_to] + _value > balanceOf[_to]); balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
}
}

EncryptedToken.sol

var EncryptedToken = artifacts.require("./EncryptedToken.sol");

module.exports = function(deployer) {
deployer.deploy(EncryptedToken);
};

1_deploy_encryptedToken.js

部署:

  truffle.cmd develop

  compile

  migate

  let c;

  EncryptedToken.deployed().then(inc => c=inc);

  c.balanceOf("0x627306090abab3a6e1400e9345bc60c78a8bef57") ;  ->10000   //钱包地址

默认部署到第一个测试钱包中:

转账:c.transfer("0xf17f52151ebef6c7334fad080c5704d77216b732",1000)

truffle(develop)> c.balanceOf("0x627306090abab3a6e1400e9345bc60c78a8bef57")
       BigNumber { s: 1, e: 3, c: [ 9000 ] }

5. web端

4.1 使用npm管理项目

  npm init

  安装web server:npm install lite-server

配置文件:bs-config.json

{
"server" : {
"baseDir":["./src", "./build/contracts"]
}
}

package.json:

启动服务:npm run dev

合约实战,代币合约,DAPP开发的更多相关文章

  1. 以太坊ERC20代币合约案例

    一.ERC20代币合约与web3调用 ERC20代币合约在小白看来觉得很高大上,但其实就是一个代币的定义标准,方便其他dapp统一调用各种代币的方法.如图: 二.ERC20合约标准 [官方链接] co ...

  2. erc20代币合约

    看这篇文章需要对以太坊,智能合约,代币等概念有基本的了解. 什么是ERC20 可以把ERC20简单理解成以太坊上的一个代币协议,所有基于以太坊开发的代币合约都遵守这个协议.遵守这些协议的代币我们可以认 ...

  3. 一步步教你创建自己的数字货币(代币)进行ICO

    本文从技术角度详细介绍如何基于以太坊ERC20创建代币的流程. 写在前面 本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 ...

  4. 用solidity语言开发代币智能合约

    智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...

  5. Go-Ethereum 1.7.2 结合 Mist 0.9.2 实现代币智能合约的实例

    目录 目录 1.什么是 Mist 2.Mist 在哪里下载? 3.Mist 有哪些依赖? 4.如何安装 Mist? 4.1.安装 Mist 依赖工具包 4.2.安装 Mist 4.3.启动 Mist, ...

  6. Solidity合约间的调用 -Solidity通过合约转ERC20代币

    Solidity通过合约转ERC20代币   ERC20代币并不能像Ether一样使用sendTo.transfer(amt)来转账,ERC20代币只能通过token中定义的transfer方法来转账 ...

  7. Solidity通过合约转ERC20代币

    ERC20代币并不能像Ether一样使用sendTo.transfer(amt)来转账,ERC20代币只能通过token中定义的transfer方法来转账,每个账户的余额信息也只保存在token合约的 ...

  8. 以太坊ERC20代币开发

    以太坊ERC20代币开发首先需要对以太坊,代币,ERC20,智能合约等以太坊代币开发中的基本概念有了解.根据我们的示例代码就可以发行自己的以太坊代币. 什么是ERC20 可以把ERC20简单理解成以太 ...

  9. 以太坊智能合约[ERC20]发币记录

    以太坊被称为区块链2.0,就是因为以太坊在应用层提供了虚拟机,使得开发者可以基于它自定义逻辑,通常被称为智能合约,合约中的公共接口可以作为区块链中的普通交易执行.本文就智能合约发代币流程作一完整介绍( ...

随机推荐

  1. linux下文件权限的介绍

    linux操作系统下,使用ll查看该目录下所有文件及其文件权限,以下是对文件权限的介绍 d代表的是目录(或称之为文件夹)   红框内的这3个是代表3个组的权限每组都是3个 第一组rwx代表是本用户的权 ...

  2. Ubuntu 安装后的配置及美化(二)

    Ubuntu安装后的配置与美化(二) 上篇文章讲了安装ubuntu后的一系列基础的配置,已经可以满足日常的使用了,这篇文章讲一下安装 IDE 及一些其他的配置. 1.安装 SSR 下载 SSR 客户端 ...

  3. 【ARC062F】 Painting Graphs with AtCoDeer 点双连通分量+polya定理

    Description 给定一张N点M边的无向图,每条边要染一个编号在1到K的颜色. 你可以对一张染色了的图进行若干次操作,每次操作形如,在图中选择一个简单环(即不经过相同点的环),并且将其颜色逆时针 ...

  4. linux下用rpm 安装jdk

    转载自http://blog.csdn.net/ldl22847/article/details/7605650 1.下载jdk的rpm安装包,这里以jdk-7u4-linux-i586.rpm为例进 ...

  5. 17、OpenCV Python 数字验证码识别

    __author__ = "WSX" import cv2 as cv import numpy as np from PIL import Image import pytess ...

  6. 条目十二《切勿对slt容器的线性安全性又不切实际的依赖》

    条目十二<切勿对slt容器的线性安全性又不切实际的依赖> 这一条目,我想用简短而有力的语句来总结. stl库是为了照顾大多数情况,而不是某一领域,如果在库层次实现线性安全,很大可能是对性能 ...

  7. linux下配置apache多站点访问-小案例

    一级域名(baidu.com)也叫作顶级域名,注册一级域名是需要付费的. 而二级域名(image.baidu.com)是一级域名的延伸,所以只要购买了一级域名,二级域名是可以任意配置的. 其实(www ...

  8. gym 102082G BZOJ4240 贪心+树状数组

    4240: 有趣的家庭菜园 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 756  Solved: 349[Submit][Status][Discu ...

  9. Cboard Cube 实现Top X效果

    第一步,点击度量值指标的排序. 第二步,点击[过滤]图标,选择Filter 在窗口中输入需要Top X的数字即可. 预览效果如下: 版权声明:本文为博主原创文章,需要转载请注明出处. [置顶]Cboa ...

  10. HTML <form> target 属性

    浏览器支持 所有主流浏览器都支持 target 属性. 定义和用法 target 属性规定一个名称或一个关键词,指示在何处打开 action URL,即在何处显示提交表单后接收到的响应. target ...