Python 的 ezsheets 函式庫提供便捷操作 Google Sheets 的方法,讓開發者能輕鬆讀取、寫入和管理試算表資料。本文利用此特性,結合 Google Sheets 模擬區塊鏈功能,實作了虛擬加密貨幣 Boringcoin 的交易記錄和查核機制。透過 Python 指令碼,我們可以讀取 Google Sheets 中的交易資料,計算每個帳戶的餘額,並確保交易的完整性。同時,文章也提供新增交易記錄的程式碼範例,方便讀者理解整個流程。考量到 Google Sheets 的安全性限制,文章也討論了使用 SQLite 等更安全資料函式庫方案的必要性,並提出了系統未來發展方向,例如匯入交易驗證機制和智慧合約等功能。

實作虛擬區塊鏈加密貨幣的交易記錄和查核

背景介紹

在本文中,我們將使用 Google Sheets 作為虛擬區塊鏈來記錄 Boringcoin 的交易,Boringcoin 是一種虛擬加密貨幣。這個專案將展示如何使用 Python 來查核交易記錄並計算每個帳戶的餘額。

實作查核程式

首先,我們需要使用 ezsheets 函式庫來連線 Google Sheets 並讀取交易記錄。然後,我們將使用一個字典來儲存每個帳戶的餘額,字典的鍵是帳戶名稱,值是餘額。

import ezsheets

# 連線 Google Sheets
ss = ezsheets.Spreadsheet('your_spreadsheet_id')

# 初始化帳戶餘額字典
accounts = {}

# 迴圈遍歷每一行交易記錄
for row in ss.sheets[0].getRows():
    sender, recipient, amount = row[0], row[1], int(row[2])
    
    # 如果傳送者是 'PRE-MINE',則直接為收件者新增餘額
    if sender == 'PRE-MINE':
        accounts.setdefault(recipient, 0)
        accounts[recipient] += amount
    else:
        # 否則,從傳送者扣除餘額,並為收件者新增餘額
        accounts.setdefault(sender, 0)
        accounts.setdefault(recipient, 0)
        if accounts[sender] >= amount:
            accounts[sender] -= amount
            accounts[recipient] += amount
        else:
            print(f"傳送者 {sender} 的餘額不足")

# 列印每個帳戶的餘額
print(accounts)

# 計算整個網路的總餘額
total = sum(accounts.values())
print(f"整個網路的總餘額:{total}")

新增新交易

除了查核程式外,我們還需要一個程式來新增新的交易記錄到 Google Sheets 中。這可以透過 ezsheets 函式庫的 updateRows 方法來實作。

def add_transaction(sender, recipient, amount):
    # 連線 Google Sheets
    ss = ezsheets.Spreadsheet('your_spreadsheet_id')
    
    # 建構新的交易記錄
    new_row = [sender, recipient, amount]
    
    # 新增新的交易記錄到 Google Sheets 中
    ss.sheets[0].updateRows([new_row])

# 範例使用
add_transaction('Al Sweigart', 'Miles Bron', 19116)

加密貨幣交易記錄系統

系統概述

本系統使用 Google Sheets 作為資料儲存媒介,記錄加密貨幣交易的相關資料。系統分為兩個部分:auditBoringcoin.pyaddBoringcoinTransaction.py。前者負責計算加密貨幣的總數量,後者則負責新增交易記錄。

auditBoringcoin.py

此程式計算加密貨幣的總數量。它讀取 Google Sheets 中的資料,計算每個帳戶的餘額,並印出加密貨幣的總數量。

total = 0
for amount in accounts.values():
    total += amount
print('Total Boringcoins:', total)

addBoringcoinTransaction.py

此程式新增交易記錄。它讀取命令列引數,包括傳送者、接收者和金額。然後,它連線到 Google Sheets,新增一行記錄,並填入傳送者、接收者和金額的資料。

import sys, ezsheets

