Unbutn docker安装

Ubuntu docker 安装

  1 更新apt软件包索引
    sudo apt-get update

  2 在生产系统上,您应该安装特定版本的Docker CE,而不是始终使用最新版本。此输出被截断。列出可用的版本。
    apt-cache madison docker-ce
    sudo apt-get install docker-ce=<VERSION>

  3 通过运行hello-world 映像验证是否正确安装了Docker CE 。    
    sudo docker run hello-world

从包安装

  如果你不能使用Docker的版本库来安装Docker CE,你可以下载 .deb你的版本文件并手动安装。每次要升级Docker CE时,都需要下载一个新文件。
  1 转到httpss://download.docker.com/linux/ubuntu/dists/,选择你的Ubuntu版本,浏览pool/stable/和选择amd64, armhf,ppc64el,或s390x。下载.deb您要安装的Docker版本的文件。
    注:要安装边缘软件包,stable请将URL中的单词更改为edge。 了解稳定和边缘渠道。
  2 安装Docker CE,将下面的路径更改为您下载Docker包的路径。
   $ sudo dpkg -i /path/to/package.deb
   Docker守护进程自动启动。
  3 通过运行hello-world 映像验证是否正确安装了Docker CE 。

$ sudo docker run hello-world
这个命令下载一个测试图像并在一个容器中运行。容器运行时,会打印一条信息消息并退出。

Docker CE已安装并正在运行。该docker组已创建,但未添加用户。您需要使用sudo运行Docker命令。

在Linux系统上安装Compose

   在Linux上,您可以从GitHub上的Compose存储库版本页面下载Docker Compose二进制文件。按照链接中的说明进行操作,即curl在终端中运行命令以下载二进制文件。这些一步一步的说明也包括在下面。
   1 运行此命令下载最新版本的Docker Compose:在下载命令中使用最新的Compose版本号。
     sudo curl -L httpss://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

   2 对二进制文件应用可执行权限:
     sudo chmod +x /usr/local/bin/docker-compose

   3 测试安装。
     $ docker-compose --version
     docker-compose version 1.18.0, build 1719ceb

TCP和Http的区别

1、TCP连接

 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。
 建立起一个TCP连接需要经过“三次握手”:
 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开)

2、HTTP连接

  HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。

  HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
  1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
  2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。

  由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的 做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客 户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。

3、SOCKET原理

  3.1套接字(socket)概念
  套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
 应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协 议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以 和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

  3.2 建立socket连接
  建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。
  套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
  服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
  客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
  连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

4、SOCKET连接与TCP连接

  创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。

5、Socket连接与HTTP连接

  由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。

  二:TCP是传输层,而https是应用层今天学习了下,知道了https是要基于TCP连接基础上的,简单的说,TCP就是单纯建立连接,不涉及任何我们需要请求的实际数据,简单的传输。https是用来收发数据,即实际应用上来的。
     第一:从传输层,先说下TCP连接,我们要和服务端连接TCP连接,需要通过三次连接,包括:请求,确认,建立连接。即传说中的“三次握手协议”。
     第一次:C发送一个请求连接的位码SYN和一个随机产生的序列号给Seq,然后S收到了这些数据。
     第二次:S收到了这个请求连接的位码,啊呀,有人向我发出请求了么,那我要不要接受他的请求,得实现确认一下,于是,发送了一个确认码 ACN(seq+1),和SYN,Seq给C,然后C收到了,这个是第二次连接。
     第三次:C收到了确认的码和之前发送的SYN一比较,偶哟,对上了么,于是他又发送了一个ACN(SEQ+1)给S,S收到以后就确定建立连接,至此,TCP连接建立完成。
     简单就是:请求,确认,连接。

 第二:从实际上的数据应用来说https:
    在前面客户端和应用服务器建立TCP连接之后,就需要用https协议来传送数据了,HTTP协议简单来说,还是请求,确认,连接。总体就是C发送一个HTTP请求给S,S收到了这个https请求,然后返回给Chttps响应,然后C的中间件或者说浏览器把这些数据渲染成为了网页,展示在用户面前。
    第一:发送一个https请求给S,这个请求包括请求头和请求内容:
       request header:包括了,1.请求的方法是POST/GET,请求的URL,https协议版本2.请求的数据,和编码方式3是否有cookie和cooies,是否缓存等。
       post和get请求方式的区别是,get把请求内容放在URL后面,但是URL长度有限制。而post是以表单的形势,适合要输入密码之类的,因为不在URL中显示,所以比较安全。
       request body:即请求的内容.
    第二:S收到了https请求,然后根据请求头,返回https响应。
       response header:包括了1.cookies或者sessions2.状态吗3.内容大小等
       response body:即响应的内容,包括,JS什么的。
    第三,C收到了以后,就由浏览器完成一系列的渲染,包括执行JS脚本等。

