狼爱上狸

我胡汉三又回来了

2019年5月16日 #

solc编译问题

1.安装solc
npm install -g solc
用IDEA编译sol时出现错误
solcjs.cmd --abi --bin CloudNoteService.sol -o C:\Users\Administrator\IdeaProjects\test
CloudNoteService.sol:1:1: ParserError: Source file requires different compiler version (current compiler is 0.5.10+commit.5a6ea5b1.Emscripten.clang - note that nightly builds are considered to be strictly less than the released version
pragma solidity ^0.4.22;
2.solcjs.cmd  --version//查看solc版本
0.5.10+commit.5a6ea5b1.Emscripten.clang
3.npm uninstall solc//卸载
4.npm install -g solc@0.4.24//安装solc0.4.24版本
5.C:\nodejs\node_modules\npm>solcjs.cmd --version//查看solc版本
0.4.24+commit.e67f0147.Emscripten.clang
6.solc跟web3一样,有版本的区别。

posted @ 2019-07-08 16:11 狼爱上狸 阅读(9) | 评论 (0)编辑 收藏

solidity官方开发文档

https://solidity-cn.readthedocs.io/zh/develop/

posted @ 2019-07-08 15:18 狼爱上狸 阅读(6) | 评论 (0)编辑 收藏

以太坊智能合约 —— 最佳安全开发指南

https://www.cnblogs.com/wanghui-garcia/p/9580573.html

posted @ 2019-07-07 15:57 狼爱上狸 阅读(10) | 评论 (0)编辑 收藏

IPFS + Ethereum(下篇):IPFS + Ethereum存储和获取图片

1. 项目描述

这篇文章通过truffle unbox react创建项目,安装ipfs-api,将图片存储到ipfs,将图片hash存储到Ethereum区块链,取数据时先从区块链读取图片hash,再通过hashipfs读取数据,解决了区块链大数据存储成本高昂的问题。

2. 效果图

3. 阅读本文需要掌握的知识

阅读本文需要将先学习上面的系列文章,由于本文前端使用了大量的React语法,所以建议学习一些React语法,还需要学习truffle framework

4. 源码

其实这篇文章的内容就是上面几篇文章的综合结合体,所以在这里我将不再对代码做过多的概述。

import React, {Component} from 'react' import SimpleStorageContract from '../build/contracts/SimpleStorage.json' import getWeb3 from './utils/getWeb3'  import './css/oswald.css' import './css/open-sans.css' import './css/pure-min.css' import './App.css'  const ipfsAPI = require('ipfs-api'); const ipfs = ipfsAPI({host: 'localhost', port: '5001', protocol: 'http'});  const contract = require('truffle-contract') const simpleStorage = contract(SimpleStorageContract) let account;  // Declaring this for later so we can chain functions on SimpleStorage. let contractInstance;  let saveImageOnIpfs = (reader) => {   return new Promise(function(resolve, reject) {     const buffer = Buffer.from(reader.result);     ipfs.add(buffer).then((response) => {       console.log(response)       resolve(response[0].hash);     }).catch((err) => {       console.error(err)       reject(err);     })   }) }  class App extends Component {   constructor(props) {     super(props)      this.state = {       blockChainHash: null,       web3: null,       address: null,       imgHash: null,       isWriteSuccess: false     }   }    componentWillMount() {      ipfs.swarm.peers(function(err, res) {       if (err) {         console.error(err);       } else {         // var numPeers = res.Peers === null ? 0 : res.Peers.length;         // console.log("IPFS - connected to " + numPeers + " peers");         console.log(res);       }     });      getWeb3.then(results => {       this.setState({web3: results.web3})        // Instantiate contract once web3 provided.       this.instantiateContract()     }).catch(() => {       console.log('Error finding web3.')     })   }    instantiateContract = () => {      simpleStorage.setProvider(this.state.web3.currentProvider);     this.state.web3.eth.getAccounts((error, accounts) => {       account = accounts[0];       simpleStorage.at('0x345ca3e014aaf5dca488057592ee47305d9b3e10').then((contract) => {         console.log(contract.address);         contractInstance = contract;         this.setState({address: contractInstance.address});         return;       });     })    }   render() {     return (<div className="App">       {         this.state.address           ? <h1>合约地址:{this.state.address}</h1>           : <div/>       }       <h2>上传图片到IPFS:</h2>       <div>         <label id="file">Choose file to upload</label>         <input type="file" ref="file" id="file" name="file" multiple="multiple"/>       </div>       <div>         <button onClick={() => {             var file = this.refs.file.files[0];             var reader = new FileReader();             // reader.readAsDataURL(file);             reader.readAsArrayBuffer(file)             reader.onloadend = function(e) {               console.log(reader);               saveImageOnIpfs(reader).then((hash) => {                 console.log(hash);                 this.setState({imgHash: hash})               });              }.bind(this);            }}>将图片上传到IPFS并返回图片HASH</button>       </div>       {         this.state.imgHash           ? <div>               <h2>imgHash:{this.state.imgHash}</h2>               <button onClick={() => {                   contractInstance.set(this.state.imgHash, {from: account}).then(() => {                     console.log('图片的hash已经写入到区块链!');                     this.setState({isWriteSuccess: true});                   })                 }}>将图片hash写到区块链:contractInstance.set(imgHash)</button>             </div>           : <div/>       }       {         this.state.isWriteSuccess           ? <div>               <h1>图片的hash已经写入到区块链!</h1>               <button onClick={() => {                   contractInstance.get({from: account}).then((data) => {                     console.log(data);                     this.setState({blockChainHash: data});                   })                 }}>从区块链读取图片hash:contractInstance.get()</button>             </div>           : <div/>       }       {         this.state.blockChainHash           ? <div>               <h3>从区块链读取到的hash值:{this.state.blockChainHash}</h3>             </div>           : <div/>       }       {         this.state.blockChainHash           ? <div>               <h2>浏览器访问:{"http://localhost:8080/ipfs/" + this.state.imgHash}</h2>               <img alt="" style={{                   width: 1600                 }} src={"http://localhost:8080/ipfs/" + this.state.imgHash}/>             </div>           : <img alt=""/>       }     </div>);   } }  export default App 

5. 源码修改

可以自己建立项目,也可以直接下载原博主的源码并进行修改。这里直接下载原博主的代码进行修改。

5.1 下载源码,安装依赖

$ git clone https://github.com/liyuechun/IPFS-Ethereum-Image.git $ cd IPFS-Ethereum-Image $ npm install 

5.2 查看源码端口

/Users/yuyang/IPFS-Ethereum-Image/src/utils/getWeb3.js

var provider = new Web3.providers.HttpProvider('http://127.0.0.1:9545') 

使用的端口是9545truffle develop 默认使用的端口就是9545,所以我们使用truffle develop作为测试私链。

5.3 启动私链

yuyangdeMacBook-Pro:IPFS-Ethereum-Image yuyang$ truffle develop Truffle Develop started at http://127.0.0.1:9545/  Accounts: (0) 0x627306090abab3a6e1400e9345bc60c78a8bef57 (1) 0xf17f52151ebef6c7334fad080c5704d77216b732 (2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef (3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544 (4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2 (5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e (6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5 (7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5 (8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc (9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de  Private Keys: (0) c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3 (1) ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f (2) 0dbbe8e4ae425a6d2687f1a7e3ba17bc98c673636790f1b8ad91193c05875ef1 (3) c88b703fb08cbea894b6aeff5a544fb92e78a18e19814cd85da83b71f772aa6c (4) 388c684f0ba1ef5017716adb5d21a053ea8e90277d0868337519f97bede61418 (5) 659cbb0e2411a44db63778987b1e22153c086a95eb6b18bdf89de078917abc63 (6) 82d052c865f5763aad42add438569276c00d3d88a2d062d36b2bae914d58b8c8 (7) aa3680d5d48a8283413f7a108367c7299ca73f553735860a87b08f39395618b7 (8) 0f62d96d6675f32685bbdb8ac13cda7c23436f63efbb9d07700d8669ff12b7c4 (9) 8d5366123cb560bb606379f90a0bfd4769eecc0557f1b362dcae9012b548b1e5  Mnemonic: candy maple cake sugar pudding cream honey rich smooth crumble sweet treat  ⚠️  Important ⚠️  : This mnemonic was created for you by Truffle. It is not secure. Ensure you do not use it on production blockchains, or else you risk losing funds. 

5.4 编译和部署合约

truffle(develop)> compile truffle(develop)> migrate 

5.5 获取合约地址

Using network 'develop'.  Running migration: 1_initial_migration.js   Deploying Migrations...   ... 0x130a37fb2d60e34cc04fccbfc51c10b988d61378090b89eb4546cce2a6ef3490   Migrations: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0 Saving successful migration to network...   ... 0xd7bc86d31bee32fa3988f1c1eabce403a1b5d570340a3a9cdba53a472ee8c956 Saving artifacts... Running migration: 2_deploy_contracts.js   Deploying SimpleStorage...   ... 0x8c51da613e7c0517e726926c18d535aed0d21c8f4c82668212a6cdfd193d21d8   SimpleStorage: 0x345ca3e014aaf5dca488057592ee47305d9b3e10 Saving successful migration to network...   ... 0xf36163615f41ef7ed8f4a8f192149a0bf633fe1a2398ce001bf44c43dc7bdda0 Saving artifacts... 

SimpleStorage合约地址为0x345ca3e014aaf5dca488057592ee47305d9b3e10。也可以从/Users/yuyang/IPFS-Ethereum-Image/build/contracts/SimpleStorage.json看到

"networks": {     "4447": {       "events": {},       "links": {},       "address": "0x345ca3e014aaf5dca488057592ee47305d9b3e10",       "transactionHash": "0x8c51da613e7c0517e726926c18d535aed0d21c8f4c82668212a6cdfd193d21d8"     }   }, 

5.6 修改App.js文件

/Users/yuyang/IPFS-Ethereum-Image/src/App.js

instantiateContract = () => {      simpleStorage.setProvider(this.state.web3.currentProvider);     this.state.web3.eth.getAccounts((error, accounts) => {       account = accounts[0];       simpleStorage.at('0x345ca3e014aaf5dca488057592ee47305d9b3e10').then((contract) => {         console.log(contract.address);         contractInstance = contract;         this.setState({address: contractInstance.address});         return;       });     })   } 

将其中的0x345ca3e014aaf5dca488057592ee47305d9b3e10合约地址替换为你的合约地址。

6. 启动程序

新开命令行启动IPFS节点

yuyangdeMacBook-Pro:~ yuyang$ ipfs daemon 

新开命令行启动程序

yuyangdeMacBook-Pro:~ yuyang$ npm start 

7. 配置MetaMask插件和准备以太坊账号

程序启动后,会自动打开浏览器。注意,因为MetaMask插件只支持Chrome浏览器和FireFox浏览器,所以你需要运行保持页面运行在这两种浏览器上。关于MetaMask插件这部分内容,请查看这篇文章

因为我们的私链是部署在http://127.0.0.1:9545上的,所以你需要让MetaMask插件的端口也指向http://127.0.0.1:9545。点击Custom RPC进行配置后,切换端口为http://127.0.0.1:9545

因为需要向区块写入数据,需要花费gas,如果你的当前Account中没有以太币,可以导入其他的Account。点击右上角头像图标。

点击Import Account

需要输入私钥。在我们输入truffle develop启动私链的时候,已经分配给了我们十个Account地址和对应的私钥,任一账号都有100以太币,随便选择一个私钥填入。

Accounts: (0) 0x627306090abab3a6e1400e9345bc60c78a8bef57 (1) 0xf17f52151ebef6c7334fad080c5704d77216b732 (2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef (3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544 (4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2 (5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e (6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5 (7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5 (8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc (9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de  Private Keys: (0) c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3 (1) ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f (2) 0dbbe8e4ae425a6d2687f1a7e3ba17bc98c673636790f1b8ad91193c05875ef1 (3) c88b703fb08cbea894b6aeff5a544fb92e78a18e19814cd85da83b71f772aa6c (4) 388c684f0ba1ef5017716adb5d21a053ea8e90277d0868337519f97bede61418 (5) 659cbb0e2411a44db63778987b1e22153c086a95eb6b18bdf89de078917abc63 (6) 82d052c865f5763aad42add438569276c00d3d88a2d062d36b2bae914d58b8c8 (7) aa3680d5d48a8283413f7a108367c7299ca73f553735860a87b08f39395618b7 (8) 0f62d96d6675f32685bbdb8ac13cda7c23436f63efbb9d07700d8669ff12b7c4 (9) 8d5366123cb560bb606379f90a0bfd4769eecc0557f1b362dcae9012b548b1e5 

8. 运行程序

  1. 页面会显示当前合约的地址0x345ca3e014aaf5dca488057592ee47305d9b3e10

  2. 选择一张图片

  3. 点击上传到IPFS,并获取到图片hashQmSLnchQXh9gJrDKvQ5UFLZAj5f7icb2yWsWmcUKUYY3gj

  4. 点击将图片hash值保存到区块链,弹出MetaMask插件进行写入合约的确认

  5. 从区块链获取图片hashQmSLnchQXh9gJrDKvQ5UFLZAj5f7icb2yWsWmcUKUYY3gj

  6. 根据图片hash值,从IPFS进行访问

参考:【IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (下篇)-ipfs + Ethereum 大图片存储
作者:黎跃春



作者:yuyangray
链接:https://www.jianshu.com/p/3cb9520a23c0
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

posted @ 2019-07-07 15:04 狼爱上狸| 编辑 收藏

IPFS + Ethereum(上篇):JS+IPFS-API存储和获取数据

1. 内容简介

这篇文章将为大家讲解js-ipfs-api的简单使用,如何将数据上传到IPFS,以及如何从IPFS通过HASH读取数据。

2. IPFS-HTTP效果图

3. 实现步骤

3.1 安装create-react-app

参考文档:https://reactjs.org/tutorial/tutorial.html

yuyangdeMacBook-Pro:~ yuyang$ npm install -g create-react-app /Users/yuyang/.nvm/versions/node/v8.9.4/bin/create-react-app -> /Users/yuyang/.nvm/versions/node/v8.9.4/lib/node_modules/create-react-app/index.js + create-react-app@1.5.2 added 67 packages in 14.512s 

3.2 React项目创建

yuyangdeMacBook-Pro:~ yuyang$ create-react-app ipfs-http-demo  Creating a new React app in /Users/yuyang/ipfs-http-demo.  Installing packages. This might take a couple of minutes. Installing react, react-dom, and react-scripts...  ... ...   Success! Created ipfs-http-demo at /Users/yuyang/ipfs-http-demo Inside that directory, you can run several commands:    yarn start     Starts the development server.    yarn build     Bundles the app into static files for production.    yarn test     Starts the test runner.    yarn eject     Removes this tool and copies build dependencies, configuration files     and scripts into the app directory. If you do this, you can’t go back!  We suggest that you begin by typing:    cd ipfs-http-demo   yarn start  Happy hacking! 

3.3 运行React项目

yuyangdeMacBook-Pro:ipfs-http-demo yuyang$ npm start 
Compiled successfully!  You can now view ipfs-http-demo in the browser.    Local:            http://localhost:3000/   On Your Network:  http://192.168.0.4:3000/  Note that the development build is not optimized. To create a production build, use yarn build. 

3.4 浏览项目

浏览器会自动打开:http://localhost:3000/

效果如下:

3.5 安装ipfs-api

https://www.npmjs.com/package/ipfs-api

项目结构

安装ipfs-api

切换到项目根目录,安装ipfs-api

yuyangdeMacBook-Pro:ipfs-http-demo yuyang$ npm install --save ipfs-api  

ipfs-api安装完后,如上图所示,接下来刷新一下浏览器,看看项目是否有问题,正常来讲,一切会正常。

3.6 完成UI逻辑

拷贝下面的代码,将src/App.js里面的代码直接替换掉。

import React, { Component } from 'react'; import './App.css';  class App extends Component {         constructor(props) {           super(props);           this.state = {             strHash: null,             strContent: null           }       }      render() {       return (         <div className="App">           <input             ref="ipfsContent"            />           <button onClick={() => {             let ipfsContent = this.refs.ipfsContent.value;             console.log(ipfsContent);           }}>提交到IPFS</button>            <p>{this.state.strHash}</p>            <button onClick={() => {             console.log('从ipfs读取数据。')            }}>读取数据</button>            <h1>{this.state.strContent}</h1>         </div>       );     } }  export default App; 

上面的代码完成的工作是,当我们在输入框中输入一个字符串时,点击提交到IPFS按钮,将文本框中的内容取出来打印,后续我们需要将这个数据上传到IPFS。点击读取数据按钮,我们也只是随便打印了一个字符串,后面需要从IPFS读取数据,然后将读取的数据存储到状态机变量strContent中并且展示出来。

现在刷新网页,输入内容,点击提交到IPFS,Console打印出输入的内容。点击读取数据,Console打印出从ipfs读取数据。

3.7 导入IPFS

const ipfsAPI = require('ipfs-api'); const ipfs = ipfsAPI({host: 'localhost', port: '5001', protocol: 'http'}); 

3.8 编写上传大文本字符串到IPFS的Promise函数

saveTextBlobOnIpfs = (blob) => {     return new Promise(function(resolve, reject) {       const descBuffer = Buffer.from(blob, 'utf-8');       ipfs.add(descBuffer).then((response) => {         console.log(response)         resolve(response[0].hash);       }).catch((err) => {         console.error(err)         reject(err);       })     })   } 

response[0].hash返回的是数据上传到IPFS后返回的HASH字符串。

3.9 上传数据到IPFS

this.saveTextBlobOnIpfs(ipfsContent).then((hash) => {     console.log(hash);     this.setState({strHash: hash}); }); 

ipfsContent是从文本框中取到的数据,调用this.saveTextBlobOnIpfs方法将数据上传后,会返回字符串hash,并且将hash存储到状态机变量strHash中。

目前完整的代码:

import React, {Component} from 'react'; import './App.css';  const ipfsAPI = require('ipfs-api'); const ipfs = ipfsAPI({host: 'localhost', port: '5001', protocol: 'http'});  class App extends Component {    constructor(props) {     super(props);     this.state = {       strHash: null,       strContent: null     }   }    saveTextBlobOnIpfs = (blob) => {     return new Promise(function(resolve, reject) {       const descBuffer = Buffer.from(blob, 'utf-8');       ipfs.add(descBuffer).then((response) => {         console.log(response)         resolve(response[0].hash);       }).catch((err) => {         console.error(err)         reject(err);       })     })   }    render() {     return (<div className="App">       <input ref="ipfsContent" />       <button onClick={() => {           let ipfsContent = this.refs.ipfsContent.value;           console.log(ipfsContent);           this.saveTextBlobOnIpfs(ipfsContent).then((hash) => {             console.log(hash);             this.setState({strHash: hash});           });         }}>提交到IPFS</button>        <p>{this.state.strHash}</p>        <button onClick={() => {           console.log('从ipfs读取数据。')         }}>读取数据</button>       <h1>{this.state.strContent}</h1>     </div>);   } }  export default App; 

3.10 跨域资源共享CORS配置

跨域资源共享( CORS )配置,依次在终端执行下面的代码:

yuyangdeMacBook-Pro:ipfs-http-demo yuyang$ ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST", "OPTIONS"]'  yuyangdeMacBook-Pro:ipfs-http-demo yuyang$ ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'  yuyangdeMacBook-Pro:ipfs-http-demo yuyang$ ipfs config --json API.HTTPHeaders.Access-Control-Allow-Credentials '["true"]'  yuyangdeMacBook-Pro:ipfs-http-demo yuyang$ ipfs config --json API.HTTPHeaders.Access-Control-Allow-Headers '["Authorization"]'  yuyangdeMacBook-Pro:ipfs-http-demo yuyang$ ipfs config --json API.HTTPHeaders.Access-Control-Expose-Headers '["Location"]' 

用正确的端口运行daemon:

yuyangdeMacBook-Pro:ipfs-http-demo yuyang$ ipfs config Addresses.API /ip4/127.0.0.1/tcp/5001 yuyangdeMacBook-Pro:ipfs-http-demo yuyang$ ipfs config Addresses.API /ip4/127.0.0.1/tcp/5001 yuyangdeMacBook-Pro:ipfs-http-demo yuyang$ ipfs daemon 

3.11 刷新网页提交数据并在线查看数据

上传数据,并且查看返回hash值

在线查看上传到IPFS的数据

http://ipfs.io/ipfs/QmejvEPop4D7YUadeGqYWmZxHhLc4JBUCzJJHWMzdcMe2y

3.12 从IPFS读取数据

ipfs.cat(this.state.strHash).then((stream) => {     console.log(stream);     let strContent = Utf8ArrayToStr(stream);     console.log(strContent);     this.setState({strContent: strContent}); }); 

streamUint8Array类型的数据,下面的方法是将Uint8Array转换为string字符串。

Utf8ArrayToStr

function Utf8ArrayToStr(array) {     var out, i, len, c;     var char2, char3;      out = "";     len = array.length;     i = 0;     while(i < len) {     c = array[i++];     switch(c >> 4)       {         case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:           // 0xxxxxxx           out += String.fromCharCode(c);           break;         case 12: case 13:           // 110x xxxx   10xx xxxx           char2 = array[i++];           out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));           break;         case 14:           // 1110 xxxx  10xx xxxx  10xx xxxx           char2 = array[i++];           char3 = array[i++];           out += String.fromCharCode(((c & 0x0F) << 12) |                          ((char2 & 0x3F) << 6) |                          ((char3 & 0x3F) << 0));           break;         default:           break;       }     }      return out; } 

完整源码

import React, {Component} from 'react'; import './App.css';  const ipfsAPI = require('ipfs-api'); const ipfs = ipfsAPI({host: 'localhost', port: '5001', protocol: 'http'});  function Utf8ArrayToStr(array) {   var out,     I,     len,     c;   var char2,     char3;    out = "";   len = array.length;   i = 0;   while (i < len) {     c = array[i++];     switch (c >> 4) {       case 0:       case 1:       case 2:       case 3:       case 4:       case 5:       case 6:       case 7:         // 0xxxxxxx         out += String.fromCharCode(c);         break;       case 12:       case 13:         // 110x xxxx   10xx xxxx         char2 = array[i++];         out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));         break;       case 14:         // 1110 xxxx  10xx xxxx  10xx xxxx         char2 = array[i++];         char3 = array[i++];         out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));         break;       default:         break;     }   }    return out; }  class App extends Component {    constructor(props) {     super(props);     this.state = {       strHash: null,       strContent: null     }   }    saveTextBlobOnIpfs = (blob) => {     return new Promise(function(resolve, reject) {       const descBuffer = Buffer.from(blob, 'utf-8');       ipfs.add(descBuffer).then((response) => {         console.log(response)         resolve(response[0].hash);       }).catch((err) => {         console.error(err)         reject(err);       })     })   }    render() {     return (<div className="App">       <input ref="ipfsContent" />       <button onClick={() => {           let ipfsContent = this.refs.ipfsContent.value;           console.log(ipfsContent);           this.saveTextBlobOnIpfs(ipfsContent).then((hash) => {             console.log(hash);             this.setState({strHash: hash});           });         }}>提交到IPFS</button>        <p>{this.state.strHash}</p>        <button onClick={() => {           console.log('从ipfs读取数据。')           ipfs.cat(this.state.strHash).then((stream) => {             console.log(stream);             let strContent = Utf8ArrayToStr(stream);             console.log(strContent);             this.setState({strContent: strContent});           });         }}>读取数据</button>       <h1>{this.state.strContent}</h1>     </div>);   } }  export default App; 

4. 总结

这篇文章主要讲解如何配置React环境,如何创建React项目,如何安装js-ipfs-api,如何上传数据,如何设置开发环境,如何下载数据等等内容。通过这篇文章的系统学习,你会掌握js-ipfs-api在项目中的使用流程。



作者:yuyangray
链接:https://www.jianshu.com/p/48218aa9d724
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

posted @ 2019-07-07 15:03 狼爱上狸| 编辑 收藏

IPFS + Ethereum(中篇):图片存储到IPFS以及获取

1. 项目效果图

2. 创建React项目

yuyangdeMacBook-Pro:~ yuyang$ create-react-app ipfs_img 

3. 完成UI逻辑

将下面的代码拷贝替换掉App.js里面的代码。

import React, {Component} from 'react'  class App extends Component {   constructor(props) {     super(props)      this.state = {       imgSrc: null     }   }     render() {     return (<div className="App">        <h2>上传图片到IPFS:</h2>       <div>         <label id="file">Choose file to upload</label>         <input type="file" ref="file" id="file" name="file" multiple="multiple"/>       </div>       <div>         <button onClick={() => {             var file = this.refs.file.files[0];             var reader = new FileReader();             // reader.readAsDataURL(file);             reader.readAsArrayBuffer(file)             reader.onloadend = (e) => {               console.log(reader);             }            }}>Submit</button>       </div>       {         this.state.imgSrc             <div>               <h2>{"http://localhost:8080/ipfs/" + this.state.imgSrc}</h2>               <img alt="区块链部落" style= src={"http://localhost:8080/ipfs/" + this.state.imgSrc}/>             </div>           : <img alt=""/>       }     </div>);   } }  export default App 

4. 安装ipfs-api

yuyangdeMacBook-Pro:ipfs_img yuyang$ npm install --save ipfs-api 

5. App.js导入IPFS

const ipfsAPI = require('ipfs-api'); const ipfs = ipfsAPI({host: 'localhost', port: '5001', protocol: 'http'}); 

6. 实现上传图片到IPFS的Promise函数

let saveImageOnIpfs = (reader) => {   return new Promise(function(resolve, reject) {     const buffer = Buffer.from(reader.result);     ipfs.add(buffer).then((response) => {       console.log(response)       resolve(response[0].hash);     }).catch((err) => {       console.error(err)       reject(err);     })   }) } 

7. 上传图片到IPFS

var file = this.refs.file.files[0]; var reader = new FileReader(); // reader.readAsDataURL(file); reader.readAsArrayBuffer(file) reader.onloadend = function(e) {   console.log(reader);   saveImageOnIpfs(reader).then((hash) => {     console.log(hash);     this.setState({imgSrc: hash})   }); 
  • reader.readAsDataURL(file);上传图片路径。

  • reader.readAsArrayBuffer(file);上传图片内容。

上传图片

saveImageOnIpfs(reader).then((hash) => {     console.log(hash);     this.setState({imgSrc: hash})   }); 

hash即是上传到IPFS的图片的HASH地址,this.setState({imgSrc: hash})hash保存到状态机变量imgSrc中。

8. 完整代码

import React, {Component} from 'react'  const ipfsAPI = require('ipfs-api'); const ipfs = ipfsAPI({host: 'localhost', port: '5001', protocol: 'http'});  let saveImageOnIpfs = (reader) => {   return new Promise(function(resolve, reject) {     const buffer = Buffer.from(reader.result);     ipfs.add(buffer).then((response) => {       console.log(response)       resolve(response[0].hash);     }).catch((err) => {       console.error(err)       reject(err);     })   }) }  class App extends Component {   constructor(props) {     super(props)      this.state = {       imgSrc: null     }   }    render() {     return (       <div className="App">        <h2>上传图片到IPFS:</h2>       <div>         <label id="file">Choose file to upload</label>         <input type="file" ref="file" id="file" name="file" multiple="multiple"/>       </div>       <div>         <button onClick={() => {             var file = this.refs.file.files[0];             var reader = new FileReader();             // reader.readAsDataURL(file);             reader.readAsArrayBuffer(file)             reader.onloadend = (e) => {               console.log(reader);               saveImageOnIpfs(reader).then((hash) => {                 console.log(hash);                 this.setState({imgSrc: hash})               });             }            }}>Submit</button>       </div>       {         this.state.imgSrc             ?<div>               <h2>{"http://localhost:8080/ipfs/" + this.state.imgSrc}</h2>               <img alt="区块链部落" src={"http://localhost:8080/ipfs/" + this.state.imgSrc} />             </div>             :<img alt=""/>       }     </div>);   } }  export default App 

参考:【IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (中篇)-js-ipfs-api - 图片上传到IPFS以及下载

作者:黎跃春



作者:yuyangray
链接:https://www.jianshu.com/p/db2676952c48
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

posted @ 2019-07-07 15:01 狼爱上狸| 编辑 收藏

Ropsten申请测试币

http://faucet.ropsten.be:3001/上申请,只需要输入你在Ropsten网络上的账户地址就行,转币操作非常迅速,目前一次可申请1ETH,24小时后可再次申请;

posted @ 2019-07-05 21:59 狼爱上狸 阅读(10) | 评论 (0)编辑 收藏

校外访问

     摘要: 数字资源校外访问锦囊,拿走不谢! ...  阅读全文

posted @ 2019-07-05 11:17 狼爱上狸| 编辑 收藏

web3.eth.abi

1.web3的1.0以下版本不支持web3.eth.abi
2.var ethabi = require('web3-eth-abi');这种引用也有问题。
3.升级web3到1.0以上版本后测试通过:
var Web3 = require('web3');
var web3 = new Web3();

console.log(web3.eth.abi.encodeFunctionSignature('myMethod(uint256,string)'))

posted @ 2019-06-29 19:07 狼爱上狸 阅读(9) | 评论 (0)编辑 收藏

删除无用的系统服务项

方法: 在注册表中删除

运行regedit, 找到
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services 中想要删除的服务。

 

重启电脑可以看到你所选定的服务项在服务列表中不存在了

posted @ 2019-06-29 11:41 狼爱上狸 阅读(11) | 评论 (0)编辑 收藏

infura的使用

https://chaindesk.cn/witbook/1/12

posted @ 2019-06-27 22:45 狼爱上狸 阅读(12) | 评论 (0)编辑 收藏

sol在线测试

https://ethereum.github.io/browser-solidity/

posted @ 2019-06-27 21:00 狼爱上狸 阅读(16) | 评论 (0)编辑 收藏

ipfs和eth结合的例子

https://github.com/tooploox/ipfs-eth-database

posted @ 2019-06-26 08:21 狼爱上狸 阅读(13) | 评论 (0)编辑 收藏

第十一课 从宠物商店案例看DAPP架构和WEB3.JS交互接口

https://www.jianshu.com/p/47174718960b

posted @ 2019-06-25 11:05 狼爱上狸 阅读(13) | 评论 (0)编辑 收藏

truffle里的solc版本与实际solc版本冲突的问题

1.因为solc@0.5.1出现调用简单运算合约出现返回0的问题,所以把solc降到了0.4.22。
2.安装truffle后,npm install -g truffle,版本有所不同:
PS C:\> truffle version
Truffle v5.0.24 (core: 5.0.24)
Solidity v0.5.0 (solc-js)
Node v10.16.0
Web3.js v1.0.0-beta.37
3.建立简单合约Greeter.sol后,利用truffle compile后,出现:
Error: CompileError: ParsedContract.sol:1:1: ParserError: Source file requires different compiler version (current compiler is 0.5.8+commit.23d335f2.Emscripten.clang - note that nightly builds are considered to be strictly less than the released version
pragma solidity ^0.4.24;
^----------------------^

Compilation failed. See above.
4.修改truffle-config.js文件:
module.exports = {
// Uncommenting the defaults below
// provides for an easier quick-start with Ganache.
// You can also follow this format for other networks;
// see <http://truffleframework.com/docs/advanced/configuration>
// for more details on how to specify configuration options!
/*
networks: {
development: {
host: "127.0.0.1",
port: 7545,
network_id: "*"
},
test: {
host: "127.0.0.1",
port: 7545,
network_id: "*"
}
}
*/
compilers: {
solc: {
version: "0.4.24"
}
}
};
5.再次编译,出现
/C/users/administrator/webstormprojects/testtruffle/contracts/Migrations.sol:1:1: SyntaxError: Source file requires different compiler version (current compiler is 0.4.24+commit.e67f0147.Emscripten.clang - note that nightly builds are considered to be strictly less than the released version
pragma solidity >=0.4.25 <0.6.0;
^------------------------------^
6.打开Migrations.sol文件,
把pragma solidity >=0.4.25 <0.6.0;
修改为:pragma solidity >=0.4.24 <0.6.0;
编译通过。

posted @ 2019-06-25 09:05 狼爱上狸 阅读(27) | 评论 (0)编辑 收藏

ipfs + 以太坊实例解析

本文章的项目基于春哥的博客教程
【IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (下篇)-ipfs + Ethereum 大图片存储

我个人只是作为记录学习心得所借鉴
项目流程

首先调用代码创建truffle项目

    truffle unbox react

其次,要引入ipfs的api,用作图片存储的相关功能,我们是将图片存储到ipfs当中,而将所获得图片的hash区块链之中,区块链大数据成本的问题

    npm install –save ipfs-api

安装完毕调用complie编译合约代码,,以便使用web3调用合约存储区块链

    compile

替换合约地址,这个需要将合约在以太坊部署并取得对应地址
然后运行ipfs节点

    ipfs daemon

启动项目

    npm start

就可以看到项目成功
代码解读分析

import React, {Component} from 'react'
import SimpleStorageContract from '../build/contracts/SimpleStorage.json'
import getWeb3 from './utils/getWeb3'

import './css/oswald.css'
import './css/open-sans.css'
import './css/pure-min.css'
import './App.css'

const ipfsAPI = require('ipfs-api');
const ipfs = ipfsAPI({host: 'localhost', port: '5001', protocol: 'http'});

const contract = require('truffle-contract')
const simpleStorage = contract(SimpleStorageContract)
let account;

/** Declaring this for later so we can chain functions on SimpleStorage.**/
let contractInstance;
//ipfs保存图片方法//
let saveImageOnIpfs = (reader) => {
  return new Promise(function(resolve, reject) {
    const buffer = Buffer.from(reader.result);
    ipfs.add(buffer).then((response) => {
      console.log(response)
      resolve(response[0].hash);
    }).catch((err) => {
      console.error(err)
      reject(err);
    })
  })
}

//创建构造函数,添加状态机变量//

class App extends Component {
  constructor(props) {
    super(props)

    this.state = {
      blockChainHash: null,
      web3: null,
      address: null,
      imgHash: null,
      isWriteSuccess: false
    }
  }
//程序启动默认调用方法//
  componentWillMount() {
    //打印项目中网络节点//
    ipfs.swarm.peers(function(err, res) {
      if (err) {
        console.error(err);
      } else {
        /** var numPeers = res.Peers === null ? 0 : res.Peers.length;**/
        /** console.log("IPFS - connected to " + numPeers + " peers");**/
        console.log(res);
      }
    });
    //web3设置,同时调用初始化方法//
    getWeb3.then(results => {
      this.setState({web3: results.web3})

      // Instantiate contract once web3 provided.
      this.instantiateContract()
    }).catch(() => {
      console.log('Error finding web3.')
    })
  }
    //初始化合约实例、web3获取合约账号以及合约实例//
  instantiateContract = () => {

    simpleStorage.setProvider(this.state.web3.currentProvider);
    this.state.web3.eth.getAccounts((error, accounts) => {
      account = accounts[0];
      simpleStorage.at('0xf6a7e96860f05f21ecb4eb588fe8a8a83981af03').then((contract) => {
        console.log(contract.address);
        contractInstance = contract;
        this.setState({address: contractInstance.address});
        return;
      });
    })

  }
  render() {
    return (<div className="App">
      {
        this.state.address
          ? <h1>合约地址:{this.state.address}</h1>
          : <div/>
      }
      <h2>上传图片到IPFS:</h2>
      /**这一部分用于上传文件到ipfs**/
      <div>
        <label id="file">Choose file to upload</label>
        <input type="file" ref="file" id="file" name="file" multiple="multiple"/>
      </div>
      <div>
        <button onClick={() => {
            var file = this.refs.file.files[0];
            var reader = new FileReader();
            // reader.readAsDataURL(file);
            reader.readAsArrayBuffer(file)
            reader.onloadend = function(e) {
              console.log(reader);
              saveImageOnIpfs(reader).then((hash) => {
                console.log(hash);
                this.setState({imgHash: hash})
              });

            }.bind(this);

          }}>将图片上传到IPFS并返回图片HASH</button>
      </div>
       /**这一部分用于上传hash到区块链**/
      {
        this.state.imgHash
          ? <div>
              <h2>imgHash:{this.state.imgHash}</h2>
              <button onClick={() => {
                  contractInstance.set(this.state.imgHash, {from: account}).then(() => {
                    console.log('图片的hash已经写入到区块链!');
                    this.setState({isWriteSuccess: true});
                  })
                }}>将图片hash写到区块链:contractInstance.set(imgHash)</button>
            </div>
          : <div/>
      }
      {
        this.state.isWriteSuccess
          ? <div>
              <h1>图片的hash已经写入到区块链!</h1>
              <button onClick={() => {
                  contractInstance.get({from: account}).then((data) => {
                    console.log(data);
                    this.setState({blockChainHash: data});
                  })
                }}>从区块链读取图片hash:contractInstance.get()</button>
            </div>
          : <div/>
      }
      {
        this.state.blockChainHash
          ? <div>
              <h3>从区块链读取到的hash值:{this.state.blockChainHash}</h3>
            </div>
          : <div/>
      }
      {
        this.state.blockChainHash
          ? <div>
              <h2>浏览器访问:{"http://localhost:8080/ipfs/" + this.state.imgHash}</h2>
              <img alt="" style={{width:200}} src={"http://localhost:8080/ipfs/" + this.state.imgHash}/>
            </div>
          : <img alt=""/>
      }
    </div>);
  }
}

export default App



该项目算是truffle和ipfs结合以太坊一起使用的综合案例,用与梳理知识点
---------------------
作者:czZ__czZ
来源:CSDN
原文:https://blog.csdn.net/czZ__czZ/article/details/79036567
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-06-25 08:21 狼爱上狸 阅读(13) | 评论 (0)编辑 收藏

nodejs-执行报错Error: Cannot find module 'express'

  1. C:\Users\0>node E:\项目\2018年\11月份\nodejs\express_demo.js
  2. module.js:471
  3. throw err;
  4. ^
  5. Error: Cannot find module 'express'
  6. at Function.Module._resolveFilename (module.js:469:15)
  7. at Function.Module._load (module.js:417:25)
  8. at Module.require (module.js:497:17)
  9. at require (internal/module.js:20:19)
  10. at Object.<anonymous> (E:\项目\2018年\11月份\nodejs\express_demo.js:1:77)
  11. at Module._compile (module.js:570:32)
  12. at Object.Module._extensions..js (module.js:579:10)
  13. at Module.load (module.js:487:32)
  14. at tryModuleLoad (module.js:446:12)
  15. at Function.Module._load (module.js:438:3)
  16. C:\Users\0>express --version
  17. 4.16.0

实际上我是有安装express模块的

奇了个怪了。

然后试过1种方法是进入项目目录再执行安装express模块,无效

最后,原来是node_modules没有配置环境变量

配置上吧:

1、控制面板\所有控制面板项\系统\高级系统设置\环境变量

新建设‘NODE_PATH’:C:\Users\0\AppData\Roaming\npm\node_modules

 编辑增加环境变量‘PATH’

完美~~


http://www.pianshen.com/article/837378161/


posted @ 2019-06-23 22:31 狼爱上狸 阅读(12) | 评论 (0)编辑 收藏

调用智能合约简单运算总返回0的问题

1.合约内容
pragma
solidity ^0.5.9;

contract hello {

function mutiply(uint a) public pure returns (uint result) {

return a*3;

}
}
2.部署合约:
var Web3 = require("web3");
var fs = require("fs");
var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
var code = '0x' + fs.readFileSync("2_sol_hello.bin").toString();
var abi = JSON.parse(fs.readFileSync("2_sol_hello.abi").toString());
var contract = web3.eth.contract(abi);
console.log(web3.eth.accounts);
console.log('account balance:' + web3.eth.getBalance(web3.eth.accounts[0]))

web3.personal.unlockAccount(web3.eth.accounts[0],"123")
var contract = contract.new({from: web3.eth.accounts[0], data: code, gas: 470000},
function(e, contract){

if(!contract.address) {
console.log("已经发起交易,交易地址:" + contract.transactionHash + "\n正在等待挖矿");
} else {
console.log("智能合约部署成功,地址:" + contract.address);

}

}
)
3.调用合约
var Web3 = require("web3");
var fs = require("fs");
var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
var abi = JSON.parse(fs.readFileSync("2_sol_hello.abi").toString());
var contract = web3.eth.contract(abi);
var instance = contract.at('0xb06846c54c6ae67102ed67ce57a357a643d1f1b8')
web3.personal.unlockAccount(web3.eth.accounts[0],"123")
console.log(instance.mutiply(12).toString())
4.显示结果为:
0
原因:solc版本0.5.9太高,可能调用的方法不对。
解决方法:npm install -g solc@0.4.22
降低版本,然后把合约第一行改为:
pragma solidity ^0.4.22;
问题解决。

posted @ 2019-06-23 18:12 狼爱上狸 阅读(14) | 评论 (0)编辑 收藏

以太坊(二)MAC搭建以太坊私有链多节点集群(同一台电脑)

https://www.jianshu.com/p/52e9588116ad

posted @ 2019-06-20 14:47 狼爱上狸 阅读(10) | 评论 (0)编辑 收藏

web3.php Error: The method personal_newAccount does not exist/is not available

很多人遇到这个问题:

web3.php Error: The method personal_newAccount does not exist/is not available。

其实很简单,我们只需要在geth启动时的rpc参数中设置rpcapi时包括 "personal" 即可。

geth --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpcapi eth,web3,admin,personal,net


来自:http://www.bcfans.com/toutiao/redian/101819.html


我的是:
geth --identity "Water" --rpc --rpcport "8080" --rpccorsdomain "*" --datadir gethdata --port "30303" --nodiscover --rpcapi "db,eth,net,personal,web3" --networkid 1999 init genesis.json

posted @ 2019-06-19 10:42 狼爱上狸 阅读(16) | 评论 (0)编辑 收藏

windows安装web3

1.安装web3要先安装node。
2.cmd->powershell
3.c:\>node
  >require('web3')
结果输出一些错误,表明还没安装web3。
4.c:\>npm install web3
5.安装后,再
 c:\>node
  >require('web3')
输出
[Function:Web3]
表明web3就安装好了。

posted @ 2019-06-17 14:26 狼爱上狸 阅读(22) | 评论 (1)编辑 收藏

本地自动化编译、部署和调用智能合约

https://blog.csdn.net/qiubingcsdn/article/details/89703128

posted @ 2019-06-15 23:05 狼爱上狸 阅读(17) | 评论 (0)编辑 收藏

本地搭建以太坊私有网络-基于Ganache和MetaMask

    背景介绍

本文主要介绍如何使用Ganache,在本地搭建以太坊私有网络,并进行简单的测试。

 

    所需软件

      Ganache

Ganache用于搭建私有网络。在开发和测试环境下,Ganache提供了非常简便的以太坊私有网络搭建方法,通过可视化界面可以直观地设置各种参数、浏览查看账户和交易等数据。

下载地址为:https://truffleframework.com/ganache/

        MetaMask

MetaMask用于测试私有网络。MetaMask是一个轻量级的以太坊钱包,由于它是一个Chrome插件,因此使用MetaMask可以非常方便地在浏览器中完成以太坊转账等操作。

下载地址为:https://www.metamask.io

 

    操作步骤

     安装、启动Ganache

1. 使用安装包安装即可。

2. 打开程序后,会显示以下界面,用户可以查看账户(默认创建10个账户)、区块、交易和日志。

 

3. 点击“设置”,如下图所示,用户还可以设置绑定的ip和端口(设置为8545即可,稍后MetaMask会用这个端口)、账户数量以及gas限制等,点击“restart”后设置生效。

 

此时,Ganache已经在本机运行了一个以太坊私有网络,并绑定了8545端口。

 

    安装、启动MetaMask

1. 把插件添加到chrome扩展程序即可

2. 点击Chrome中的MetaMask图标,按照每一步提示启动MetaMask

3. 如下图所示,设置MetaMask连接到本地的以太坊私有网络

    

此时,MetaMask就可以和本地的以太坊私有网络进行交互了。

 

    用MetaMask测试私有网络

1. 从Ganache创建的账户中选择一个导入到MetaMask中

    a. 在Ganache账户页面选定一个账户,点击最右边的小钥匙图标,复制其私钥(private key)

    b. 在MetaMask中点击头像,选择 “import account”,弹出对话框

    c.  把复制的账户私钥填入文本框中,并点击“import”

 

此时,MetaMask就可以操作这个新账户了。

 

2. 用新导入的账户进行转账

    a. 点击“send”按钮,弹出转账对话框

    b. 从Ganache账户页面中,再选定一个其他的账户,复制其地址

    c. 把复制的地址填入到 “to” 文本框中,并在“amount”文本框中填入一个数值,表示要转账的金额(如 “10”);其它文本框默认值即可

    d. 点击next,弹出转账确认框,点击“confirm”确认交易

    e. 提醒转账成功后,可以看到账户余额发生了变化,此时再转到Ganache账户页面,也可看到两个账户的余额也都发生了变化。

 

    注意

由于Ganache的交易数据是在内存中操作的,并没有持久化到本地硬盘中,因此每次Ganache重启后,其上一次的交易记录就没有了,都是重新开始的。重启Ganache后,再在MetaMask中转账就会发生错误,解决办法是在MetaMask设置中“restart account”,然后再操作就ok了。

如果想保留Ganache每一次运行时的交易数据,以便下一次继续使用,可以使用命令行的形式ganache-cli启动Ganache,并指定数据存储目录
---------------------
作者:BigCuttie
来源:CSDN
原文:https://blog.csdn.net/starleelzx/article/details/82943530
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-06-13 22:51 狼爱上狸 阅读(18) | 评论 (0)编辑 收藏

webstrom下载安装

1.https://www.jetbrains.com/webstorm/download/ 下载2019.1.3版

2.在网盘开发软件下载JetbrainsCrack3.4.jar、汉化包和激活码软件。
3.将解压的.jar 破解补丁放在你的安装idea下面的bin的目录下面。如C:\JetBrains\WebStorm\bin
4.在安装的idea下面的bin目录下面有2个文件 : 一个是webstorm.exe.vmoptions,还有一个是webstorm64.exe.vmoptions。用记事本打开 分别在最下面一行增加一行:
-javaagent:C:\JetBrains\WebStorm\bin\JetbrainsCrack3.4.jar
5.重启一下软件,在进入出现有active code选择界面的时候,打开激活码.txt文件,输入即可,能够进入应用界面则表示安装破解成功

posted @ 2019-06-11 10:04 狼爱上狸 阅读(15) | 评论 (0)编辑 收藏

安装intelliJ IDEA2018.3

1.https://www.jetbrains.com/idea/download/previous.html 下载2018.3.6版本;

2.在网盘开发软件下载JetbrainsCrack_jb51.rar软件,里面包含了JetbrainsCrack-4.2-release-enc.jar文件。
3.将解压的.jar 破解补丁放在你的安装idea下面的bin的目录下面。如C:\JetBrains\IntelliJ\bin
4.在安装的idea下面的bin目录下面有2个文件 : 一个是idea64.exe.vmoptions,还有一个是idea.exe.vmoptions。用记事本打开 分别在最下面一行增加一行:
-javaagent:C:\JetBrains\IntelliJ\bin\JetbrainsCrack-4.2-release-enc.jar
5.重启一下软件,在进入出现有active code选择界面的时候,随便输入几个字母即可,能够进入应用界面则表示安装破解成功。

posted @ 2019-06-11 09:33 狼爱上狸 阅读(33) | 评论 (3)编辑 收藏

Ubuntu16 升级nodejs版本

背景

Ubuntu16下,使用apt-get下载的nodejs最新版本为v4.2.6,而react-native需要v8.x及以上的版本
解决方法

在网上找到了这一篇博客Ubuntu安装最新版nodejs,用npm安装了Node工具包n,使用该工具包将nodejs安装到了目前的最新版本v10.6.0。在已经安装npm的基础上,具体操作如下:

sudo npm install n -g

sudo n stable

node -v

n是一个Node工具包,它提供了几个升级命令参数:

n 显示已安装的Node版本
n latest 安装最新版本Node
n stable 安装最新稳定版Node
n lts 安装最新长期维护版(lts)Node
n version 根据提供的版本号安装Node
---------------------
作者:LDY_T
来源:CSDN
原文:https://blog.csdn.net/u010277553/article/details/80938829
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-06-10 11:07 狼爱上狸 阅读(11) | 评论 (0)编辑 收藏

献给那些安装remix-ide一直不成功的windows用户

首先找到编译器git地址,https://github.com/ethereum/remix-ide

进来后有安装步骤

/home/water/下载/3486521-922a751008a61222.png
remix-ide.png

如果我们电脑上没有node.js先登录下面的网址安装
https://docs.npmjs.com/getting-started/installing-node
因为安装的过程中需要的权限功能比较多所以得用管理员执行powershell 不建议使用cmd操作
安装好之后查看自己的 输入命令npm -v ,查看npm版本号如果低于6.1.0。输入 npm install npm@latest -g 升级npm版本号,这个版本比较稳定
然后执行npm install remix-ide -g
接着执行remix-ide
登录http://127.0.0.1:8080
如果不成功 执行 npm install --global --production windows-build-tools
然后再执行上面的步骤八成就可以了,remix-ide需要的环境还挺多



作者:刘阿火
链接:https://www.jianshu.com/p/fb198cd619b9
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

posted @ 2019-06-10 09:47 狼爱上狸 阅读(11) | 评论 (0)编辑 收藏

windows之geth账户建立

建立新账号,最好用>personal.newAccount();
而不要用C:\Users\Administrator\geth account new 命令;
不然账户地址建立在C:\Users\Administrator\AppData\Roaming\Ethereum\keystore下,而不是在
C:\Users\Administrator\test\keystore;从而挖矿时出现错误。

posted @ 2019-06-08 19:18 狼爱上狸 阅读(13) | 评论 (0)编辑 收藏

IPFS(DRAFT 3) 中文版白皮书

https://blog.csdn.net/easylover/article/details/82733578

posted @ 2019-06-04 22:25 狼爱上狸 阅读(8) | 评论 (0)编辑 收藏

Akasha——基于以太坊和IPFS的社交网络

在Akasha项目组测试各种代币模型并追求最优解决方案之后。

Akasha项目同时使用了以太坊和IPFS技术,创建一个去中心化的社交网络。以太坊提供了身份系统、微支付等支持,IPFS提供了内容存储、分发等支持。最近Akasha发布了0.3.0测试版,爱折腾的用户可以在Akasha创建的以太坊私有测试网络上体验这个追逐理想的项目。

说再多的理论,不如动手尝试。现在使用Akasha比较容易,无论你使用Windows操作系统,还是Mac操作系统,还是Linux系统,都可以一键安装。下载地址:https://github.com/AkashaProject/Alpha/releases/tag/0.3.0

安装完成后,进入设置阶段。如果你以前安装过以太坊Go客户端或者IPFS客户端,选择“Advanced”,自定义配置。如果没有安装过,选择“Express setup”(快速安装)。

Akasha后台的以太坊Go客户端和IPFS客户端开始运行,等到以太坊客户端同步区块到最新就可以进入Akasha网络。


同步结束后,就可以进行注册。填写完注册信息后,点击Submit(提交)。提交这一操作会发送一笔交易,当这笔交易被矿工打包的区块中,注册就成功了。

Identity Registered ! 注册成功。开始畅游Akasha世界


进入你的个人主页。你可以关注某人(欢迎关ע@shaoping:)、某个主题。


当然你也可以发表状态。每个状态需要至少加一个标签(tag)才能发布,你可以添加已有的标签,例如ethfans。你也可以自己创建一个新标签,创建新标签也会通过发送交易实现的。


Akasha支持Whisper协议,可以在聊天室聊天。


Akasha官网:https://akasha.world/

来源:以太坊爱好者 http://ethfans.org/posts/Akasha-release-0-3-0

posted @ 2019-06-04 09:20 狼爱上狸 阅读(11) | 评论 (0)编辑 收藏

有趣的椭圆曲线加密

     摘要: 一、概述 椭圆曲线加密算法依赖于椭圆曲线理论,后者理论涵盖的知识比较深广,而且涉及数论中比较深奥的问题。经过数学家几百年的研究积累,已经有很多重要的成果,一些很棘手的数学难题依赖椭圆曲线理论得以解决(比如费马大定理)。 本文涉及的椭圆曲线知识只是抽取与密码学相关的很小的一个角落,涉及到很浅的理论的知识,同时也是一点比较肤浅的总结和认识,重点是利用椭圆曲线结合数学技巧阐述加密算法的过程和原理。 本文...  阅读全文

posted @ 2019-06-01 17:09 狼爱上狸 阅读(15) | 评论 (0)编辑 收藏

ipfs私有网络搭建

ipfs私有网络搭建准备工作:

1、至少准备2个ipfs的节点

2、创建一个共享秘钥

3、配置需要相互共享的节点。

一、准备IPFS节点。

1、准备两台linux节点,我测试的系统是Ubuntu 18.04 LTS(点击可以下载)。

2、安装ipfs命令:(如果已安装可以沪铝忽略)

        sudo snap install ipfs

3、安装go-lang环境,后面创建共享秘钥需要用到。(如果已安装请忽略)

        sudo apt-get install golang

4、安装git。(如果已经安装请忽略)

        sudo apt-get install git

两台linux服务器均完成ipfs安装之后第一步准备工作便已完成。

二、创建共享秘钥

1、到github上面下载秘钥生成工具go-ipfs-swarm-key-gen

        sudo git clone https://github.com/Kubuxu/go-ipfs-swarm-key-gen.git

2、编译go-ipfs-swarm-key-gen

        sudo go build -o ipfs-swarm-key-gen go-ipfs-swarm-key-gen/ipfs-swarm-key-gen/main.go

在当前目录会成一个ipfs-swarm-key-gen的可执行二进制文件。然后使用该文件生成一个swarm.key文件

        sudo ./ipfs-swarm-key-gen > swarm.key

拷贝swarm.key文件到.ipfs目录中。(注意使用snap安装ipfs那么.ipfs目录在~/snap/ipfs/目录下,例如我的是在~/snap/ipfs/589/下)。

三、配置相互共享的私有网络

1、分别初始化两个ipfs节点。

        ipfs init

2、删除ipfs默认的网关节点

        ipfs bootstrap rm all

3、添加其中一台节点的地址到另一台节点的bootstrap列表中。

    3.1执行ipfs id查看ipfs节点的ID值。

ipfs节点信息

    3.2添加节点地址到另一台节点的bootstrap列表中

ipfs bootstrap add /ip4/被添加节点的ip地址/tcp/4001/ipfs/被添加节点的ID值。

至此ipfs私有网络搭建完毕



作者:embedsky
链接:https://www.jianshu.com/p/cf70c5bc81ae
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

posted @ 2019-06-01 10:14 狼爱上狸 阅读(19) | 评论 (0)编辑 收藏

Ubuntu安装ipfs

sudo snap install ipfs

posted @ 2019-06-01 09:22 狼爱上狸 阅读(13) | 评论 (0)编辑 收藏

win10时间不同步怎么办

1.cmd
2.services.msc
3.Remote Procedure Call(RPC) Locator 自动启动
4.与Internet时间服务器同步 选择 time.windows.com

posted @ 2019-05-30 09:58 狼爱上狸 阅读(13) | 评论 (0)编辑 收藏

ubuntu 下查看caj文件

网的学位论文只有CAJ版,而我又偏偏使用Ubuntu,所以就有了这篇文章。

 

前端时间发现第一种方法在ubuntu 16 上不行, 请使用第二种方法。

 

第一种方法:

环境:Ubuntu 14.04 64bit

1.安装wine:

sudo apt-get install wine

2.下载caj6.0绿色版CAJViewer6.0_green.rar: http://pan.baidu.com/s/1mhwEvAK

3.解压到目录cajviewer6.0:

mkdir cajviewer6.0 unrar x CAJViewer6.0_green.rar cajviewer6.0

4.运行:

sudo chmod u+x CAJViewer.exe //修改权限 wine CAJViewer.exe 

结果如图:

 

PS: 由于我装的是英文版系统,所以有乱码,但将就着还可以看啦~

 

===============================================================

第二种方法:

前段时间发现用Ubuntu16.04上边的这种不行了,请使用下边的方法:

下载链接: http://pan.baidu.com/s/1jIqHxLs

      或 http://download.csdn.net/detail/arhaiyun/5457947

压缩包里边有安装说明,这里边是7.2 的cajviewer版本。亲测可用。


来自:https://www.cnblogs.com/asmer-stone/p/5197307.html

posted @ 2019-05-28 09:48 狼爱上狸 阅读(35) | 评论 (1)编辑 收藏

解决ubuntu-18-04使用root账户登录图形界面认证失败

https://morton.li/%E8%A7%A3%E5%86%B3ubuntu-18-04%E4%BD%BF%E7%94%A8root%E8%B4%A6%E6%88%B7%E7%99%BB%E5%BD%95%E5%9B%BE%E5%BD%A2%E7%95%8C%E9%9D%A2%E8%AE%A4%E8%AF%81%E5%A4%B1%E8%B4%A5/

posted @ 2019-05-27 09:07 狼爱上狸 阅读(11) | 评论 (0)编辑 收藏

搭建基于hyperledger fabric的联盟社区 --生成公私钥证书及配置文件

一.生成公私钥和证书

Fabric中有两种类型的公私钥和证书,一种是给节点之前通讯安全而准备的TLS证书,另一种是用户登录和权限控制的用户证书。这些证书本来应该是由CA来颁发,但是目前只有两个社区,所以目前暂时没有启用CA节点,但是Fabric帮我们提供了一个crytogen工具来生成证书。

 

1.1编译cryptogen

编译生成 cryptogen之前我们需要安装一个软件包,否则编译时会报错

sudo apt install libltdl3-dev

Fabric提供了专门编译cryptogen的入口,我们只需要运行以下命令即可:

cd ~/go/src/github.com/hyperledger/fabric make cryptogen

运行后系统返回如下结果即代表编译成功了

build/bin/cryptogen  CGO_CFLAGS=" " GOBIN=/home/studyzy/go/src/github.com/hyperledger/fabric/build/bin go install -tags "" -ldflags "-X github.com/hyperledger/fabric/common/tools/cryptogen/metadata.Version=1.0.0" github.com/hyperledger/fabric/common/tools/cryptogen  Binary available as build/bin/cryptogen

我们在build/bin文件夹下就可以看到编译出来的cryptogen程序。

 

1.2配置crypto-config.yaml

examples/e2e_cli/crypto-config.yaml已经提供了一个Orderer Org和两个Peer Org的配置,该模板中也对字段进行了注释。我们可以把配置修改一下:

OrdererOrgs:        - Name: Orderer     Domain: example.com               Specs:       - Hostname: orderer  PeerOrgs:      - Name: Org1     Domain: org1.example.com           Template:       Count: 1            Users:       Count: 1      - Name: Org2     Domain: org2.example.com     Template:       Count: 1     Users:       Count: 1

 

Name和Domain就是关于这个组织的名字和域名,这主要是用于生成证书的时候,证书内会包含该信息。而Template Count=1是说我们要生成1套公私钥和证书,因为我们一个组织只需要一个peer节点。最后Users. Count=1是说每个Template下面会有几个普通User(注意,Admin是Admin,不包含在这个计数中),这里配置了1,也就是说我们只需要一个普通用户User1@org2.example.com 我们可以根据实际需要调整这个配置文件,增删Org Users等。

 

1.3生成公司钥和证书

我们配置好crypto-config.yaml文件后,就可以用cryptogen去读取该文件,并生成对应的公私钥和证书了:

cd examples/e2e_cli/ ../../build/bin/cryptogen generate --config=./crypto-config.yaml

生成的文件都保存到crypto-config文件夹,我们可以进入该文件夹查看生成了哪些文件:

tree crypto-config

二.生成创世区块和Channel配置区块

2.1编译生成configtxgen

与前面1.1说到的类似,我们可以通过make命令生成configtxgen程序:

cd ~/go/src/github.com/hyperledger/fabric  make configtxgen

运行后的结果为:

build/bin/configtxgen  CGO_CFLAGS=" " GOBIN=/home/studyzy/go/src/github.com/hyperledger/fabric/build/bin go install -tags "nopkcs11" -ldflags "-X github.com/hyperledger/fabric/common/configtx/tool/configtxgen/metadata.Version=1.0.0" github.com/hyperledger/fabric/common/configtx/tool/configtxgen  Binary available as build/bin/configtxgen

2.2配置configtx.yaml

官方提供的examples/e2e_cli/configtx.yaml这个文件里面配置了由2个Org参与的Orderer共识配置TwoOrgsOrdererGenesis,以及由2个Org参与的Channel配置:TwoOrgsChannel。Orderer可以设置共识的算法是Solo还是Kafka,以及共识时区块大小,超时时间等,我们使用默认值即可,不用更改。而Peer节点的配置包含了MSP的配置,锚节点的配置。如果我们有更多的Org,或者有更多的Channel,那么就可以根据模板进行对应的修改。

2.3生成创世区块

配置修改好后,我们就用configtxgen 生成创世区块。并把这个区块保存到本地channel-artifacts文件夹中:

cd examples/e2e_cli/  ../../build/bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

2.4生成Channel配置区块

../../build/bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel

另外关于锚节点的更新,我们也需要使用这个程序来生成文件:

../../build/bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP  ../../build/bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP

最终,我们在channel-artifacts文件夹中,应该是能够看到4个文件。

channel-artifacts/ 
├── channel.tx 
├── genesis.block 
├── Org1MSPanchors.tx 
└── Org2MSPanchors.tx

posted @ 2019-05-20 14:59 狼爱上狸 阅读(22) | 评论 (0)编辑 收藏

Ubuntu下5大图像查看软件

1. Gwenview

是较好的一项应用,支持几乎所有图片格式,可进行基本的编辑、标签、缩略图、全屏、幻灯显示功能等等。

安装

sudo apt-get install gwenview


2. Eye of GNOME

是GNOME环境下较好的图片查看器,支持JPG, PNG, BMP, GIF, SVG, TGA, TIFF or XPM等图片格式,也可放大、幻灯显示图片、全屏、缩略图等功能。

安装

sudo apt-get install eog


3. gThumb

是另一GTK图片查看器,可导入Picasa或Flickr图片,也可导出到 Facebook, Flickr, Photobucker, Picasa 和本地文件夹。

安装

sudo apt-get install gthumb


4. Viewnior

是小型化的图片查看器,支持JPG和PNG格式。

安装

sudo apt-get install viewnior


5.gPicView

是LXDE下的默认图片查看器,操作按钮位于窗口底部。只需右击图片,实现所有相关功能。支持JPG, TIFF, BMP, PNG , ICO格式。

安装

sudo apt-get install gpicview

https://www.linuxidc.com/Linux/2011-03/33659.htm

posted @ 2019-05-20 14:57 狼爱上狸 阅读(8) | 评论 (0)编辑 收藏

以太坊多节点(两个节点)私链搭建

https://blog.csdn.net/apple9005/article/details/81282735

posted @ 2019-05-20 08:15 狼爱上狸 阅读(13) | 评论 (0)编辑 收藏

ubuntu apt-get 安装 golang 版本过低问题

apt-get install golang-go这样安装版本可能过低。
go version查看版本为 1.6.2
apt-get 卸载此版本重新安装

重新安装

    1. 去官网查看最新版链接 https://studygolang.com/dl
      比如我要下的是 https://studygolang.com/dl/golang/go1.11.linux-amd64.tar.gz
    1. 下载
      wget https://studygolang.com/dl/golang/go1.11.linux-amd64.tar.gz
         也可以到go语言中文网https://studygolang.com/dl下载最新版
    1. 解压缩
      tar -zxvf go1.11.linux-amd64.tar.gz -C /usr/lib
    将解压后的文件夹go移动到  /usr/local 

     输入命令: sudo mv go /usr/local

    1. 设置添加环境变量
      sudo gedit ~/.profile 在最后面添加如下配置
         export PATH=$PATH:/usr/local/go/bin   或者
export GOPATH=/opt/gopath export GOROOT=/usr/lib/go export GOARCH=386 export GOOS=linux export GOTOOLS=$GOROOT/pkg/tool export PATH=$PATH:$GOROOT/bin:$GOPATH/bin 

卸载老的go
sudo apt-get remove golang-go
    1. 安装新版本
      source ~/.profile
    1. 查看版本
      go version
      结果 go version go1.11 linux/amd64

参考:
https://blog.csdn.net/Booboochen/article/details/82463162
https://www.jianshu.com/p/85e98e9b003d

posted @ 2019-05-18 06:38 狼爱上狸 阅读(61) | 评论 (0)编辑 收藏

ubuntu18.04下最好用的音乐软件!没有之一

      自从2015年开始使用ubuntu之后,就开始了各种折腾。可惜的是,linux下,能用的音乐软件实在是少之又少!网易云音乐勉强可以,但是经常打不开。烦死。偶然发现这个软件:CoCoMusic,才惊觉是ubuntu 18.04.2下最好用的音乐软件!没有之一!      同时也适用于linux mint19.1。即点即开!堪称是,linux下的酷狗音乐!下载地址:https://github.com/xtuJSer/CoCoMusic/releases,直接下载:cocomusic_2.0.4_amd64.deb安装即可。

~$ cocomusic
即可启动

https://www.ubuntukylin.com/ukylin/forum.php?mod=viewthread&tid=188255

posted @ 2019-05-17 22:11 狼爱上狸 阅读(19) | 评论 (0)编辑 收藏

ubuntu18.04安装扫描仪

Linux下一般使用sane做为扫描仪后端,安装如下:
      sudo apt-get install sane sane-utils xsane

@node1:~$ sudo sane-find-scanner
  # sane-find-scanner will now attempt to detect your scanner. If the
  # result is different from what you expected, first make sure your
  # scanner is powered up and properly connected to your computer.

  # No SCSI scanners found. If you expected something different, make sure that
  # you have loaded a kernel SCSI driver for your SCSI adapter.

could not fetch string descriptor: Pipe error
could not fetch string descriptor: Pipe error
found USB scanner (vendor=0x04a9 [Canon], product=0x190d [CanoScan]) at libusb:003:006
  # Your USB scanner was (probably) detected. It may or may not be supported by
  # SANE. Try scanimage -L and read the backend's manpage.

$ scanimage -L
device `pixma:04A9190D' is a CANON Canoscan 9000F Mark II multi-function peripheral

期间也曾装过VueScan,可以识别扫描仪,但是要收费。
$ simple-scan
终于可以使用扫描仪了。

posted @ 2019-05-17 11:25 狼爱上狸 阅读(21) | 评论 (0)编辑 收藏

HyperLedger Fabric链码开发及测试

https://blog.csdn.net/TripleS_X/article/details/80550401

posted @ 2019-05-16 15:37 狼爱上狸 阅读(11) | 评论 (0)编辑 收藏

fabric-samples

https://github.com/hyperledger/fabric-samples

posted @ 2019-05-16 15:09 狼爱上狸 阅读(11) | 评论 (0)编辑 收藏

Linux(Ubuntu18.04)安装Chrome浏览器

一分钟安装教程!

1、将下载源加入到系统的源列表(添加依赖)

sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/

2、导入谷歌软件的公钥,用于对下载软件进行验证。

wget -q -O - https://dl.google.com/linux/linux_signing_key.pub  | sudo apt-key add -

3、用于对当前系统的可用更新列表进行更新。(更新依赖)

sudo apt-get update

4、谷歌 Chrome 浏览器(稳定版)的安装。(安装软件)

sudo apt-get install google-chrome-stable

5、启动谷歌 Chrome 浏览器。

/usr/bin/google-chrome-stable

然后添加到状态栏即可。



https://blog.csdn.net/hellozex/article/details/80762705

posted @ 2019-05-16 10:27 狼爱上狸 阅读(15) | 评论 (0)编辑 收藏

cp: 无法获取".build/docker/gotools/bin/protoc-gen-go" 的文件状态(stat): 没有那个文件或目录

在进行make docker时出现如下错误:

    [root@master1 fabric]# make docker
    mkdir -p .build/image/ccenv/payload
    cp .build/docker/gotools/bin/protoc-gen-go .build/bin/chaintool .build/goshim.tar.bz2 .build/image/ccenv/payload
    cp: 无法获取".build/docker/gotools/bin/protoc-gen-go" 的文件状态(stat): 没有那个文件或目录
    make: *** [.build/image/ccenv/payload] 错误 1

经过查看发现,文件protoc-gen-go确实不在fabric/.build/docker/gotools/bin下。我是在配置的时候将protoc-gen-go放到了fabric/build/docker/gotools/bin下,一个“.”的区别。。。
---------------------
作者:ASN_forever
来源:CSDN
原文:https://blog.csdn.net/ASN_forever/article/details/87547839
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-05-16 08:57 狼爱上狸 阅读(152) | 评论 (0)编辑 收藏