if len(sys.argv) < 4:
    print('Usage: python addBoringcoinTransaction.py <sender> <recipient> <amount>')
    sys.exit()

sender, recipient, amount = sys.argv[1:]

# 連線到 Google Sheets
ss = ezsheets.Spreadsheet('https://docs.google.com/spreadsheets/d/your_sheet_id')

# 選擇第一個工作表
sheet = ss[0]

# 取得工作表的行數
rows = sheet.getRowCount()

# 新增一行記錄
sheet.insertRow(rows + 1)

# 填入傳送者、接收者和金額的資料
sheet[rows, 1].value = sender
sheet[rows, 2].value = recipient
sheet[rows, 3].value = amount

安全性考量

使用 Google Sheets 作為資料儲存媒介存在安全性風險。這種做法可能導致資料洩露、篡改或其他安全性問題。因此,建議使用更安全的資料儲存解決方案,例如區塊鏈技術或其他安全的資料函式庫系統。

未來,該系統可以進行以下改進:

  1. 使用更安全的資料儲存解決方案。
  2. 實作交易驗證機制,以確保交易的合法性。
  3. 開發使用者介面,以方便使用者進行交易。
  4. 引入智慧合約功能,以自動化交易流程。

透過這些改進,該系統可以提供更安全、更方便、更高效的加密貨幣交易服務。

使用 EZSheets 存取 Google Sheets

Google Sheets 是一款線上試算表應用程式,執行於您的瀏覽器中。使用 EZSheets 第三方套件,您可以下載、建立、讀取和修改試算表。EZSheets 將試算表表示為 Spreadsheet 物件,每個物件都包含一個有序的 Sheet 物件列表。

每個工作表都有資料列和資料行,您可以使用幾種方法讀取和更新它們。雖然 Google Sheets 使得資料分享和協作編輯變得容易,但其主要缺點是速度:您必須使用網路請求更新試算表,這可能需要幾秒鐘才能執行。但是,對於大多數用途,EZSheets 中的 Python 指令碼不會受到此速度限制的影響。Google Sheets 還限制了您可以進行更改的頻率。

處理 Google Sheets 配額

根據 Google 的開發人員,使用者每天只能建立 250 個新試算表,免費的 Google 帳戶每天只能執行幾百次讀取和寫入操作。如果超過配額,EZSheets 會自動捕捉 googleapiclient.errors.HttpError 例外並重試請求。當這種情況發生時,讀取或寫入資料的函式呼叫可能需要幾秒鐘(甚至一兩分鐘)才能傳回。如果請求繼續失敗(如果另一個指令碼使用相同的憑證也正在進行請求),EZSheets 會重新引發此例外。

常見問題解答

  1. 您需要哪三個檔案才能讓 EZSheets 存取 Google Sheets?

  2. EZSheets 有哪兩種型別的物件?

  3. 您如何從 Google Sheets 試算表建立 Excel 檔案?

  4. 您如何從 Excel 檔案建立 Google Sheets 試算表?

  5. 如果 ss 變數包含一個 Spreadsheet 物件,您可以使用哪些程式碼從標題為「Students」的工作表中的 B2儲存格讀取資料?

  6. 您如何找到第 999 列的欄位字母?

  7. 您如何找到工作表中的列數和欄數?

  8. 您如何刪除試算表?此刪除是否永久?

  9. 哪些函式會建立新的 Spreadsheet 物件和新的 Sheet 物件?

  10. 如果您超過 Google 帳戶的配額,會發生什麼?

練習程式

為了練習,請撰寫程式來完成以下任務。

  • 下載 Google Forms 資料
  • 建立新的 Google Sheets 試算表
  • 從 Excel 檔案建立新的 Google Sheets 試算表
  • 刪除 Google Sheets 試算表
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Python實作虛擬加密貨幣交易記錄查核