三、TCP是底层通讯协议,定义的是数据传输和连接方式的规范

  HTTP是应用层协议,定义的是传输数据的内容的规范
  HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP也就一定支持TCP;HTTP支持的是www服务而TCP/IP是协议它是Internet国际互联网络的基础。TCP/IP是网络中使用的基本的通信协议。 
  TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输和电子邮件等,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是Internet协议族,而不单单是TCP和IP。

HTTP、TCP、UDP,Socket,HTTPS史上最强理解

TCP HTTP UDP三者的关系如下:

TCP/IP是个协议组,可分为四个层次:网络接口层、网络层、传输层和应用层。

在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。

在传输层中有TCP协议与UDP协议。

在应用层有HTTP,FTP、TELNET、SMTP、DNS等协议。

HTTP全称是HyperText Transfer Protocal,即:超文本传输协议,HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

HTTPS通信原理

HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道
HTTPS是HTTP over SSL/TLS,HTTP是应用层协议,TCP是传输层协议,在应用层和传输层之间,增加了一个安全套接层SSL/TLS:

SSL (Secure Socket Layer,安全套接字层)

TLS (Transport Layer Security,传输层安全协议)

SSL使用40 位关键字作为RC4流加密算法

Https的作用
内容加密 建立一个信息安全通道,来保证数据传输的安全;
身份认证 确认网站的真实性
数据完整性 防止内容被第三方冒充或者篡改

Https和Http的区别

httpss协议需要到CA申请证书。
https是超文本传输协议,信息是明文传输;httpss 则是具有安全性的ssl加密传输协议。
https和httpss使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
https的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比https协议安全。
https默认使用80端口,httpss默认使用443端口

TCP:传送控制协议(Transmission Control Protocol)

UDP:用户数据报协议 (UDP:User Datagram Protocol)

socket:

这是为了实现以上的通信过程而建立成来的通信管道,其真实的代表是客户端和服务器端的一个通信进程,双方进程通过socket进行通信,而通信的规则采用指定的协议。

socket只是一种连接模式,不是协议,socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),

通过Socket,我们才能使用TCP/IP协议。tcp、udp,简单的说(虽然不准确)是两个最基本的协议,

很多其它协议都是基于这两个协议如,https就是基于tcp的,.用socket可以创建tcp连接,也可以创建udp连接,

这意味着,用socket可以创建任何协议的连接,因为其它协议都是基于此的。

Socket 传输的特点:

优点

1) 传输数据为字节级,传输数据可自定义,数据量小(对于手机应用讲:费用低)

2)传输数据时间短,性能高

3)适合于客户端和服务器端之间信息实时交互

4)可以加密,数据安全性强

缺点:

1)需对传输的数据进行解析,转化成应用级的数据

2)对开发人员的开发水平要求高

3)相对于Http协议传输,增加了开发量

基于Http协议传输的定义和其特点

基于https协议的传输特点

优点:

1)基于应用级的接口使用方便

2)程序员开发水平要求不高,容错性强

缺点:

1)传输速度慢,数据包大(Http协议中包含辅助应用信息)

2)如实时交互,服务器性能压力大。

3)数据传输安全性差

各数据传输方式的适用范围

2.1 Socket传输适用范围

基于Socket传输的特点:Socket 传输方式适合于对传输速度,安全性,实时交互,费用等要求高的应用中,如网络游戏,手机应用,银行内部交互等

2.2 基于Http协议传输的适用范围

   基于https协议传输的特点:基于https协议传输方式适合于对传输速度,安全性 要求不是很高,且需要快速开发的应用。如公司OA系统,互联网服务等。

PHP实现各种经典算法

