- 第 1 章 区块链
- 1.2. 什么是智能合约?
- 1.3. 我们应该怎么做?
- 1.4. 如何学习区块链
- 1.5. 币圈与链圈
- 1.6. 区块链能做什么
- 1.7. 区块链不能解决的问题
- 1.8. 理解去中心化
- 1.9. 理解不可撰改
- 1.10. 理解分布式记账
- 1.11. 安全问题
- 1.12. 区块链落地面临的问题
- 1.13. 区块链未来
- 1.14. 区块链的六层模型
- 1.15. 共识机制
- 1.16. SHA-256
- 1.17. Base58编码
- 1.18. Merkle
- 1.19. BIP39协议:使用助记词生成确定性钱包
- 1.20. Ethereum vs Hypterledger Fabic vs EOS 对比
- 1.21. 区块链探索
- 第 2 章 以太坊
- 第 3 章 以太坊私链入门
- 第 4 章 以太坊网络
- 第 5 章 geth v1.8.16 命令详解
- 第 6 章 Wallet
- 第 7 章 Token
- 第 8 章 智能合约语言 Solidity v0.5.0
- 8.2. solc 命令
- 8.3. 智能合约入门演示
- 8.4. Helloworld Example
- 8.5. 数据类型
- 8.6. 单位
- 8.7. 变量
- 8.8. 函数
- 8.9. 事件
- 8.10. 面向对象编程
- 8.11. 合约调用
- 8.12. 合约接收 ETH
- 8.13. 合约中实例化一个接口
- 8.14. 合约中实例化另一个合约
- 8.15. Solidity 安全问题
- 8.16. solidity example
- 8.17. Zeppelin Solidity - OpenZeppelin is a library for writing secure Smart Contracts on Ethereum.
- 第 9 章 Truffle v4.1.8 开发框架
- 第 10 章 web3.js - 1.0.0
- 第 11 章 web3j v3.4.0 - Jave Client
- 11.2. 启动以太坊
- 11.3. Maven pom.xml 文件
- 11.4. Java 与 Solidity 数据类型映射关系
- 11.5. 常量
- 11.6. 连接到服务器获取版本号
- 11.7. 获得以太坊状态信息
- 11.8. 单位转换
- 11.9. 账号管理
- 11.10. Credentials
- 11.11. 交易
- 11.12. 钱包
- 11.13. 智能合约
- 11.14. ERC20合约
- 11.15. Infura
- 11.16. 助记词
- 11.17. 过滤器 (Filter)
- 11.18. Subscription
- 11.19. 解锁账号
- 11.20. IBAN (International Bank Account Number)
- 11.21. Springboot with Ethereum (web3j)
- 第 12 章 web3.py - A python interface for interacting with the Ethereum blockchain and ecosystem.
- 第 14 章 Ethereum Developer APIs
- 第 15 章 infura
- 第 16 章 以太坊案例
- 第 17 章 FAQ
- 17.3. Error: authentication needed: password or unlock
- 17.4. 新增节点后不生效
- 17.5. Unhandled rejection Error: Returned error: The method personal_unlockAccount does not exist/is not available
- 17.6. Error: exceeds block gas limit
- 17.7. Migrations.sol:11:3: Warning: Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(…) { … }" instead.
- 17.8. Exception in thread "main" rx.exceptions.OnErrorNotImplementedException: Invalid response received: okhttp3.internal.http.RealResponseBody@6c25e6c4
- 17.9. 旧版本 Remix(browser-solidity) 本地安装
- 第 18 章 Hyperledger Fabric v2.0.0
- 第 19 章 Hyperledger Fabric 运维
- 第 20 章 Chaincode 链码(智能合约)
- 第 21 章 Hyperledger Fabric Client SDK for Node.js
- 第 22 章 fabric-sdk-java
- 第 24 章 已知 Hyperledger 落地案例
- 第 25 章 Fabric Command
- 第 26 章 Fabric FAQ
- 第 27 章 IPFS(InterPlanetary File System,星际文件系统)
- 第 28 章 IPFS 命令
- 第 29 章 IPFS WebUI
- 第 30 章 IPFS 集群配置
- 第 31 章 IPFS API
- 第 32 章 IPFS Faq
- 第 33 章 EOS
- 第 34 章 EOS 安装
- 第 35 章 CLEOS
- 第 36 章 智能合约开发
- 第 37 章 EOS Dapp 开发
- 第 38 章 FAQ
- 第 39 章 BaaS (Blockchain as a Service) 平台
- 第 40 章 BitCoin
- 第 41 章 其他区块链相关
- 附录 1. 附录
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
10.13. 实用例子
10.13. 实用例子
10.13.1. 数据写入到区块链中
做一笔交易,并写入数据到区块链中
let Web3 = require("web3"); let fs = require("fs"); let web3 = new Web3("http://localhost:8545"); let log = { time:(new Date).getTime(), type:"info", msg:"Web3 Test!!!" }; let str = JSON.stringify(log); console.log(str); let data = Buffer.from(str).toString('hex'); data = '0x'+data; console.log(data); //将数据写入到交易中 let coinbase = "0x5c18a33df2cc41a1beddc91133b8422e89f041b7" console.log(coinbase) let user1 = "0xc2b9e316f246d35052118e51b55c75bfe99d247e"; web3.eth.personal.unlockAccount(coinbase, "coinbase"); let address = web3.eth.sendTransaction({ from:coinbase, to:user1, value:'0x00', data:data },function(error, hash){ console.log(hash); });
运行上面程序,会产生一个交易,记下hash值,然后启动挖矿。
> miner.start(); null # 过一段时间后停止 > miner.stop(); true
然后查看这比交易
let Web3 = require("web3"); let fs = require("fs"); let web3 = new Web3("http://localhost:8545"); let address ="0xb15681eb4bdb6b9670d305fb341ebbc95d45c2ede0ea5034ef432b74f30b1b4f"; //从交易地址获取数据 web3.eth.getTransaction(address).then(console.log); web3.eth.getTransaction(address,function(error, result){ //console.log(result); inputData = result.input; res_str = Buffer.from(inputData.replace('0x',''),'hex').toString(); res_json = JSON.parse(res_str); console.log(res_json); });
结果输出
{ blockHash: '0x78dacc2af60900d2e4cae90b71e27446e6e883df36c53f21cbc9e071f7a586f4', blockNumber: 1258, from: '0x5c18a33DF2cc41a1bedDC91133b8422e89f041B7', gas: 90000, gasPrice: '18000000000', hash: '0xb15681eb4bdb6b9670d305fb341ebbc95d45c2ede0ea5034ef432b74f30b1b4f', input: '0x7b2274696d65223a313531383933313435323537372c2274797065223a22696e666f222c226d7367223a22576562332054657374212121227d', nonce: 4, to: '0xc2b9e316F246d35052118E51B55C75BfE99d247e', transactionIndex: 0, value: '0', v: '0x41', r: '0x7fcd86c7fd975a0e98bd0e61a99da950b0155cd6c4581fefa4defbdcd404a930', s: '0x16f14ce1fbfadb9d59f343f8ac235cdd73dcedec5db1025ef91206b8bb17a827' } { time: 1518931452577, type: 'info', msg: 'Web3 Test!!!' }
{ time: 1518931452577, type: 'info', msg: 'Web3 Test!!!' } 就是保存在区块链中的数据。
10.13.2. 编译部署智能合约
console.log('Setting up...'); const fs = require ('fs'); const solc = require ('solc'); const Web3 = require ('web3'); const web3 = new Web3("http://localhost:8545"); console.log('Reading Contract...'); const input = fs.readFileSync('Netkiller.sol'); console.log('Compiling Contract...'); const output = solc.compile(input.toString(), 1); //console.log(output); const bytecode = output.contracts[':Netkiller'].bytecode; //console.log(bytecode); const abi = output.contracts[':Netkiller'].interface; //console.log(abi); //Contract Object //const helloWorldContract = web3.eth.contract(JSON.parse(abi)); var myContract = new web3.eth.Contract(JSON.parse(abi), '0x5c18a33df2cc41a1beddc91133b8422e89f041b7', { from: '0x5c18a33df2cc41a1beddc91133b8422e89f041b7', // default from address gasPrice: '20000000000' // default gas price in wei, 20 gwei in this case }); console.log('unlocking Coinbase account'); const password = "chen1980"; web3.eth.personal.unlockAccount("0x5c18a33df2cc41a1beddc91133b8422e89f041b7", password,100); console.log("Deploying the contract");
10.13.3. 部署合约
var Web3 = require('web3'); var net = require('net'); var web3 = new Web3(new Web3.providers.IpcProvider("~/netkiller/ethereum/geth.ipc",net)); var abi = [...]; var bin = ""; var tokenContract = new web3.eth.Contract(abi, null, { from: '0xFB88dE099e13c3ED21F80a7a1E49f8CAEcF10df6' // 目前web3没有api来解锁账户,只能自己事先解锁 }); tokenContract.deploy({ data: bin, arguments: ['netkiller'] // 这里是构造函数传值,如果构造函数没有参数,请删除这行。 }).send({ from: '0xFB88dE099e13c3ED21F80a7a1E49f8CAEcF10df6', gas: 1500000, gasPrice: '30000000000000' }, function(error, transactionHash){ console.log("deploy tx hash:"+transactionHash) }) .on('error', function(error){ console.error(error) }) .on('transactionHash', function(transactionHash){ console.log("hash:",transactionHash)}) .on('receipt', function(receipt){ console.log(receipt.contractAddress) // contains the new contract address }) .on('confirmation', function(confirmationNumber, receipt){console.log("receipt,",receipt)}) .then(function(newContractInstance){ console.log(newContractInstance.options.address) // instance with the new contract address });
10.13.4. ERC20 Example
通过Web3操作代币转账
fs = require('fs'); const Web3 = require('web3'); const web3 = new Web3('http://localhost:8545'); web3.version const abi = fs.readFileSync('output/TokenERC20.abi', 'utf-8'); const contractAddress = "0x05A97632C197a0496bc939C4e666c2E03Cb95DD4"; const toAddress = "0x2C687bfF93677D69bd20808a36E4BC2999B4767C"; var coinbase; web3.eth.getCoinbase().then(function (address){ coinbase = address; console.log(address); }); const contract = new web3.eth.Contract(JSON.parse(abi), contractAddress, { from: coinbase , gas: 100000}); contract.methods.balanceOf('0x5c18a33DF2cc41a1bedDC91133b8422e89f041B7').call().then(console.log).catch(console.error); contract.methods.balanceOf('0x2C687bfF93677D69bd20808a36E4BC2999B4767C').call().then(console.log).catch(console.error); web3.eth.personal.unlockAccount(coinbase, "netkiller").then(console.log); contract.methods.transfer('0x2C687bfF93677D69bd20808a36E4BC2999B4767C', 100).send().then(console.log).catch(console.error); contract.methods.balanceOf('0x2C687bfF93677D69bd20808a36E4BC2999B4767C').call().then(console.log).catch(console.error);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论