package "資料庫架構" {
    package "應用層" {
        component [連線池] as pool
        component [ORM 框架] as orm
    }

    package "資料庫引擎" {
        component [查詢解析器] as parser
        component [優化器] as optimizer
        component [執行引擎] as executor
    }

    package "儲存層" {
        database [主資料庫] as master
        database [讀取副本] as replica
        database [快取層] as cache
    }
}

pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中

master --> replica : 資料同步

note right of cache
  Redis/Memcached
  減少資料庫負載
end note

@enduml

圖表翻譯:

此圖表展示了使用 EZSheets 存取 Google Sheets 的流程。首先,建立 EZSheets 物件,然後連線 Google Sheets。接下來,讀取或寫入資料,如果遇到配額限制,則進行處理。最後,完成操作。

內容解密:

在此範例中,我們使用 EZSheets 來存取 Google Sheets。首先,我們建立一個 EZSheets 物件,然後連線到 Google Sheets。接下來,我們可以讀取或寫入資料。如果我們遇到配額限制,EZSheets 會自動捕捉例外並重試請求。最後,完成操作。

使用 Google Forms 和 Google Sheets 收集及分析資料

Google Forms 是一個方便的工具,讓您可以輕鬆地建立線上的表單,以收集使用者的資料。這些資料會自動儲存到 Google Sheets 中,您可以輕鬆地分析和處理這些資料。

建立 Google Forms 表單

首先,登入您的 Google 帳戶,然後前往 Google Forms 網站。點選「新增表單」按鈕,開始建立您的表單。您可以新增各種型別的問題,包括文字、選擇、複選等。

將表單連結到 Google Sheets

當您建立表單時,您可以將其連結到 Google Sheets 中。這樣,當使用者提交表單時,資料會自動儲存到 Google Sheets 中。您可以在 Google Forms 中點選「回應」按鈕,然後點選「建立電子試算表」按鈕,將表單連結到 Google Sheets。

使用 EZSheets 處理 Google Sheets 資料

EZSheets 是一個 Python 函式庫,它讓您可以輕鬆地處理 Google Sheets 資料。您可以使用 EZSheets 來讀取和寫入 Google Sheets 資料,甚至可以使用它來建立和管理 Google Sheets 檔案。

範例程式碼

以下是使用 EZSheets 處理 Google Sheets 資料的範例程式碼:

import ezsheets

# 建立一個新的 Google Sheets 檔案
ss = ezsheets.Spreadsheet('1jDZEdvSIh4TmZxccyy0ZXrH-ELlrwq8_YYiZrEOB4jg')

# 讀取第一個工作表的資料
sheet = ss.sheets[0]
data = sheet.getRow(1)

# 處理資料
for row in range(1, sheet.rowCount + 1):
    row_data = sheet.getRow(row)
    # 對資料進行處理

# 寫入資料到 Google Sheets
sheet.updateRow(1, ['姓名', '電子郵件'])

SQLite 資料函式庫簡介

SQLite 是一個輕量級的關係型資料函式庫,它讓您可以輕鬆地儲存和管理資料。SQLite 是一個單檔案的資料函式庫,這意味著所有的資料都儲存到一個單一的檔案中。

SQLite 的優點

  • 輕量級:SQLite 是一個非常小巧的資料函式庫,它不需要太多的系統資源。
  • 單檔案:SQLite 的資料函式庫是儲存到一個單一的檔案中,這使得它非常容易管理和備份。
  • 關係型:SQLite 是一個關係型資料函式庫,這意味著它支援各種型別的資料關係。

SQLite 的缺點

  • 效能:SQLite 的效能可能不如其他的大型資料函式庫。
  • 並發性:SQLite 不支援高並發性的操作,這意味著它可能不適合用於大型的網站或應用程式。

使用 SQLite

要使用 SQLite,您需要先安裝 SQLite 的 Python 函式庫。您可以使用 pip 來安裝:

pip install sqlite3

然後,您可以使用以下程式碼來連線到 SQLite 資料函式庫:

import sqlite3

# 連線到 SQLite 資料函式庫
conn = sqlite3.connect('example.db')