<?
//--------------------
// 基本数据结构算法
//--------------------
//二分查找(数组里查找某个元素)
function bin_sch($array, $low, $high, $k){

if ( $low <= $high){   
    $mid =  intval(($low+$high)/2 );   
    if ($array[$mid] ==  $k){   
        return $mid;   
    }elseif ( $k < $array[$mid]){   
        return  bin_sch($array, $low,  $mid-1, $k);   
    }else{   
        return  bin_sch($array, $mid+ 1, $high, $k);   
    }   
}   
return -1;   

}
//顺序查找(数组里查找某个元素)
function seq_sch($array, $n, $k){

$array[$n] =  $k;   
for($i=0;  $i<$n; $i++){   
    if( $array[$i]==$k){   
        break;   
    }   
}   
if ($i<$n){   
    return  $i;   
}else{   
    return -1;   
}   

}
//线性表的删除(数组中实现)
function delete_array_element($array , $i)
{

    $len =  count($array);   
    for ($j= $i; $j<$len; $j ++){  
            $array[$j] = $array [$j+1];  
    }  
    array_pop ($array);  
    return $array ;  

}
//冒泡排序(数组排序)
function bubble_sort( $array)
{

    $count = count( $array);  
    if ($count <= 0 ) return false;  
    for($i=0 ; $i<$count; $i ++){  
            for($j=$count-1 ; $j>$i; $j--){  
                    if ($array[$j] < $array [$j-1]){  
                             $tmp = $array[$j];  
                             $array[$j] = $array[ $j-1];  
                            $array [$j-1] = $tmp;  
                    }  
            }  
    }  
    return $array;  

}
//快速排序(数组排序)
function quick_sort($array ) {

    if (count($array) <= 1) return  $array;  
    $key = $array [0];  
    $left_arr  = array();  
    $right_arr = array();  
    for ($i= 1; $i<count($array ); $i++){  
            if ($array[ $i] <= $key)  
                    $left_arr [] = $array[$i];  
            else  
                     $right_arr[] = $array[$i ];  
    }  
    $left_arr = quick_sort($left_arr );  
    $right_arr = quick_sort( $right_arr);  
    return array_merge($left_arr , array($key), $right_arr);  

}

//------------------------
// PHP内置字符串函数实现
//------------------------
//字符串长度
function strlen ($str)
{

    if ($str == '' ) return 0;  
    $count =  0;  
    while (1){  
            if ( $str[$count] != NULL){  
                     $count++;  
                    continue;  
            }else{  
                    break;  
            }  
    }  
    return $count;  

}
//截取子串
function substr($str, $start, $length=NULL)
{

    if ($str== '' || $start>strlen($str )) return;  
    if (($length!=NULL) && ( $start>0) && ($length> strlen($str)-$start)) return;  
    if (( $length!=NULL) && ($start< 0) && ($length>strlen($str )+$start)) return;  
    if ($length ==  NULL) $length = (strlen($str ) - $start);  
      
    if ($start <  0){  
            for ($i=(strlen( $str)+$start); $i<(strlen ($str)+$start+$length ); $i++) {  
                    $substr .=  $str[$i];  
            }  
    }  
    if ($length  > 0){  
            for ($i= $start; $i<($start+$length ); $i++) {  
                    $substr  .= $str[$i];  
            }  
    }  
    if ( $length < 0){  
            for ($i =$start; $i<(strlen( $str)+$length); $i++) {  
                    $substr .= $str[$i ];  
            }  
    }  
    return $substr;  

}
//字符串翻转
function strrev($str)
{

    if ($str == '') return 0 ;  
    for ($i=(strlen($str)- 1); $i>=0; $i --){  
            $rev_str .= $str[$i ];  
    }  
    return $rev_str;  

}

//字符串比较
function strcmp($s1, $s2)
{

    if (strlen($s1) <  strlen($s2)) return -1 ;  
    if (strlen($s1) > strlen( $s2)) return 1;  
    for ($i =0; $i<strlen($s1 ); $i++){  
            if ($s1[ $i] == $s2[$i]){  
                    continue;  
            }else{  
                    return false;  
            }  
    }  
    return  0;  

}

//查找字符串
function strstr($str, $substr)
{

     $m = strlen($str);  
    $n = strlen($substr );  
    if ($m < $n) return false ;  
    for ($i=0; $i <=($m-$n+1); $i ++){  
            $sub = substr( $str, $i, $n);  
            if ( strcmp($sub, $substr) ==  0)  return $i;  
    }  
    return false ;  

}
//字符串替换
function str_replace($substr , $newsubstr, $str)
{

     $m = strlen($str);  
    $n = strlen($substr );  
    $x = strlen($newsubstr );  
    if (strchr($str, $substr ) == false) return false;  
    for ( $i=0; $i<=($m- $n+1); $i++){  
             $i = strchr($str,  $substr);  
            $str = str_delete ($str, $i, $n);  
            $str = str_insert($str,  $i, $newstr);  
    }  
    return $str ;  

}

