主頁 > 區塊鏈 > 玩轉存證合約(二)| 利用Python開發區塊鏈后端介面

玩轉存證合約(二)| 利用Python開發區塊鏈后端介面

2021-03-06 10:59:39 區塊鏈

玩轉存證合約(二)| 利用Python開發區塊鏈后端介面

實驗環境

Python3.6+

FISCO BCOS

WeBase-Front

Centos7 / Ubuntu

專案地址:https://github.com/WeLightProject/Evidence-Sample-Python

前言

緊接上文,我們在上一文介紹了存證合約的具體內容以及存證合約的部署和呼叫,但是遇到一個問題,我們想通過這個合約來開發自己的web或者應用,該怎么辦?

FISCO BCOS區塊鏈向外部暴露了介面,外部業務程式能夠通過FISCO BCOS提供的SDK來呼叫這些介面,開發者只需要根據自身業務程式的要求,選擇相應語言的SDK,用SDK提供的API進行編程,即可實作對區塊鏈的操作,(https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/index.html)

目前,FISCO BCOS 提供的SDK包括:

  • Java SDK (穩定、功能強大、無內置控制臺,推薦使用)
  • Web3SDK (舊版Java SDK)
  • Python SDK (簡單輕便、有內置控制臺)
  • Node-js SDK (簡單輕便、有內置控制臺)
  • Go SDK (簡單輕便、有內置控制臺)
  • C# SDK (完整適配Json RPC API)

我們本節將利用Python-SDK,利用Python來實作區塊鏈的后端開發,

安裝Python-SDK

依賴軟體

  • Ubuntu: sudo apt install -y zlib1g-dev libffi6 libffi-dev wget git
  • CentOSsudo yum install -y zlib-devel libffi-devel wget git
  • MacOs: brew install wget npm git

初始化環境(若python環境符合要求,可跳過)

Linux環境初始化

拉取源代碼

git clone https://github.com/FISCO-BCOS/python-sdk

配置環境(安裝pyenv和python,若python版本>=3.6.3可跳過本步)

# 獲取python版本
python --version

## --------若python版本小于3.6.3,執行下面流程--------------------------------------
# 判斷python版本,并為不符合條件的python環境安裝python 3.7.3的虛擬環境,命名為python-sdk
# 若python環境符合要求,可以跳過此步
# 若腳本執行出錯,請檢查是否參考[依賴軟體]說明安裝了依賴
# 提示:安裝python-3.7.3可能耗時比較久
cd python-sdk && bash init_env.sh -p

## --------若通過bash init_env.sh -p安裝了python-sdk虛擬環境,執行下面流程-------------
# 激活python-sdk虛擬環境
source ~/.bashrc && pyenv activate python-sdk && pip install --upgrade pip

安裝Python SDK依賴

cd python-sdk 
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

初始化配置

# 該腳本執行操作如下:
# 1. 拷貝client_config.py.template->client_config.py
# 2. 安裝solc編譯器
bash init_env.sh -i

若MacOS環境solc安裝較慢,可在python-sdk目錄下執行如下命令安裝solcjs,python-sdk自動加載nodejs編譯器:

# 安裝編譯器
npm install solc@v0.4.25

tips:webase-front部署合約之后,會生成合約地址,bin和abi檔案,將abi檔案保存到contracts/目錄下,合約地址(contractAddress)也需要復制保存用于合約呼叫(0x8d6327bf7253e87add9d17212cc76dd7ff1d380c),這樣子才可以呼叫相應的合約,IDE頁面下方和合約串列都有對應的資訊

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

配置Channel通信協議

Python SDK支持使用Channel協議與FISCO BCOS節點通信,通過SSL加密通信保障SDK與節點通信的機密性,

設SDK連接的節點部署在目錄~/fisco/nodes/127.0.0.1目錄下,則通過如下步驟使用Channel協議:

配置Channel資訊

在節點目錄下的 config.ini 檔案中獲取 channel_listen_port, 這里為20200

[rpc]
    listen_ip=0.0.0.0
    channel_listen_port=20200
    jsonrpc_listen_port=8545

切換到python-sdk目錄,修改 client_config.py 檔案中channel_host為實際的IP,channel_port為上步獲取的channel_listen_port

channel_host = "127.0.0.1"
channel_port = 20200

配置證書

