比特币基本介绍与代码的简单实现

1、拜占庭将军问题

拜占庭将军问题是由微软首席研究员莱斯利·兰伯特(Leslie Lamport) 于提出,他提出的论文原文是这样的

 We imagine that several divisions of the Byzantine army are camped outside an enemy city, each division commanded by its own general. The generals can communicate with one another only by messenger. After observing the enemy, they must decide upon a common plan of action. However, some of the generals may be traitors, trying to prevent the loyal generals from reaching agreement.

拜占庭军队的几个师团驻扎在敌人的城外,每个师团都由自己的将军指挥。将军们只能通过信使互相交流。观察敌人之后,他们必须决定共同的行动计划。然而,一些将军可能是叛徒,试图阻止忠诚的将军达成协议。
这里用简洁的话语描述便是,**在不确定谁会发虚假消息的情况下,处于平等地位的各个节点如何达成共识,共同做一件事情。
**

2、什么是比特币?

比特币是构成数字货币生态系统基础的概念和技术的集合,主要用于在比特币网络之中的参与者之间的存储和传递价值,比特币协议栈作为开源软件可以在各种计算设备(包括手机或电脑)上面运行,从而使得该技术易于访问。
比特币的工作机制pow(proof of work): 工作量证明。所有节点都在做同一样的工作,一旦一个节点做成功了,便向全网广播,其他节点收到后把这个节点收录进来,再继续做工作。比特币作为虚拟的一般等价物,可以做到普通货币能做到的任何事情,包括买卖商品,汇款给别人或者组织、扩大信用等。相比较于传统的货币,它有以下特点:

1、安全
2、隐蔽
3、无地域边界限制

比特币与其他虚拟货币最大的不同,是其总数量非常有限,具有极强的稀缺性。该货币系统曾在4年内只有不超过1050万个,之后的总数量将被永久限制在2100万个,这也保证了比特币的稀缺性以及其不可泛滥性。与传统货币不同,比特币有自己的密钥。凭借着这些密钥,其中的每一个节点都可以签署交易以解锁价值,并将其转给新的持有者。密钥通常存储在每个节点的数字钱包中。

比特币是去中心化的点对点系统,因此,在比特币的世界观总没有“”“中央”这一概念。比特币是通过称为“挖矿”的过程中创建的,比特币网络中的任何参与者(即,使用完整比特币协议栈设备的任何人),都可以作为矿工使用其计算机的处理能力来验证和记录交易。平均每十分钟,一个比特币矿工可以验证过去10分钟的交易,并且获得全新的比特币奖励。

比特币的四种创新
1、去中心化的对等网络(比特币协议)
2、公共交易总账(区块链)
3、独立交易确认和货币发行的一套规则(共识规则)
4、实现有效的区块链去中心化共识机制(工作量证明算法)

3、比特币的使用

比特币作为虚拟的一般等价物,它方便了人与人之间的价值交流

离岸合同服务

Bob,帕拉奥图的咖啡店老板,正在建立一个新的网站。他与印度的网络开发商Gopesh签约,后者在印度班加罗尔居住。Gopesh同意使用比特币支付。这个故事将研究使用比特币进行外包,合同服务和国际电汇。

网上商店

Gabriel是里约热内卢的一个有进取心的年轻人,经营着一家小型网店,销售比特币品牌的T恤,咖啡杯和贴纸。Gabriel太年轻,没有银行账户,但他的父母鼓励他的企业精神。

慈善捐款

Eugenia是菲律宾一家儿童慈善机构的主任。最近她已经发现了比特币,并希望利用它来接触新的国内外捐助者,为她的慈善筹款。她还在调查使用比特币快速将资金分配给需要的地区的方法。这个故事将展示使用比特币来跨币种和跨国界的全球筹款活动,以及在慈善组织中使用开放透明的分类账簿。

进出口

Mohammed是迪拜的电子进口商。他正在尝试使用比特币从美国和中国购买电子产品,进口到阿联酋,以加速进口付款过程。这个故事将展示如何将比特币用于与物理商品相关的大型企业之间的国际支付。