//--------------------
// 自实现字符串处理函数
//--------------------
//插入一段字符串
function str_insert($str, $i , $substr)
{

    for($j=0 ; $j<$i; $j ++){  
            $startstr .= $str[$j ];  
    }  
    for ($j=$i; $j <strlen($str); $j ++){  
            $laststr .= $str[$j ];  
    }  
    $str = ($startstr . $substr  . $laststr);  
    return $str ;  

}
//删除一段字符串
function str_delete($str , $i, $j)
{

    for ( $c=0; $c<$i;  $c++){  
            $startstr .= $str [$c];  
    }  
    for ($c=( $i+$j); $c<strlen ($str); $c++){  
            $laststr  .= $str[$c];  
    }  
     $str = ($startstr . $laststr );  
    return $str;  

}
//复制字符串
function strcpy($s1, $s2 )
{

    if (strlen($s1)==NULL || !isset( $s2)) return;  
    for ($i=0 ; $i<strlen($s1);  $i++){  
            $s2[] = $s1 [$i];  
    }  
    return $s2;  

}
//连接字符串
function strcat($s1 , $s2)
{

    if (!isset($s1) || !isset( $s2)) return;  
    $newstr = $s1 ;  
    for($i=0; $i <count($s); $i ++){  
            $newstr .= $st[$i ];  
    }  
    return $newsstr;  

}
//简单编码函数(与php_decode函数对应)
function php_encode($str)
{

    if ( $str=='' && strlen( $str)>128) return false;  
    for( $i=0; $i<strlen ($str); $i++){  
             $c = ord($str[$i ]);  
            if ($c>31 && $c <107) $c += 20 ;  
            if ($c>106 && $c <127) $c -= 75 ;  
            $word = chr($c );  
            $s .= $word;  
    }   
    return $s;   

}
//简单解码函数(与php_encode函数对应)
function php_decode($str)
{

    if ( $str=='' && strlen($str )>128) return false;  
    for( $i=0; $i<strlen ($str); $i++){  
            $c  = ord($word);  
            if ( $c>106 && $c<127 ) $c = $c-20;  
            if ($c>31 && $c< 107) $c = $c+75 ;  
            $word = chr( $c);  
            $s .= $word ;  
    }   
    return $s;   

}
//简单加密函数(与php_decrypt函数对应)
function php_encrypt($str)
{

     $encrypt_key = 'abcdefghijklmnopqrstuvwxyz1234567890';  
     $decrypt_key = 'ngzqtcobmuhelkpdawxfyivrsj2468021359';  
    if ( strlen($str) == 0) return  false;  
    for ($i=0;  $i<strlen($str); $i ++){  
            for ($j=0; $j <strlen($encrypt_key); $j ++){  
                    if ($str[$i] == $encrypt_key [$j]){  
                            $enstr .=  $decrypt_key[$j];  
                            break;  
                    }  
            }  
    }  
    return $enstr;  

}
//简单解密函数(与php_encrypt函数对应)
function php_decrypt($str)
{

     $encrypt_key = 'abcdefghijklmnopqrstuvwxyz1234567890';  
     $decrypt_key = 'ngzqtcobmuhelkpdawxfyivrsj2468021359';  
    if ( strlen($str) == 0) return  false;  
    for ($i=0;  $i<strlen($str); $i ++){  
            for ($j=0; $j <strlen($decrypt_key); $j ++){  
                    if ($str[$i] == $decrypt_key [$j]){  
                            $enstr .=  $encrypt_key[$j];  
                            break;  
                    }  
            }  
    }  
    return $enstr;  

}

?>

区块链技术总结

比特币

署名为中本聪的人,提出了革命性的构想:让我们创造一种不受政府或其他任何人控制的货币!这个想法堪称疯狂:一串数字,背后没有任何资产支持,也没有任何人负责,你把它当作钱付给对方,怎么会有人愿意接受?

一、非对称加密
    非对称加密,其实很简单,就是加密和解密需要两把钥匙:一把公钥和一把私钥
    公钥是公开的,任何人都可以获取。私钥是保密的,只有拥有者才能使用。他人使用你的公钥加密信息,然后发送给你,你用私钥解密,取出信息。反过来,你也可以用私钥加密信息,别人用你的公钥解开,从而证明这个信息确实是你发出的,且未被篡改,这叫做数字签名。首先,你能解开加密包,取出里面的钱,因为私钥在你手里。其次,别人偷不走这笔钱,因为他们没有你的私钥。因此,支付可以成功。这就是比特币(以及其他数字货币)的原理:非对称加密保证了支付的可靠性。
       
二、比特币钱包   
    对于比特币来说,钱不是支付给个人的,而是支付给某一把私钥。这就是交易匿名性的根本原因,因为没有人知道,那些私钥背后的主人是谁。所以,比特币交易的第一件事,就是你必须拥有自己的公钥和私钥。

三、交易过程
    一笔交易就是一个地址的比特币,转移到另一个地址。
    比特币协议规定,申报交易的时候,除了交易金额,转出比特币的一方还必须提供以下数据
    1 上一笔交易的 Hash(你从哪里得到这些比特币)
    2 本次交易双方的地址
    3 支付方的公钥
    4 支付方的私钥生成的数字签名
    验证这笔交易是否属实,需要三步。
        第一步,找到上一笔交易,确认支付方的比特币来源。
        第二步,算出支付方公钥的指纹,确认与支付方的地址一致,从而保证公钥属实。
        第三步,使用公钥去解开数字签名,保证私钥属实。