# 建立一個 cursor 物件
cursor = conn.cursor()

# 執行 SQL 指令
cursor.execute('SELECT * FROM example')

# 取得結果
results = cursor.fetchall()

# 關閉連線
conn.close()

Spreadsheets vs. Databases

Spreadsheets 和 databases 都是用來儲存和管理資料的工具,但它們有不同的設計目標和優缺點。

Spreadsheets

Spreadsheets 是一種用來儲存和管理資料的工具,它通常用於小型的應用程式中。Spreadsheets 的優點包括:

  • 簡單易用:Spreadsheets 很容易使用,即使對於沒有太多技術背景的人也很容易上手。
  • 彈性高:Spreadsheets 可以儲存各種型別的資料,包括文字、數字和日期等。

但是,Spreadsheets 也有一些缺點,包括:

  • 效能低:Spreadsheets 的效能可能不如 databases,這意味著它可能不適合用於大型的應用程式中。
  • 並發性低:Spreadsheets 不支援高並發性的操作,這意味著它可能不適合用於多人協作的環境中。

Databases

Databases 是一種用來儲存和管理資料的工具,它通常用於大型的應用程式中。Databases 的優點包括:

  • 效能高:Databases 的效能通常高於 Spreadsheets,這意味著它們可以處理大型的資料集。
  • 並發性高:Databases 支援高並發性的操作,這意味著它們可以用於多人協作的環境中。

但是,Databases 也有一些缺點,包括:

  • 複雜度高:Databases 比 Spreadsheets 更複雜,這意味著需要更多的技術背景和知識來使用它們。
  • 成本高:Databases 可能需要更多的成本來建立和維護,這意味著需要更多的資源和預算。

建立資料函式庫和表格

讓我們開始使用 SQL 進行資料函式倉管理。SQL 是一種可以在 Python 中使用的迷你語言,類別似於正規表示式。就像正規表示式一樣,SQL 查詢是以 Python 字串值撰寫的。

首先,我們需要建立一個資料函式庫。為了示範,我們將建立一個名為 example.db 的 SQLite 資料函式庫,來儲存貓的相關資訊。要建立資料函式庫,首先需要匯入 sqlite3 模組。

import sqlite3

接下來,建立一個連線物件,連線到我們的資料函式庫檔案。如果這個檔案不存在,則會自動建立一個新的空白資料函式庫。

conn = sqlite3.connect('example.db')

資料函式庫可以包含多個表格,每個表格儲存特定的資料型別。例如,一個表格可以儲存貓的相關紀錄,另一個表格可以儲存給特定貓注射疫苗的紀錄。你可以把表格想象成一個元組列表,其中每個元組代表一行資料。

連線資料函式庫

連線資料函式庫的第一步是取得一個連線物件。

conn = sqlite3.connect('example.db')

第一個引數可以是檔案名稱或是 pathlib.Path 物件,代表資料函式庫檔案的路徑。如果這個檔案不存在,則會自動建立一個新的空白資料函式庫。

建立表格

連線到新的空白資料函式庫後,使用 CREATE TABLE SQL 查詢建立一個表格。

conn.execute('''
    CREATE TABLE IF NOT EXISTS cats (
        name TEXT NOT NULL,
        birthdate TEXT,
        fur TEXT,
        weight_kg REAL
    ) STRICT
''')

這個查詢會建立一個名為 cats 的表格,如果表格已經存在則不會發生任何事。IF NOT EXISTS 部分是用來避免嘗試建立已經存在的表格而引發錯誤。

定義資料型別

SQLite 有六種資料型別:

  • NULL:類別似 Python 的 None
  • INTINTEGER:類別似 Python 的 int 型別
  • REAL:類別似 Python 的 float 型別
  • TEXT:類別似 Python 的 str 型別
  • BLOB:類別似 Python 的 bytes 型別,適合儲存二進位制資料