4、比特币钱包

比特币钱包是比特币生态圈中最活跃的开发领域之一,根据平台,比特币钱包可以分类如下:
1、桌面钱包
中本聪最初实现的客户端中的钱包就是左面钱包,但放在操作系统上运行具有一定的安全隐患
2、手机钱包
手机钱包是比特币钱包最常见的类型。在智能手机操作系统(如iOS和Android)上运行,这些钱包通常是新用户的绝佳选择。其中,手机钱包推荐 Mycelium ,Mycelium网址
3、在线钱包
web钱包通过网络浏览器访问 ,并将用户钱包存储在第三方拥有的服务器上,它完全依赖于第三方服务器,但是,在线钱包有一定的安全隐患,不推荐存储大量的比特币。
4、硬件钱包
硬件钱包是指在专门的硬件上独立操作比特币钱包的设备。它们通过USB与桌面网络浏览器或通过移动设备上的近场通信(NFC)进行操作。通过专用硬件进行所有比特币相关操作,这些钱包被认为是非常安全的,适合存储大量的比特币。
5、纸钱包
控制比特币的密钥也可以打印长期存储。即使使用其他材料(木材,金属等),这些也被称为纸钱包。纸钱包提供低技术但高度安全的长期存储比特币的方法。脱机存储也经常被称为冷存储。
6、全节点客户端
完整的客户端节点是存储比特币交易的全部历史(每个用户每次交易)的客户端,管理用户钱包,并且可以直接在比特币网络上启动交易。完整节点处理协议的所有方面

5、用go语言对比特币进行简单的实现

1、创建一个Block结构体

type Block struct {
    Timestamp     int64  //创建时的时间戳
    Data          []byte //相关交易信息
    PrevBlockHash []byte //上一个块的hash
    Hash          []byte //本次交易块的hash
}

2、设置hash

func (this *Block) SetHash() {
    Timestamp := []byte(strconv.FormatInt(this.Timestamp, 10)) //将交易的时间转换为int数据类型
    headers := bytes.Join([][]byte{this.PrevBlockHash, this.Data, Timestamp}, []byte{})//headers 是将前一个的hash、自身的交易数据以及时间拼接起来存放到了byte切片里面
    hash := sha256.Sum256(headers) 
    this.Hash = hash[:] 
}

3、创建一个新的 block ,返回一个block的地址,传入data数据以及前一个块的hash值

func NewBlock(data string, PrevBlockHash []byte) *Block {
    block := &Block{time.Now().Unix(), []byte(data), PrevBlockHash, []byte{}} //用传入的数据将block实例化
    block.SetHash()//调用sethash,将block里面的数据传入到前一个sethash()方法中,得到档次的hash值
    return block
}

4、创建一个Blockchain结构体

type Blockchain struct {
    blocks []*Block//这里blocks 是一串地址的数组
}

5、创建一个增加区块的方法,

func (this *Blockchain) AddBlock(data string) {
    prevBlock := this.blocks[len(this.blocks)-1] //上一个块
    newBlock := NewBlock(data, prevBlock.Hash) //将本次的交易数据以及上一个块的hash传入,调用创建新区块的方法
    this.blocks = append(this.blocks, newBlock)
}

6、创建创世块

func NewGenesisBlock() *Block {
    return NewBlock("我是初始模块", []byte{})
}
func NewBlockchain() *Blockchain {
    return &Blockchain{[]*Block{NewGenesisBlock()}}
}

6、最后,大功告成,在主函数中实践一下

func main() {
    bc := NewBlockchain() 

    bc.AddBlock("send 1 btc to ivan")
    bc.AddBlock("send 2 more btc to ivan")

    for _, block := range bc.blocks {
        fmt.Printf("Prev.hash: %x \n", block.PrevBlockHash)
        fmt.Printf("Data:%s \n", block.Data)
        fmt.Printf("Hash: %x\n", block.Hash)
        fmt.Println()
    }
}

你可能感兴趣的:(比特币基本介绍与代码的简单实现)