四、交易确认与区块链

        交易数据必须写入数据库,才算成立,对方才能真正收到钱。比特币不存放在钱包或其他别的地方,而是只存在于区块链上面。**根据比特币协议,一个区块的大小最大是 1MB,而一笔交易大概是500字节左右,因此一个区块最多可以包含2000多笔交易。矿工负责把这2000多笔交易打包在一起,组成一个区块,然后计算这个区块的 Hash。计算 Hash 的过程叫做采矿,这需要大量的计算。矿工之间也在竞争,谁先算出 Hash,谁就能第一个添加新区块进入区块链,从而享受这个区块的全部收益,而其他矿工将一无所获。 所有的交易数据都会传送到矿工那里。矿工负责把这些交易写入区块链。

五、矿工的收益

     比特币协议规定,挖到新区块的矿工将获得奖励,一开始(2008年)是50个比特币,然后每4年减半,目前(2018年)是12.5个比特币。这也是比特币的供给增加机制,流通中新增的比特币都是这样诞生的。

区块链文档:https://www.ruanyifeng.com/blog/2017/12/blockchain-tutorial.html
区块链演示:httpss://blockchaindemo.io/

Docker 文档地址:https://www.dockerinfo.net/document

    
    Docker是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。Docker 可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样,尽可能的屏蔽代码层面的差异。Docker 会尽可能的缩短从代码测试到产品部署的时间。
    
    Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。 
    
    Docker通常用于如下场景:
        web应用的自动化打包和发布;
        自动化测试和持续集成、发布;
        在服务型环境中部署和调整数据库或其他的后台应用;
        从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
        
    Docker 常用命令
        docker images 
        docker ps
        docker rm
        docker pull
        docker push
        docker run
        docker build 
        杀死所有正在运行的容器 docker kill $(docker ps -a -q)
        删除所有已经停止的容器 docker rm $(docker ps -a -q)
        删除所有未打dangling标签的镜像   docker rmi $(docker images -q -f dangling=true)
        删除所有镜像  docker rmi $(docker images -q)   

K8s Kubernetes 文档教程地址:https://docs.kubernetes.org.cn/227.html

    Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
    通过Kubernetes你可以:快速部署应用、快速扩展应用、无缝对接新的应用功能、节省资源,优化硬件资源的使用
    Kubernetes 特点
        可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
        可扩展: 模块化, 插件化, 可挂载, 可组合
        自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展

Go

文档指南:httpss://tour.go-zh.org/
标准库:  httpss://studygolang.com/pkgdoc
简介 Go  2009年才以开源的方式面向大众,最新的是1.8。
go语言特性  静态编译、垃圾回收、简洁的符号和语法、平坦的类型系统、基于CSP的并发模型、高效简单的工具链、丰富的标准库
  
    

solidity

文档地址:https://www.tryblockchain.org/
它的语法接近于Javascript,是一种面向对象的语言。但作为一种真正意义上运行在网络上的去中心合约,它又有很多的不同,下面列举一些:
以太坊底层是基于帐户,而非UTXO的,所以有一个特殊的Address的类型。用于定位用户,定位合约,定位合约的代码(合约本身也是一个帐户)。由于语言内嵌框架是支持支付的,所以提供了一些关键字,如payable,可以在语言层面直接支持支付,而且超级简单。存储是使用网络上的区块链,数据的每一个状态都可以永久存储,所以需要确定变量使用内存,还是区块链。运行环境是在去中心化的网络上,会比较强调合约或函数执行的调用的方式。因为原来一个简单的函数调用变为了一个网络上的节点中的代码执行,分布式的感觉。最后一个非常大的不同则是它的异常机制,一旦出现异常,所有的执行都将会被回撤,这主要是为了保证合约执行的原子性,以避免中间状态出现的数据不一致。 

nodejs linux shell

以太坊

技术文档地址:httpss://segmentfault.com/a/1190000012894266
创建新账号  geth account new   默认在主网创建     --testnet   
账号列表    geth account list

1.安装开发库
    npm install -g ethereumjs-testrpc truffle  
2.启动 testrpc
3.初始化项目  truffle init
4.编译 truffle compile
5.部署 truffle migrate     重新部署添加    --reset
6.控制台互动
    HelloWorld.deployed().then(instance=> contract = instance)
7.新建代币合约
    truffle create contract EncryptedToken    创建 EncryptedToken.sol合约

8.查看coinbase账户信息
    web3.eth.coinbase    web3.eth.accounts[1]
9.创建项目
    truffle unbox react-box
10.加密钱包库
    npm install zeppelin-solidity

Hyperledger 管理的业务区块链框架