SQLite 的資料型別與 Python 的型別不同,因為它需要與其他程式語言相容。雖然 SQLite 不嚴格執行資料型別,但它會自動將資料轉換為適合的型別,如果可能的話。

啟用嚴格模式

使用 STRICT 關鍵字可以啟用嚴格模式,這樣可以確保每個欄位都需要指定資料型別,並且嘗試插入錯誤型別的資料時會引發錯誤。

最後,別忘了關閉連線物件,以確保資源被釋放。

conn.close()

這樣就完成了建立資料函式庫和表格的過程。下一步,你可以開始插入資料並進行查詢。

SQLite 資料函式庫操作

SQLite 是一種輕量級的關聯式資料函式庫,廣泛用於各種應用程式中。以下是 SQLite 的一些基本操作。

建立資料表

在 SQLite 中,建立資料表使用 CREATE TABLE 陳述式。例如:

CREATE TABLE cats (
    name TEXT NOT NULL,
    birthdate TEXT,
    fur TEXT,
    weight_kg REAL
);

這個例子建立了一個名為 cats 的資料表,包含四個欄位:namebirthdatefurweight_kg

列出資料表和欄位

要列出 SQLite 資料函式庫中的所有資料表,可以使用以下陳述式:

SELECT name FROM sqlite_schema WHERE type='table';

要列出某個資料表的欄位,可以使用以下陳述式:

PRAGMA TABLE_INFO(cats);

這個例子會傳回 cats 資料表的欄位資訊,包括欄位名稱、資料型態、是否允許空值等。

CRUD 操作

CRUD 是 Create、Read、Update 和 Delete 的縮寫,代表了資料函式庫的四個基本操作。

  • Create:建立新資料。使用 INSERT INTO 陳述式,例如:

INSERT INTO cats VALUES (“Zophie”, “2021-01-24”, “black”, 5.6);

*   **Read**:讀取資料。使用 `SELECT` 陳述式,例如:
    ```sql
SELECT rowid, * FROM cats ORDER BY rowid;
  • Update:更新資料。使用 UPDATE 陳述式,例如:

UPDATE cats SET name=“Zoey” WHERE rowid=1;

*   **Delete**:刪除資料。使用 `DELETE` 陳述式,例如:
    ```sql
DELETE FROM cats WHERE rowid=1;

資料型態

SQLite 的資料型態包括:

  • INTEGER:整數
  • TEXT:文字
  • REAL:浮點數
  • BLOB:二進位制資料

注意,SQLite 沒有布林(Boolean)資料型態,可以使用 INTEGER 來代表布林值,0 代表 False,1 代表 True。

日期和時間

SQLite 沒有日期和時間的資料型態,可以使用 TEXT 來儲存日期和時間,格式可以是 YYYY-MM-DDYYYY-MM-DD HH:MM:SSYYYY-MM-DD HH:MM:SS.SSS 等。

從技術架構視角來看,利用 Google Sheets 作為虛擬區塊鏈儲存 Boringcoin 交易記錄,並以 Python 執行查核及新增交易,展現了簡潔易用的特性。透過 ezsheets 函式庫,程式碼得以輕鬆操作試算表,實作了基本的加密貨幣交易功能。然而,分析其技術限制,安全性明顯不足。Google Sheets 並非針對金融交易設計,缺乏完善的許可權控管及資料加密機制,存在資料洩漏和竄改的風險。此外,以試算表模擬區塊鏈,效能也將成為瓶頸,難以應付大規模交易。展望未來,考量資料安全及系統擴充套件性,建議匯入真正的區塊鏈技術或更安全的資料函式庫系統。同時,加入交易驗證機制和更友善的使用者介面,才能打造更穩健、實用的加密貨幣交易平臺。對於初期概念驗證或小型專案而言,此方法堪稱入門捷徑,但若要發展成熟應用,則必須正視其安全性及效能的根本性限制,尋求更專業的解決方案。玄貓認為,此架構適用於教學示範或個人探索,但不建議應用於實際的金融場景。