前言

在很久没有更新博客以及自己技术的前提下,感受到了来自编程界的毒打,接受新事物,本是开发者应该作为本能的一件事,但实际上,我并没有坚持多久,很拒绝的接受新事物,所以,今日起,重铸开发荣光,我辈义不容辞。

今天带来的是BigChainDB,这是一个可用的去中心数据库,听到这个词,是不是意识到另一样某个同样是去中心的东西,是的,区块链。

BigChainDB是一个区块链数据库,它具有每秒百万次写操作,储存PB级别的数据和亚秒级响应时间的性能。BigChainDB的设计起始于分布式数据库,通过创新加入了很多区块链的特性,像区中心控制、不可改变性、数字资产的创建和移动。

BigChainDB继承了现代分布式数据库的特性:吞吐量和容量都是与节点数量线性相关,功能齐全的NoSQL查询语言,高效的查询和权限管理。因为构建在已有的分布式数据库上,它在代码层面也继承了企业级的健壮性。可扩展的容量意味着具有法律效力的合同和认证可以直接存储在区块链数据库里。

安装

安装我采用的是docker

在安装了docker的前提下,直接拉取镜像

docker pull  bigchaindb/bigchaindb:all-in-one

大概有300M左右,可以执行命令启动一下

docker run -it -d -p 9984:9984 镜像id

访问一下9984,可以看到你的版本号

安装一些依赖

sudo apt-get update

sudo apt-get install libffi-dev

pip install --upgrade setuptools

pip3 install pytest-runner

然后安装驱动,对应你的版本号

pip install -U bigchaindb-driver==版本号

不过,可能会找不到这个包啊这些错误,没关系,我们直接去github上拉取他源码git clone https://github.com/bigchaindb/bigchaindb-driver.git

然后进入这个文件夹,执行python setup.py install,强行给他装上,不只是这个包,任何包都可以通过这个办法来进行安装

之后,在docker内重新启动服务,命令为:

$ docker run \
  --detach \
  --name bigchaindb \
  --publish 9984:9984 \
  --publish 9985:9985 \
  --publish 27017:27017 \
  --publish 26657:26657 \
  --volume $HOME/bigchaindb_docker/mongodb/data/db:/data/db \
  --volume $HOME/bigchaindb_docker/mongodb/data/configdb:/data/configdb \
  --volume $HOME/bigchaindb_docker/tendermint:/tendermint \
  bigchaindb/bigchaindb:all-in-one

含义为:

  • docker run 告诉Docker运行一些映像

  • --detach 在后台运行容器

  • publish 9984:9984 将主机端口映射9984到容器端口9984
    
    
       (BigchainDB API服务器)
    
      - `9985` BigchainDB Websocket服务器
      - `27017` MongoDB的默认端口
      - `26657` Tendermint RPC服务器
    
    - ```
      --volume "$HOME/bigchaindb_docker/mongodb:/data"
    将主机目录映射
    $HOME/bigchaindb_docker/mongodb
    到容器目录
    /data
    ; 这使我们能够将数据持久保存在主机上,您可以在[官方Docker文档中](https://docs.docker.com/engine/tutorials/dockervolumes)阅读更多 内容 - `$HOME/bigchaindb_docker/tendermint:/tendermint` 保留Tendermint数据。
  • bigchaindb/bigchaindb:all-in-one要使用的图像。容器名称之后的所有选项都将传递到容器内部的入口点。

使用

官方文档可以说是非常详细了,我们从创建开始

# 创建用户的密钥与公钥
alice, bob = generate_keypair(), generate_keypair()

# 链接
def conn():
    bdb = BigchainDB('http://127.0.0.1:9984')

    return bdb
# 创建一个链接
bdb = conn()

# 构造交易数据
bicycle_asset = {
    'data': {
        'bicycle': {
            'serial_number': 'abcd1234',
            'manufacturer': 'bkfab'
        },
    },
}
# 元数据
bicycle_asset_metadata = {
    'planet': 'earth'
}

# 准备交易(operation是操作,create代表创建,singners是公钥,创建出来供谁拥有,asset是交易的东西,metadata是元数据)
prepared_creation_tx = bdb.transactions.prepare(
    operation='CREATE',
    signers=alice.public_key,
    asset=bicycle_asset,
    metadata=bicycle_asset_metadata
)

# 通过私钥签名来完成交易(拥有者的私钥来进行交易签名)
fulfilled_creation_tx = bdb.transactions.fulfill(
    prepared_creation_tx,
    private_keys=alice.private_key
)


# 发送到bigchaindb节点
sent_creation_tx = bdb.transactions.send_commit(fulfilled_creation_tx)
# 完成创建
txid = fulfilled_creation_tx['id']

这样,我们就创建好了一个可交易的资产