fabric monax sawtooth
fabric go
monax solidity solidity文档地址:https://www.tryblockchain.org/

fabric 安装过程

文档地址:httpss://hyperledger-fabric.readthedocs.io/
fabric链码生命周期
fabric 提供了 package install instantiate  upgrade 4个命令管理链码的生命周期。
通过install 安装链码 通过instantiate 实例化链码。然后通过invoke、query调用链码和查询链码
如果升级链码,则需要先install 安装新版本的链码,通过upgrade升级链码。
在install安装链码前,可以通过package 打包签名生成打包文件,然后通过install安装。

安装链码    peer chaincode install -n sacc -v 1.0 -p sacc
实例化链码   peer chaincode instantiate -n sacc -v 1.0 -c '{"Args":["johh","0",]}' -P "OR ('Org1.member')"
调用链码    peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
查询链码    peer chaincode invoke -o orderer.example.com:7050 -tls $CORE_PEER_TLS_ENABLED --cafile
升级链码    peer chaincode install -n mycc -v 1 -p path/to/my/chaincode/v1
           peer chaincode upgrade -n mycc -v 1 -c '{"Args":["d","e","f"]}' -c mychannel
打包链码    peer chaincode package -n mycc -p ....
打包并签名   peer chaincode signpakage ccpack.out signedccpack.out

安装过程:
    1.安装docker      查看  docker --version
    2.安装nvm  nodejs
    3.下载Hyperledger Fabric Samples
        **git clone httpss://github.com/hyperledger/fabric-samples.git**
        cd fabric-samples
    4 下载解压成bin放到本目录
        下载平台特定的二进制文件
        1> httpss://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/darwin-amd64-1.0.5/
        2> curl -sSL httpss:goo.gl/byy2Qj | bash -s 1.0.5
        vim init.sh
        chomd 777 init.sh  && ./init.sh
    5.网络应用
        cd first-network    ./byfn.sh -m down  先关闭服务
        ##为我们的各种网络实体生成所有证书和密钥,用于引导订购服务以及配置一个通道所需的一系列配置事务 。
        ./byfn.sh  -m generate
    6.生成初始的创世区块
        ../bin/cryptogen generate --config=./crypto-config.yaml
        export FABRIC_CFG_PATH=$PWD
        ../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
    7.生成应用通道的配置信息
        export CHANNEL_NAME=xiaoibao
        ../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID=$CHANNEL_NAME
    8.生成锚节点配置更新文件
    ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID=$CHANNEL_NAME -asOrg Org1MSP
    ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID=$CHANNEL_NAME -asOrg Org2MSP
操作网络
编辑docker-compsoser-cli.yaml  将70行注释
    CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=600 docker-compose -f docker-compose-cli.yaml up -d
    9.创建和加入通道
        进入docker
        docker exec -it cli bash
        创建通道
        export CHANNEL_NAME=xiaoibao
        peer channel create -o orderer.xiaoib.cn:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/xiaoib.cn/orderers/orderer.xiaoib.cn/msp/tlscacerts/tlsca.xiaoib.cn-cert.pem
        
        peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem 
        
        加入到通道之中
        peer channel join -b xiaoibao.block

    10.安装链码
        peer chaincode install -n xiaoibao-chaincode -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
        
        peer chaincode install -n xiaoibao-chaincode -v 1.0 -p /Users/meng/Chainblock/fabric-samples/chaincode/fabcar
    11.实例化链码
        
        peer chaincode instantiate -o orderer.xiaoib.cn:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/xiaoib.cn/orderers/orderer.xiaoib.cn/msp/tlscacerts/tlsca.xiaoib.cn-cert.pem -C $CHANNEL_NAME -n xiaoibao-chaincode -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
        
        
        peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n xiaoibao-chaincode -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
    
    11.查询
        peer chaincode query -C $CHANNEL_NAME -n xiaoibao-chaincode -c '{"Args":["query","a"]}'
    12.转账
        peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["invoke","a","b","10"]}'

    准备环境 杀掉活跃的容器    docker rm -f  $(docker ps -aq)
    13.清理缓存的网络
        docker network prune
        docker rmi dev-peer0.org1.example.com-fabcar-1.0-5c....
    14.安装客户端并启动网络
        npm install
        ./startFabric.sh node
        注册管理员   node enrollAdmin.js
        注册用户     node registerUser.js
        查询账目     node query.js

sudo lsof -i -P | grep -i "listen"

monax

services - 你打开或关闭的东西
chains - 开发许可链
pkgs - 我们的智能合约工具链
keys - 封装我们的关键管理工具

文档地址:httpss://monax.io/docs/install-source/
1.安装go git docker
2.设置go的环境变量
    export GOPATH=$HOME
    export GOBIN=$GOPATH/bin
    export PATH="$GOBIN:$PATH"