# 若節點與python-sdk位于不同機器,請將節點sdk目錄下所有相關檔案拷貝到bin目錄
# 若節點與sdk位于相同機器,直接拷貝節點證書到SDK配置目錄
cp ~/fisco/nodes/127.0.0.1/sdk/* bin/

配置證書路徑

  • client_config.pychannel_node_certchannel_node_key選項分別用于配置SDK證書和私鑰
  • release-2.1.0版本開始,SDK證書和私鑰更新為sdk.crtsdk.key,配置證書路徑前,請先檢查上步拷貝的證書名和私鑰名,并將channel_node_cert配置為SDK證書路徑,將channel_node_key配置為SDK私鑰路徑

檢查從節點拷貝的sdk證書路徑,若sdk證書和私鑰路徑分別為bin/sdk.crtbin/sdk.key,則client_config.py中相關配置項如下:

channel_node_cert = "bin/sdk.crt"  # 采用channel協議時,需要設定sdk證書,如采用rpc協議通信,這里可以留空
channel_node_key = "bin/sdk.key"   # 采用channel協議時,需要設定sdk私鑰,如采用rpc協議通信,這里可以留空

若sdk證書和私鑰路徑分別為bin/node.crtbin/node.key,則client_config.py中相關配置項如下:

channel_node_cert = "bin/node.crt"  # 采用channel協議時,需要設定sdk證書,如采用rpc協議通信,這里可以留空
channel_node_key = "bin/node.key"   # 采用channel協議時,需要設定sdk私鑰,如采用rpc協議通信,這里可以留空

國密支持

  • 支持國密版本的非對稱加密、簽名驗簽(SM2), HASH演算法(SM3),對稱加解密(SM4)
  • 國密版本在使用上和非國密版本基本一致,主要是配置差異,
  • 國密版本sdk同一套代碼可以連接國密和非國密的節點,需要根據不同的節點配置相應的IP埠和證書
  • 因為當前版本的實作里,賬戶檔案格式有差異,所以國密的賬戶檔案和ECDSA的賬戶檔案采用不同的配置

連接國密節點時,有以下相關的配置項需要修改和確認,IP埠也需要確認是指向國密版本節點

crypto_type = "GM" 	#密碼演算法選擇: 大小寫不敏感:"GM" 標識國密, "ECDSA" 或其他是橢圓曲線默認實作,
gm_account_keyfile = "gm_account.json"  #國密賬號的存盤檔案,可以加密存盤,如果留空則不加載
gm_account_password = "123456" 		#如果不設密碼,置為None或""則不加密
gm_solc_path = "./bin/solc/v0.4.25/solc-gm" #合約編譯器配置,通過執行bash init_env.sh -i命令下載

使用Channel協議訪問節點

# 獲取FISCO BCOS節點版本號
./console.py getNodeVersion

在這里插入圖片描述
Event事件回呼

  • 針對已經部署在鏈上某個地址的合約,先注冊要監聽的事件,當合約被交易呼叫,且生成事件時,節點可以向客戶端推送相應的事件
  • 事件定義如有indexed型別的輸入,可以指定監聽某個特定值作為過濾,如事件定義為 on_set(string name,int indexed value),可以增加一個針對value的topic監聽,只監聽value=5的事件
  • 具體實作參考demo_event_callback.py,使用的命令列為:
params: contractname address event_name indexed
        1. contractname :       合約的檔案名,不需要帶sol后綴,默認在當前目錄的contracts目錄下
        2. address :    十六進制的合約地址,或者可以為:last,表示采用bin/contract.ini里的記錄
        3. event_name : 可選,如不設定監聽所有事件
        4. indexed :    可選,根據event定義里的indexed欄位,作為過濾條件)

        eg: for contract sample [contracts/HelloEvent.sol], use cmdline:

        python demo_event_callback.py HelloEvent last
        --listen all event at all indexed :

        python demo_event_callback.py HelloEvent last on_set
        --listen event on_set(string newname) (no indexed):

        python demo_event_callback.py HelloEvent last on_number 5
        --listen event on_number(string name,int indexed age), age ONLY  5 :

成功安裝Python-SDK以及保存abi和合約地址之后,就可以進行后端開發了,

構造Evidence類

現階段,Python-SDK不支持pip下載,配置好的SDK和專案應該處于同一級目錄下,例如:

在這里插入圖片描述

首先介紹一下合約呼叫的初始化,

我們需要通過BcosClient(from client.bcosclient import BcosClient)底下的**call()函式和sendRawTransaction() / sendRawTransactionGetReceipt()**函式實作合約的呼叫,

  • call() 不上鏈,不發送交易,
  • sendRawTransaction() / sendRawTransactionGetReceipt() 上鏈,發送交易,

**sendRawTransaction()函式只回傳交易地址,并不會回傳交易的具體內容,如果需要獲取交易的具體內容則需要呼叫sendRawTransactionGetReceipt()**函式,(我們需要用api顯示這些內容,所以使用sendRawTransactionGetReceipt()函式)

通過觀察這幾個函式
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

  • to_address —— 合約地址(string格式)
  • contract_abi —— abi內容(json格式/dict格式)

所以我們需要提供給SDK兩個東西——abi(contracts/EvidenceFactory.abi)合約地址(0x8d6327bf7253e87add9d17212cc76dd7ff1d380c)

Python-SDK提供了導入abi檔案的函式,直接呼叫即可(讀取abi檔案json內容)

from client.datatype_parser import DatatypeParser
abi_file = "contracts/EvidenceFactory.abi"
data_parser = DatatypeParser()
data_parser.load_abi_file(abi_file)
print(data_parser.contract_abi)

在這里插入圖片描述

所以只要能設計一個類能實作call函式和sendRawTransactionGetReceipt()即可,

以HelloWorld.sol為例

在python-sdk檔案夾下執行python3 console.py deploy HelloWorld即可部署成功,abi會自動在contracts/目錄下生成,

from client.bcosclient import BcosClient
from client.datatype_parser import DatatypeParser

class Contract:
    def __init__(self, address: str):
        """
        :param address: 合約地址
        :return:
        """

        # 合約地址
        self.to_address = address

        # 讀取abi檔案,并轉為json格式
        abi_file = "contracts/HelloWorld.abi"
        data_parser = DatatypeParser()
        data_parser.load_abi_file(abi_file)
        self.contract_abi = data_parser.contract_abi

        # 創建BcosClient實體
        self.client = BcosClient()

    def sendtx(self, fn_name, args=None):
        """
        :param fn_name: 對應合約中的函式名
        :param args: fn_name的引數
        :return: 交易資訊,json格式
        """
        if args is None:
            sendtx_result = self.client.sendRawTransactionGetReceipt(self.to_address, self.contract_abi, fn_name, [])
        else:
            sendtx_result = self.client.sendRawTransactionGetReceipt(self.to_address, self.contract_abi, fn_name, [args])
        return {"result": sendtx_result}

    def call(self, fn_name, args=None):
        """
        :param fn_name: 對應合約中的函式名
        :param args: fn_name的引數
        :return: 交易資訊,json格式
        """

        if args is None:
            call_result = self.client.call(self.to_address, self.contract_abi, fn_name, [])
        else:
            call_result = self.client.call(self.to_address, self.contract_abi, fn_name, [args])
        return {"result": call_result}

呼叫測驗:

contract_address = "0xa2a802c413d738c98054c5582997c3120d2ebe0b"
cnt = Contract(contract_address)
call_msg = cnt.call("get")
print(call_msg)

send_msg = cnt.sendtx("set", "hello, fengfeng")
print(send_msg)

call_finish = cnt.call("get")
print(call_finish)

在這里插入圖片描述

客制化Evidence類

上述實作了一個call和sendRawTransactionGetReceipt的HelloWorld類,但是這并不方便我們后端呼叫,我們需要對其進行客制化設計,不把fn_name當成引數傳入,并對每個函式回傳的資料進行處理,

from client.bcosclient import BcosClient
from client.datatype_parser import DatatypeParser
from web3 import Web3

class Evidence_Contract:

    def __init__(self, address: str):

        self.to_address = address
        
        abi_file = "contracts/EvidenceFactory.abi"
        data_parser = DatatypeParser()
        data_parser.load_abi_file(abi_file)
        self.contract_abi = data_parser.contract_abi

        self.client = BcosClient()


    def new_evidence_by_evi(self, evi: str):

        new_evidence = self.client.sendRawTransactionGetReceipt(self.to_address, self.contract_abi, "newEvidence", [evi])
        return {"result": new_evidence["logs"]}

    def get_evidence_by_address(self, address: str):

        addr = Web3.toChecksumAddress(address)
        evidence_msg = self.client.call(self.to_address, self.contract_abi, "getEvidence", [addr])
        return {"result": evidence_msg}

    def add_signatures_by_evi_address(self, address: str):
        addr = Web3.toChecksumAddress(address)
        signature = self.client.sendRawTransactionGetReceipt(self.to_address, self.contract_abi, "addSignatures", [addr])
        return {
            "result": signature["logs"]
        }

    def verifySigner_by_address(self, address: str):
        try:
            addr = Web3.toChecksumAddress(address)
            signature = self.client.call(self.to_address, self.contract_abi, "verify", [addr])
            return {
                "result": signature[0]
            }
        except:
            return {
                "address": False
            }

    def get_signer_by_index(self, index: int):
        signature = self.client.call(self.to_address, self.contract_abi, "getSigner", [index])
        return {
            "address": signature[0]
        }

    def get_signers_size(self):
        signers_size = self.client.call(self.to_address, self.contract_abi, "getSignersSize", [])
        return {
            "size": signers_size[0]
        }

    def get_signers(self):
        signers = self.client.call(self.to_address, self.contract_abi, "getSigners", [])
        return {
            "signers": signers[0]
        }

tips:python沒有address這個資料型別,如果需要傳入address型別的資料,需要用Web3.toChecksumAddress(address)轉換,

存證合約中涉及到多簽的場景,對一個存證進行多次簽名,

實作思路:切換賬戶發送交易,

只要切換賬戶再呼叫addSignatures即可,

在client/bcosclient.py下的BcosClient類中添加以下內容:

def set_account_by_privkey(self, privkey):
    """
    :param privkey: 用戶私鑰
    :return: 
    """
    self.ecdsa_account = Account.from_key(privkey)
    keypair = BcosKeyPair()
    keypair.private_key = self.ecdsa_account.privateKey
    keypair.public_key = self.ecdsa_account.publickey
    keypair.address = self.ecdsa_account.address
    self.keypair = keypair


def set_account_by_keystorefile(self, account_keyfile):
    """
    :param account_keyfile: bing/accounts目錄下的account_keyfile檔案名
    :return: 
    """
    try:
        self.keystore_file = "{}/{}".format(client_config.account_keyfile_path,
                                            account_keyfile)
        if os.path.exists(self.keystore_file) is False:
            raise BcosException(("keystore file {} doesn't exist, "
                                 "please check client_config.py again "
                                 "and make sure this account exist")
                                .format(self.keystore_file))
        with open(self.keystore_file, "r") as dump_f:
            keytext = json.load(dump_f)
            privkey = keytext["privateKey"]
            self.ecdsa_account = Account.from_key(privkey)
            keypair = BcosKeyPair()
            keypair.private_key = self.ecdsa_account.privateKey
            keypair.public_key = self.ecdsa_account.publickey
            keypair.address = self.ecdsa_account.address
            self.keypair = keypair
    except Exception as e:
        raise BcosException("load account from {} failed, reason: {}"
                            .format(self.keystore_file, e))

python內置了一個賬戶(/bin/accounts/pyaccount.keystore),如果不實作切換賬戶的功能就辦法呼叫部署的合約更沒辦法實作多簽,

  1. 將webase-front匯出的account_keyfile保存在bin/accounts下,即可通過 BcosClient.set_account_by_keystorefile(account_keyfile)切換用戶
    在這里插入圖片描述

  2. 也可以根據用戶的私鑰來切換賬戶 BcosClient.set_account_by_privkey(privkey)

測驗代碼:

contract_address = "0x8d6327bf7253e87add9d17212cc76dd7ff1d380c"
# 合約地址
a = Evidence_Contract(contract_address)

fengfeng_privkey = "d6f8c8f9106835ccc8f8d0bbc4b5bf32ff5f8941e69f9f50d075684d10dda7be"
fengfeng2_privkey = "619834a32f41fc9dce7809c3063070af3d78fac577a0c12705984eed0b1a3cb"

a.client.set_account_by_privkey(fengfeng2_privkey)
# 切換賬戶

t = a.new_evidence_by_evi("Hello, world")
print(t)
# 創建存證

print(a.get_evidence_by_address(t["result"][0]["address"]))
# 獲取存證資訊

print("==================== 切換賬戶 ====================")
print("==================== 添加多簽用戶 ====================")

a.client.set_account_by_keystorefile("fengfeng.keystore")
# 切換賬戶

print(a.add_signatures_by_evi_address(t["result"][0]["address"]))
# 添加簽名

print(a.get_evidence_by_address(t["result"][0]["address"]))
# 查看存證資訊

在這里插入圖片描述

通過Flask設計后端API介面

from flask import Flask, jsonify, request, render_template
from evidence_contract import Evidence_Contract
from flask_cors import CORS

app = Flask(__name__)
contract_address = "0x8d6327bf7253e87add9d17212cc76dd7ff1d380c"
fengfeng_privkey = "d6f8c8f9106835ccc8f8d0bbc4b5bf32ff5f8941e69f9f50d075684d10dda7be"
fengfeng2_privkey = "619834a32f41fc9dce7809c3063070af3d78fac577a0c12705984eed0b1a3cb"
CORS(app)

@app.route("/new_evidence", methods=["GET", "POST"])
def new_evidence():
    data = request.get_json()
    if data is None:
        return jsonify({"error": "Pleace input [privkey, evidenceString] by string."}), 400
    privkey = data["privkey"]
    evidence_string = data["evidenceString"]
    evidence = Evidence_Contract(contract_address)
    evidence.client.set_account_by_privkey(privkey)
    new_evi = evidence.new_evidence_by_evi(evidence_string)
    return jsonify(new_evi), 200

@app.route("/evidence/<address>", methods=["GET", "POST"])
def show_evidence(address):
    try:
        evidence = Evidence_Contract(contract_address)
        evi = evidence.get_evidence_by_address(address)
        return jsonify(evi), 200
    except Exception as e:
        return jsonify({"error": e}), 400

@app.route("/addsignatures", methods=["GET", "POST"])
def add_sinatures():
    data = request.get_json()
    if data is None:
        return jsonify({"error": "pleace input [privkey, evidenceAddress] by string."}), 400
    privkey = data["privkey"]
    evidence_address = data["evidenceAddress"]
    evidence = Evidence_Contract(contract_address)
    try:
        evidence.client.set_account_by_privkey(privkey)
    except:
        return jsonify({"error": "Please enter the correct private key."}), 400
    result = evidence.add_signatures_by_evi_address(evidence_address)
    return jsonify(result), 200

@app.route("/verifysigner", methods=["GET", "POST"])
def verify():
    data = request.get_json()
    if data is None:
        return jsonify({"error": "pleace input [signerAddress,] by string."}), 400
    evidence = Evidence_Contract(contract_address)
    result = evidence.verifySigner_by_address(data["signerAddress"])
    return jsonify(result), 200

@app.route("/signer/<int:index>")
def showsigner(index):
    evidence = Evidence_Contract(contract_address)
    result = evidence.get_signer_by_index(index)
    return jsonify(result), 200

@app.route("/signer/lists")
def listsigner():
    evidence = Evidence_Contract(contract_address)
    result = evidence.get_signers()
    return jsonify(result), 200

@app.route("/signer/size")
def get_signer_size():
    evidence = Evidence_Contract(contract_address)
    result = evidence.get_signers_size()
    return jsonify(result), 200

if __name__ == '__main__':
    app.run(host="0.0.0.0")

postman測驗介面

在這里插入圖片描述

至此我們利用Python實作了后端API介面,可以通過這一套API來設計屬于自己的web應用了,

總結

利用Webase-Front + Python-SDK,我們實作了一套API介面并通過這套API介面呼叫了所有的合約介面,

專案倉庫

https://github.com/WeLightProject/Evidence-Sample-Python

參考鏈接

https://github.com/fisco-bcos/python-sdk

https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/index.html

https://github.com/MIllionBenjamin/Blockchain-FinalProject-SupplyChainFinancialPlatform

關于作者

作者的聯系方式:

微信:thf056
qq:1290017556
郵箱:1290017556@qq.com

你也可以通過 github | csdn | @新浪微博 關注我的動態

我們的公眾號平臺 — (湖師區塊鏈學會)

歡迎各位大大關注我們湖州師范區塊鏈協會的公眾號(湖師區塊人),我們會在這里不定期推送區塊鏈相關的“精神食糧”,
在這里插入圖片描述

歡迎評論關注+點贊啊!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/266717.html

標籤:區塊鏈

上一篇:【2021年新書推薦】TensorFlow 2 Reinforcement Learning Cookbook

下一篇:Opencl編程的標準開發流程

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more