
操作步骤 在imToken中 点击上方右侧的添加 符号 在添加新资产中点击搜索 放大镜 符号 把智能合约复制粘贴在空白处 点击添加 返回后代币自动出现在你的钱包中 越晚越少 分发完为止。
1:VGS 30万个 打开imToken钱包 点击“ ”号 添加合约 0x4c9d5672ae33522240532206ab45508116daf263 立即获得30万VGS糖果
2:CSAT 1000个 合约地址 0xdb6192baf0e72ffd88d33508f15caedd5c79d75d
3:DAPP 10万个 合约地址 0x5D0fa08AEb173AdE44B0Cf7F31d506D8E04f0ac8
4:CANDY 57600个 用imToken转0.00个ETH到这个地址0x45555629AAbfEA138EAd1C1E5f2AC3Cce2aDd830会得到空投CANDY 57600个
下面几个就需要有ETH来撸了 已上交易所 可立即变现的 建议优先 撸。 如果imToken钱包中没有ETH 可以在交易所直接转币 空投币会反到交易所相应的地址
1:SNT,用imToken钱包转0.088个ETH到下面这个地址 0x2EF244C9b4CfCa1Ecd85027c359aDa4EdE4c7664 转账成功后,会收到空投币 SNT,6200个 火币现在价格0.25元左右
2:用imToken钱包转0.066个ETH到这个地址 0xB1F3964b61826a26d592eecbE3C5D3A5959eDA32 会收到空投币XRP 180个 价格在4元左右
3:用imToken钱包转0.1个ETH到这个地址 0xD1035636B079d904085e3370131B2826951Acf2C 会收到空投币 BTM 1818个 火币 okex现在价格1.2元左右。
4:用imToken钱包转0.066个ETH到这地址 0x48db5C7281597aF42765028ef77F48647B911c74 会收到空投币 GTC 3961个 火币 币安 gate价格在0.15元左右。
5:用imToken钱包转0.2个ETH到这地址 0x3F81DB4c6Ae81f51eD6e66820bAB03905586C086 会收到空投币 AE 285个。ZB 币赢价格在8元左右。
6:用imToken钱包转0.3个ETH到这地址 0x91d04899890caA09747A31e7A9c3ba7Ff91f9E72 会收到空投币EOS 80个 价格在36元左右 各大交易所都有。
先检查当前的账户余额
注意 转账之前先解锁账户
使用脚本
生成的交易ID与log相同。
此时挖矿 注意为了不影响转币的效果 采用第三个账号挖的矿。这样挖矿奖励与转账的两个账户就无关了。
检查两账户的余额变动
检查下交易详细信息
成功转了5Gwei。
升级可以添加错误检测增加鲁棒性
//创建web3对象var Web3 require( web3 );var web3 new Web3(new Web3.providers.HttpProvider( http://localhost:8545 ));//获取node参数var arguments process.argv.splice(2);if (!arguments || arguments.length ! 3){ console.log( Parameter Error ); return;var _from arguments[0];var _to arguments[1];var _value arguments[2];if (!web3.isAddress(_from) || !web3.isAddress(_to)){ console.log( Parameters not a address ); return;//转币eweb3.eth.sendTransaction({from: _from, to: _to, value: _value}, (err,res) { if (err) console.log( Error: , err); else console.log( Tx ID: , res);首先 合约要部署到私链或公链上 得到合约的地址。
合约内容
pragma solidity ^0.4.22;contract Coin{ mapping(address uint256) public balances; event Sent(address from, address to, uint256 amount); constructor(uint256 initalSupply) public{ balances[msg.sender] initalSupply; function send(address toAdd, uint256 amount) public returns(bool success){ require(balances[msg.sender] amount); require(balances[toAdd] amount balances[toAdd]); balances[msg.sender] - amount; balances[toAdd] amount; emit Sent(msg.sender, toAdd, amount); return true;部署代码
var Web3 require( web3 ) //引入var web3 new Web3(new Web3.providers.HttpProvider( http://localhost:8545 )) //创建对象var abi [{ constant :true, inputs :[{ name : , type : address }], name : balances , outputs :[{ name : , type : uint256 }], payable :false, stateMutability : view , type : function },{ constant :false, inputs :[{ name : toAdd , type : address },{ name : amount , type : uint256 }], name : send , outputs :[{ name : success , type : bool }], payable :false, stateMutability : nonpayable , type : function },{ inputs :[{ name : initalSupply , type : uint256 }], payable :false, stateMutability : nonpayable , type : constructor },{ anonymous :false, inputs :[{ indexed :false, name : from , type : address },{ indexed :false, name : to , type : address },{ indexed :false, name : amount , type : uint256 }], name : Sent , type : event }]var binData 0x 608060405234801561001057600080fd5b506040516020806103f483398101806040528101908080519060200190929190505050806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505061036e806100866000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327e235e314610051578063d0679d34146100a8575b600080fd5b34801561005d57600080fd5b50610092600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061010d565b6040518082815260200191505060405180910390f35b3480156100b457600080fd5b506100f3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610125565b604051808215151515815260200191505060405180910390f35b60006020528060005260406000206000915090505481565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561017457600080fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011015151561020157600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507f3990db2d31862302a685e8086b5755072a6e2b5b780af1ee81ece35ee3cd3345338484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a160019050929150505600a165627a7a72305820670dd25adb0e8896d00f58a9001a182d581a159163cbd3435581b269b137fb6a0029 var MyContract web3.eth.contract(abi)//注意 构造函数有参数var contractInstance MyContract.new(90000, {from:web3.eth.accounts[0], data:binData, gas:999999})部署后得到交易id 再挖矿上链得到合约地址。
调用合约转币脚本
var Web3 require( web3 );var web3 new Web3(new Web3.providers.HttpProvider( http://localhost:8545 ));var arguments process.argv.splice(2);var _from arguments[0]; //发币者也是合约函数调用者var _to arguments[1];var _value arguments[2];//创建合约实例var abi [{ constant :true, inputs :[{ name : , type : address }], name : balances , outputs :[{ name : , type : uint256 }], payable :false, stateMutability : view , type : function },{ constant :false, inputs :[{ name : toAdd , type : address },{ name : amount , type : uint256 }], name : send , outputs :[{ name : success , type : bool }], payable :false, stateMutability : nonpayable , type : function },{ inputs :[{ name : initalSupply , type : uint256 }], payable :false, stateMutability : nonpayable , type : constructor },{ anonymous :false, inputs :[{ indexed :false, name : from , type : address },{ indexed :false, name : to , type : address },{ indexed :false, name : amount , type : uint256 }], name : Sent , type : event }];var CoinContract web3.eth.contract(abi);var contractAddress 0x767b276a86d36b66830a95720513e26a0773ca0c ;var contractInstance CoinContract.at(contractAddress);//调用转币函数contractInstance.send(_to, _value, {from: _from}, (err,res) { if (err) console.log( Error: , err); else console.log( Result: , res);同样的 先检查当前各个账户的余额
账户一 90000 构造函数的初始值 账户二 0
这里也可以写一个简单的查询余额脚本
var Web3 require( web3 );var web3 new Web3(new Web3.providers.HttpProvider( http://localhost:8545 ));var arguments process.argv.splice(2);var _who arguments[0]; //要查询的人//创建合约实例var abi [{ constant :true, inputs :[{ name : , type : address }], name : balances , outputs :[{ name : , type : uint256 }], payable :false, stateMutability : view , type : function },{ constant :false, inputs :[{ name : toAdd , type : address },{ name : amount , type : uint256 }], name : send , outputs :[{ name : success , type : bool }], payable :false, stateMutability : nonpayable , type : function },{ inputs :[{ name : initalSupply , type : uint256 }], payable :false, stateMutability : nonpayable , type : constructor },{ anonymous :false, inputs :[{ indexed :false, name : from , type : address },{ indexed :false, name : to , type : address },{ indexed :false, name : amount , type : uint256 }], name : Sent , type : event }];var CoinContract web3.eth.contract(abi);var contractAddress 0x767b276a86d36b66830a95720513e26a0773ca0c ;var contractInstance CoinContract.at(contractAddress);contractInstance.balances(_who, {from:_who}, (err,res) { if (err) console.log(err); else console.log(res.toString(10));生成交易ID 挖矿 然后查看余额
成功转代币5万。
进一步的优化
自动解锁
收起imtoken能够彻底满足你的规定 本人感觉也是非常可靠的。imtoken的关键研发精英团队是中国杭州的。IMtoken钱包的助记词 公钥全是客户自身监管的 财产全是可靠的。imtoken中沒有帐户在应用imToken这种区块链技术数据钱包时 并沒有使你键入一切私人信息才可以建立钱包。因此也就沒有客户档案资料或是帐户必须去管理方法。与此同时你的密码是在手机本地存储的 沒有上传入钱包服务提供商的云服务器上 因此钱包在线客服也不可以协助你来改动钱包设置 密码重置 乃至“变化”钱包账户余额。也更是由于沒有钱包详细地址相对应的私人信息 因此客户遭受了行骗导致了经济损失 虽然还可以根据区块浏览器查看到代币总转到到哪一个详细地址 却也不能确立诈骗犯的真实身份。
自然不管哪一个钱包 一旦转化成了一个详细地址 你又备份数据了公钥 接受详细地址 公匙 是一直不容易变的 虽然安心。
当然 你需要先备份数据好公钥 随后保证 线下手机上的物理性安全性。
以上内容【收藏】imtoken钱包靠谱吗 imtoken钱包安全吗 imtoken靠谱吗 imtoken安全吗真诚的与您分享希望给你带来用处
收起传送门 https://zhuanlan.zhihu.com/p/41523247
上一篇文章用不专业、入门的语言分享了一下笔者理解的代币价值。本文将讲述一下代币生态的运作、如何发行代币以及如何用一门常用的编程语言 Java 操作它。
虽然类似的文章一搜一大堆 但是根据笔者的实践 几乎很少有一篇文章可以真的把整个流程讲解的透彻 并且无障碍的实践落地 所以本文把实践后的内容从新整理 希望对感兴趣的小伙伴有所帮助。
代币生态首先介绍一下代币生态的运作 先来介绍一个常见基于代币的商业模式 例如一个某APP的宣传语是“XX即挖矿 随时提现到钱包 发财就是这么容易”。这里提到几个点 挖矿、提现、发财。这个宣传语很有误导性 挖矿挖出来是啥 真的矿 提现到哪里 支付宝 怎么就发财了。
上一篇文章提到过 代币可以被几乎零成本的创造出来 然后存储在合约创建者的以太坊钱包中 这里挖矿挖出来的其实是项目方发行的代币。而提现也不是提现到微信支付宝 而是提现到以太坊钱包 而套现就需要把代币转移到交易所中去交易 至于能不能发财 就要看手里的代币和项目前景了。为了更明了 用如下图表示整个过程。
这个代币生态下主要分为APP内和APP外 APP的使用者 通过XX即挖矿获得代币 此时的代币还并不是真正以太坊网络上的代币 它只存在于APP的服务器中 和传统的积分并无两样。
然后用户可以通过“提现”操作 将代币提现到它的以太坊钱包中 而提现的实现就是通过代币智能合约。为什么不是 用户 XX 即挖矿的同时 就将代币发到用户的以太坊钱包呢 或许有的项目是这么做的吧 但是以太坊网络转账需要消耗GAS 以太坊 每笔代币转账需要消耗 0.001 - 0.002 以太坊 现价大概是5元左右 用户的每个“挖矿行为”都可能让她获得代币 频繁的转账成本很高 另外也不方便项目方锁仓之类的控制行为。
所以大多数的模式 都要走一个提现申请过程。提现会提到一个支持ERC20代币的钱包 例如imtoken。在钱包里的代币依然是一串数字 只有项目方将代币运作上交易所 才有可能交易套现。而代币的价格往往也和上市的交易所直接挂钩 如果运作上市知名交易所 如币安、火币等币价可能坚挺 如果是不知名的交易所 可能就命途多舛了。
有了可以交易该代币的交易所 用户将代币提现到交易所中 通过卖出代币获得USDT、ETH、BTC等硬通货数字货币 最后在法币交易板块 OTC 卖掉 收到法币完成套现。
是不是觉得这个模式就是空手套 零成本弄出一堆数字 然后用户进来疯狂的挖矿 至于最后能不能让用户赚到钱就看资本运作和二级市场表现了。记得周鸿祎伯伯说过一句话 XX比贩毒还赚钱 这种钱我们也要赚。所以下面的内容 就在技术上详细讲解下如何发行代币和如何用一个常用的编程语言操作它。
代币发行前期准备 外网连接、以太坊钱包 MetaMask 、ERC20代币智能合约。
在 Chrome 插件商店搜索并安装 MetaMask2. 运行后 用它来给我们初始化一个以太坊钱包。
为了测试 我们可以点击左上角切换到测试网络
发行数字货币需要消耗以太坊 在测试网络中可以免费获得测试所需的以太坊
Ethernet Faucet 然后点 Send me 1 test ether! 即可。一会就有会一个以太坊转到你的账户 如果是在真是网络上 需要你去交易所买以太坊 然后提现到自己的MetaMask钱包 当然也可以用 MetaMask 导入有 以太坊 的钱包。
然后就可以发布智能合约了。这里我准备一份智能合约
https://github.com/tianmz1987/dnc
这个合约看起来比较复杂 但是基本都是基于各种开源社区的合约内容改造的 如果你理解面向对象语言的话 合约的内容非常好理解 类似于Java的接口、继承等概念 最后要发布的智能合约DncToken 它继承并实现了若干个接口 除了ERC20标准接口外 同时具有总量限制 可以焚烧等特点 智能合约代码的继承树如下
有了智能合约 然后把它发布到以太坊网络中。我们使用 Remix - Solidity IDE 网站来发布智能合约。MetaMask会把当前账户相关的信息填写到网站上 我们只需要把智能合约的代码粘贴进去 简单的改一下配置就可以了
把网站当前使用的 solidity 编译器版本号改成和文件头一致 把Enable Optimization 去掉。然后切换到 Compile 页面 点击Start Compile。
最后在Run页面 点击 Deploy
然后会弹出 MetaMask 确认页面 输入一个 Gas 数量即可 点击Submit。
然后可以看到合约开始部署
部署完毕后 点击那个合约 会帮你打开一个网站 查看合约详情
点击合约地址 会跳转到合约校验发布页面 点击Verify And Publish
填写好下面信息 同时粘贴代码
拉到最下面 然后确认即可。发布成功后 会看到如下页面
然后在账户中 就可以看到如下内容了
因为这份智能合约初始状态 只约定代币总量 要通过 mint (铸币) 函数调用 才会给某个账户铸币 并且铸币总量不能超过约定到代币总量 当然也可以通过转账功能 在铸币后给别的地址转账 那么如何用一个常用到编程语言操作代币智能合约呢 用Java为例做进一步说明。
Java操作代币很多文章的操作方法 会安装一堆东西 例如以太坊本地运行环境之类 其实根本不需要 只要安装 solidity 智能合约编程语言 编译工具 solcjs 和 以太坊Java 接口工具 web3j 即可 和以太坊网络打交道的事情 可以通过网络完成。
首先安装基本工具 Mac系统
sudo npm install -g solcbrew tap web3j/web3jbrew install web3j为Java项目添加依赖
dependency groupId org.web3j /groupId artifactId core /artifactId version 3.5.0 /version /dependency然后把智能合约文件放入Java项目的根目录 执行
#!/usr/bin/env bashsolcjs dnc.sol --bin --abi -o ./web3j solidity generate --solidityTypes dnc_sol_DncToken.bin dnc_sol_DncToken.abi -o src/main/java -p org.bilan.module.asset.dnc然后在Java项目的 org.bilan.module.asset.dnc 包中 就出现了智能合约的Java版啦
然后用如下代码加载智能合约
package org.bilan.module.asset;import org.bilan.module.asset.config.ContractConfig;import org.bilan.module.asset.dnc.Dnc_sol_DncToken;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import org.web3j.crypto.Credentials;import org.web3j.crypto.WalletUtils;import org.web3j.protocol.Web3j;import org.web3j.protocol.http.HttpService;import org.web3j.tx.gas.DefaultGasProvider;import java.math.BigInteger;* Created by Vic on 2018/8/5. Componentpublic class ContractLoader { Autowired private ContractConfig config; private static Logger logger LoggerFactory.getLogger(WithdrawJob.class); public Dnc_sol_DncToken loadContract(){ try{ //以太坊基础设施网络申请访问 https://ropsten.infura.io Web3j web3j Web3j.build(new HttpService(config.getNet())); Credentials credentials WalletUtils.loadCredentials( config.getPassword(), //钱包密码 config.getKeyStore()); //钱包的 keystore 文件 Dnc_sol_DncToken contract Dnc_sol_DncToken.load(config.getAddress(), //合约地址 web3j, credentials, DefaultGasProvider.GAS_PRICE, DefaultGasProvider.GAS_LIMIT); return contract; catch (Exception e){ logger.error( load contract error , e); return null;做几点解释 config.getNet() 配置 是在以太坊基础设施网络中申请的访问 https://infura.io 简单的注册后就可以使用它提供的 Access Key 访问到以太坊主网和测试网。钱包密码是创建钱包的时候创建的 MetaMask 不支持导出 keystore 文件 所以最开始使用 MetaMask 创建钱包看来不明智 我们需要在官网上可以申请钱包 然后用 MetaMask 导入。
https://www.myetherwallet.com/
Dnc_sol_DncToken.load 函数需要的 address 就是智能合约的部署地址了 前面的内容中有提到。
合约加载好了以后 就可以调用合约中的函数了 例如调用铸币函数 mint
Integer decimal contractConfig.getDecimals(); BigDecimal decimalPart BigDecimal.TEN.pow(decimal); BigDecimal amount mintApplyVo.getAmount().multiply(decimalPart); Address toAddress new Address(mintApplyVo.getAddress()); TransactionReceipt receipt dnc.mint(toAddress, new Uint256(amount.toBigInteger())).send();值得注意的是 如果你要铸 100 个币 给智能合约的参数是 100 * pow( 10, decimal ), 这个decimal是智能合约内的一个参数 描述这个一个币的小数位数。
调用成功后 会返回 TransactionHash 用 TransactionHash 可以在 https://etherscan.io/ 上 找到交易的详细数据 这笔交易已经被打包到区块中了 它不能被篡改哦
再来看一下转账的调用
BigDecimal decimalPart BigDecimal.TEN.pow(decimal);BigDecimal amount vo.getAmount().multiply(decimalPart);Address toAddress new Address(userWalletVo.getEthAddress());TransactionReceipt receipt dnc.transfer(toAddress, new Uint256(amount.toBigInteger())).send();和 调用 mint 并没有什么两样 只不过这次使用 transfer 函数而已。通过铸币后 就可以在自己的钱包中看到这个代币啦 还可以转账给别人
是不是觉得很简单 感兴趣的话可以自己试试哦 不过千万别搞什么ICO 如果你看了这个然后去发币搞ICO被判非法集资 我可是不会负责的
收起