3.go get github.com/monax/monax/cmd/monax
  chmod +x monax  
  monax init
检查你的链是否正在运行    
    monax ls
    monax chains info
    monax chains status

查看运行日志
    monax chain logs test_chain
    monax chains logs -f test_chain

停止某个chain
    monax chain stop test_admin

删除链(-f强制删除正在运行的链,-x删除它写入的链的单独数据容器,-d完全删除(本地)链目录):  
    monax chains rm -xfd test_chain 
 
删除所有
    monax clean -yx 
    chain_dir=$HOME/.monax/chains/firstchain
    chain_dir_this=$chain_dir/firstchain_full_000
    monax chains make firstchain --account-types=Root:2,Full:1 --unsafe
    monax chains start firstchain --init-dir $chain_dir_this

实例化区块链部署合约
    addr=$(cat $chain_dir/addresses.csv | grep firstchain_full_000 | cut -d ',' -f 1)
    monax pkgs do --chain firstchain --address $addr    

区块链知识专业术语

文档地址:httpss://zhuanlan.zhihu.com/p/24605987
        httpss://www.ibm.com/developerworks/cn/cloud/library/cl-blockchain-basics-glossary-bluemix-trs/index.html
Attack(51%攻击)
    当一个单一个体或者一个组超过一半的计算能力时,这个个体或组就可以控制整个加密货币网络,如果他们有一些恶意的想法,他们就有可能发出一些冲突的交易来损坏整个网络。

Address(地址)
    加密货币地址用于在网络上发送或接收交易。 地址通常表示为个数字字字符。

ASIC(专用集成电路)
    “专用集成电路”简称。 通常,与GPU相比,ASIC专门用于挖矿,可能会节省大量能源。

Bitcoin(比特币)
    Bitcoin是在全球对等网络上运行的第一个去中心化开放源代码的加密货币,不需要中间商和集中式发行商。

Block(区块)
    区块是在区块链网络上承载永久记录的数据的数据包。

Blockchain(区块链)
    区块链是一个共享的分布式账本,其中交易通过附加块永久记录。 区块链作为所有交易的历史记录,从发生块到最新的块,因此命名为blockchain(区块链)。

Block Explorer(区块资源管理器)
    区块资源管理器是一种用来来查看区块上的所有交易(过去和当前)在线工具。 它们提供有用的信息,如网络哈希率和交易增长率。

Block Height(区块高度)
    连接在区块链上的块数。

Block Reward(积分奖励)
    它是在采矿期间成功计算区块中的哈希的矿工的一种激励形式。 在区块链上的交易验证的过程中产生新的币,并且矿工被奖励其中的一部分。

Central Ledger(中央帐簿)
    由中央机构维持的分类帐。

Confirmation(确认)
    去中心化的一次交易,将其添加到blockchain的成功确认。

Consensus(共识)
    当所有网络参与者同意交易的有效性时,达成共识,确保分布式账本是彼此的精确副本。

Cryptocurrency(加密货币)
    也称为令牌,加密货币是数字资产的呈现方式。

Cryptographic Hash Function(加密哈希函数)
    密码哈希产生从可变大小交易输入固定大小和唯一哈希值。 SHA-256计算算法是加密散列的一个例子。

Dapp(去中心化应用)
    Dapp(去中心化应用程序)是一种开源的应用程序,自动运行,将其数据存储在区块链上,以密码令牌的形式激励,并以显示有价值证明的协议进行操作。

DAO(去中心化自治组织)
    去中心化自治组织可以被认为是在没有任何人为干预的情况下运行的公司,并将一切形式的控制交给一套不可破坏的业务规则。

Distributed Ledger(分布式账本)
    分布式账本,数据通过分布式节点网络进行存储。 分布式账本不是必须具有自己的货币,它可能会被许可和私有。

Distributed Network(分布式网络)
    处理能力和数据分布在节点上而不是拥有集中式数据中心的一种网络。

Difficulty(容易程度)
    这是指成功挖掘交易信息的数据块的容易程度。

Digital Signature(数字加密)
    通过公钥加密生成的数字代码,附加到电子传输的文档以验证其内容和发件人的身份。

Double Spending(双重支付)
    当花费一笔钱多于一次支付限额时,就会发生双重支付。

Ethereum(以太坊)
    Ethereum是一个基于blockchain的去中心化运行智能合约的平台,旨在解决与审查,欺诈和第三方干扰相关的问题。

EVM(以太坊虚拟机)
    Ethereum虚拟机(EVM)是一个图灵完整的虚拟机,允许任何人执行任意EVM字节码。 每个Ethereum节点都运行在EVM上,以保持整个块链的一致性。

Fork(分支)
    分支可以创建区块链的交叉版本,在网络不同的地方兼容的运行两个区块链。

Genesis Block(创世区块)
    区块链的第一个区块。

Hard Fork(硬分支)
    一种使以前无效的交易有效的分支类型,反之亦然。 这种类型的分支需要所有节点和用户升级到最新版本的协议软件。

Hash(哈希)
    对输出数据执行散列函数的行为。 这是用于确认货币交易。

Hash Rate(哈希率)
    采矿钻机的性能测量值以秒为单位表示。

Hybrid PoS/PoW(混合PoS / PoW)
    POW(Proof of Work,工作证明)是指获得多少货币,取决于你挖矿贡献的工作量,电脑性能越好,分给你的矿就会越多。  POS(Proof of Stake,股权证明)根据你持有货币的量和时间进行利息分配的制度,在POS模式下,你的“挖矿”收益正比于你的币龄,而与电脑的计算性能无关。

混合PoS / PoW可以将网络上的共享分发算法作为共享证明和工作证明。 在这种方法中,可以实现矿工和选民(持有者)之间的平衡,由内部人(持有人)和外部人(矿工)创建一个基于社区的治理体系。

Mining(挖矿)
    挖矿是验证区块链交易的行为。 验证的必要性通常以货币的形式奖励给矿工。 在这个密码安全的繁荣期间,当正确完成计算,采矿可以是一个有利可图的业务。 通过选择最有效和最适合的硬件和采矿目标,采矿可以产生稳定的被动收入形式。

Multi-Signature(多重签名)
    多重签名地址需要一个以上的密钥来授权交易,从而增加了一层安全性。

Node(节点)
    由区块链网络的参与者操作的分类帐的副本。

Oracles(数据库)
    Oracle通过向智能合约提供数据,它现实世界和区块链之间的桥梁。

Peer to Peer(点对点)
    对等(P2P)是指在高度互联的网络中,双方之间的去中心化互动或更多的互动。 P2P网络的参与者通过单个调解点直接相互协商。

Public Address(公用地址)
    公共地址是公钥的密码哈希值。 它们作为可以在任何地方发布的电子邮件地址,与私钥不同。

Private Key(私钥)
    私钥是一串数据,它是允许您访问特定钱包中的令牌。 它们作为密码,除了地址的所有者之外,都被隐藏。

Proof of Work(工作证明)
    POW(Proof of Work,工作证明)是指获得多少货币,取决于你挖矿贡献的工作量,电脑性能越好,分给你的矿就会越多。

Proof of Stake(股权证明)
    POS(Proof of Stake,股权证明)根据你持有货币的量和时间进行利息分配的制度,在POS模式下,你的“挖矿”收益正比于你的币龄,而与电脑的计算性能无关。

Scrypt
    Scrypt是一种由Litecoin使用加密算法。 与SHA256相比,它的速度更快,因为它不会占用很多处理时间。

SHA-256
    SHA-256是比特币一些列数字货币使用的加密算法。 然而,它使用了大量的计算能力和处理时间,迫使矿工组建采矿池以获取收益。

Smart Contracts(智能合约)
    智能合约将可编程语言的业务规则编码到区块上,并由网络的参与者实施。

Soft Fork(软分支)
    软分支与硬分支不同之处在于,只有先前有效的交易才能使其无效。 由于旧节点将新的块识别为有效,所以软分支基本上是向后兼容的。 这种分支需要大多数矿工升级才能执行,而硬分支需要所有节点就新版本达成一致。

Solidity
    Solidity是Ethereum用于开发智能合约的编程语言。

Testnet
    开发商使用的测试区块链,它主要是用来防止改变在主链上的资产。

Transaction Block(交易区块)
    聚集到一个块中的交易的集合,然后可以将其散列并添加到区块链中。

Transaction Fee(手续费)
    所有的加密货币交易都会涉及到一笔很小的手续费。这些手续费用加起来给矿工在成功处理区块时收到的区块奖励。

Turing Complete(图灵完备)
    图灵完备是指机器执行任何其他可编程计算机能够执行计算的能力。 一个例子是Ethereum虚拟机(EVM)。

Wallet(钱包)

区块链的解决方案

IBM     https://www-31.ibm.com/ibm/cn/blockchain/offerings.html
京东云     httpss://www.jcloud.com/solution/blockchain
阿里云     httpss://help.aliyun.com/document_detail/60755.html?spm=a2c4g.11174359.6.877.fjDDRR

腾讯云     httpss://trustsql.qq.com

朝夕网络    https://zhaoxi.co/
齿轮易创    httpss://chilunyc.com/blockchain/

实现目标

httpss://www.bumeng.cn/index.html