【私讀推薦~《看得到的世界史》上&下】
「七間屋子裡,每間屋子有七隻貓,每隻貓抓到七隻老鼠,每隻老鼠吃掉七穗玉米,每穗玉米拿來播種,會產出七加侖的穀粉。把以上所提物品數量加總後一共是多少?」
如果你正開始動腦運算的話,不妨先了解這道題目其實出自於距今約3560年前的古埃及《蘭德數學莎草紙》(Rhind Mathematical Papyrus)。
====================
《蘭德數學莎草紙》原來長度約5公尺,高約30公分,為卷軸形式,其中2/3現存於大英博物館(British Museum)。莎草紙上共記載84道數學題目,封面上的書名看來頗具現代行銷意味:〝正確的計算高招:掌握所有意涵、通曉一切難題與秘密〞。若你是個古埃及人,這些約等於現代中學程度的數學題目有何作用?
古埃及已經擁有非常完整的國家制度和社會結構,數學運算關乎整個國家工程、生產、戰備補給等運作。換句話說,若是少了文字與數學概念,將難以支撐文明發展與國家行政運作。而《蘭德數學莎草紙》正是古埃及公務員教戰守策。
是說公務員為了混口飯吃,萬一題目太難也不能一個美送就丟筆,反正莎草紙上還很貼心地用紅色字跡提供解答。
====================
從數學莎草紙再往前推進一些年代,文字的出現對於人類文明進展至關重要。
世界上文字最早起源如今仍存在爭議,何況關乎民族顏面,這個問題顯得既敏感又容易受傷害。若從現存遺跡考證的話,目前則由距今約5000年前的美索不達米亞泥土寫字板暫居冠軍,雖說人家只有滑鼠那麼大。
小泥板上的文字意義非常妙,那些符號記載著啤酒配給量。對啦,就是我們吃熱炒海鮮、看球賽時的好朋友。只是古巴比倫人喝個啤酒還要認真記錄,有沒有這麼誇張?
那時啤酒營養豐富,口味也已經不少,是工人重要飲食內容。對於已經展出城邦制度,擁有數萬居民的文明來說,政策運作不可能隨口說說便算數,啤酒記錄就是政府發給工人的薪資表單,也關乎國家經費之掌控。
====================
那甲骨文,甚至更早的陶文呢?
根據考證,陶文出現於夏朝之前,大概距今4500年。而甲骨文則是商朝中期之後才發展,還要比陶文再晚個1200年。看起來古巴比倫還是贏了。再者甲骨文做為王室用於占卜記事之用,內容多關乎政事、戰爭、祭祀、遷都、王室譜系等等,對於鬼神與祖先極度敬畏,其中崇拜迷信與活人祭祀殘忍噬殺的程度,真會讓現代人頭皮發麻難以想像。
因此若以翹腳看熱鬧的沒出息老百姓如我看來,巴比倫小泥板和古埃及莎草紙的內容似乎更接地氣也更好玩→那個用吸管喝的古代啤酒到底還有啥口味?哪一種最好喝咧?🍺🍻🍺
====================
1753年,在英王喬治二世(George II,1683年-1760)熱情支持下,以著名博物學兼收藏家-漢斯・斯隆(Hans Sloane,1660-1753)餽贈給國家的71000件藏品為基礎,大英博物館因而成立,並於1759年正式開放。直到現在,館方仍堅持〝博物館應該是全體人類共享的教育殿堂〞理念,入門不收取費用,而只設置隨意捐獻箱。
比較另外兩家世界級博物館收費標準,紐約大都會藝術博物館票價25元美金,可在本館與修道院分館無限次連續使用三天;巴黎羅浮宮則是15歐元,但僅限一次進出,至於分館-德拉克洛瓦美術館(Musée Eugène-Delacroix)則須另行購票。然後在羅浮宮還得擔心排隊入場時被扒竊的問題。
相形之下,大英博物館確實非常友善。
====================
2010年,英國廣播公司BBC與大英博物館聯手合作,從館藏800多萬件藏品中,選出100件,做為《看得到的世界史》各章主角。時空跨越兩百萬年,範圍涵蓋世界各地,依次述說它們的故事,內容豐富多元精彩得要命。由時任館長-尼爾・麥格雷戈(Neil MacGregor,2002-2015在任)主筆撰寫,使讀者從這些形形色色物品中了解人類如何形塑歷史,又曾經扮演何種角色。
2012年繁體中文初版發行,多年來即使翻閱無數次,仍舊常有新發現與新樂趣。
且不說被精心挑選出來的物件所蘊藏深厚背景與迷人故事,光是幽默詼諧的敘事口吻就讓閱讀此書變得趣味十足→館長大人簡直太博學,請受我一拜。
尤其看到每個篇章結尾時,常常讓人忍不住笑出聲來。是而也讓我首度到手時便無法抗拒地花了兩個晚上讀罷上下冊。話說,當年還是酒聚時在友人的書櫃裡發現這套好書,頓時眼睛為之一亮,酒杯立馬擺一邊…(最好是
結果當然是酒繼續喝,回家火速上網訂書接著看下去啊~🍷🥂🧀
====================
若是每回走進博物館,在膜拜所謂〝鎮館之寶〞或大師作品之後,轉身面對滿坑滿谷展品卻不知所措,或只能走馬看花潦草離場,這套《看得到的世界史》或許會為你開啟探索寶藏的大門。
至於本文一開始的古埃及數學題目,答案是 19607(7+7平方+7三次方+7四次方+7五次方)。
所以偶爾練習一下數學題目,要是哪天不小心穿越到古埃及,當不成被搶來搶去的凱羅爾吃香喝辣周旋於眾人之間(看過尼羅河女兒吼),或許還是可以混進政府體系抓頭算數學。
當然,在閱讀之後再拜訪大英博物館,見到藏品本倫一一在列時,肯定更有親切感,那是再好也不過了。
#好書無論新舊都要強推
#歷史文物很有趣
#大英博物館真貼心
#東西縱橫記藝JunieWang
#IG https://www.instagram.com/art.junie/
圖片來源:Junie Wang
《Copyright © 2020東西縱橫記藝JunieWang版權所有,禁止擅自節錄,若需分享請完整轉貼並註明來源出處》
6次方符號 在 Taipei Ethereum Meetup Facebook 的最讚貼文
📜 [專欄新文章] 類 Python 的合約語言 Vyper 開發入門:與 Solidity 差異、用 Truffle 部署、ERC20 賣幣合約實做
✍️ 田少谷 Shao
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
有鑒於個人近期關注的 Uniswap 及 Curve 皆用 Vyper 實作,索性瀏覽了官方文件並嘗試一些開發工具,希望此文能減少一些讀者初嘗 Vyper 會遇到的麻煩!
Vyper and Solidity
Outline
一. Vyper 極簡介二. 與 Solidity 語法差異三. 開發、開發環境設置 1. 語法高亮 2. 本地 Vyper compiler 安裝 3. 使用 Truffle 操作 ERC20 - 安裝 Truffle - 發幣 - 寫個簡易賣幣合約四. 已知 Remix 問題 五. 結語
一. Vyper 極簡介
Vyper 是除 Solidity 外,以太坊上的另一智能合約 (Smart contract) 語言。其語法和 Python 相近,但畢竟也是寫合約的語言,邏輯差異不大,所以若熟悉 Solidity 應該不難理解用 Vyper 寫出的合約!
Vyper 主要被設計和 Solidity 的區別是安全性及可讀性,這部分會在下一段落及後方的實作中舉例說明。
二. 與 Solidity 語法差異
Vyper 與 Solidity 的差異有許多,在本段只就個人認為感受較深的三點進行說明,其他差異只進行翻譯,有興趣的讀者可以到官方文件詳細了解:https://vyper.readthedocs.io/en/latest/index.html
1. 沒有 modifier
Solidity 常見的 onlyOwner() modifier; 由於 gist 沒有 Solidity 的語法高亮,故截圖
在 Vyper 中單純用 assert 及 assert_modifiable 來進行條件檢查,兩者差別為若要檢查函數執行後的返還值,要用後者,如下圖:
Vyper 寫法
2. 沒有 Class inheritance 繼承
繼承是物件導向程式設計 (OOP) 的核心概念,但各種繼承關係有時候確實很複雜。Vyper 沒有繼承,這無疑大幅地增加了程式可讀性及安全性,以及降低審計程式碼的難度。在此提供一個例子供不熟悉 OOP 複雜之處的讀者有個概念:
source: https://consensys.github.io/smart-contract-best-practices/recommendations/#multiple-inheritance-caution
在上例中,contract A 的 fee 值 (因繼承自 contract B 和 C,故有 fee 一值) 是 5、a 值也是 5 (因繼承自 contract Final,故有 a 一值)。原因是 A 先繼承 B 再繼承 C,因此 contract A 中的 setFee() 是使用了 contract C 的 setFee(),而 a 值是由於 C(5),這代表 contract C 的 constructor (舊版本中即 function C(),函式名稱同 contract 名稱) 被傳入的值為 5。
稍微延伸一下以上概念,將 contract A 改成:contract A is C, B。如此一來,a 值還有 fee 值都會是 3,因為這次 A 先繼承 C 再繼承 B,因此最終吃到的值是 contract B 的。
以上就是 OOP 繼承的複雜之處的簡單範例說明,應該能稍微感受到爲什麼除去繼承後會大幅提高可讀性及安全性,畢竟即使是熟悉 OOP 的人有時頭腦一混亂也會開始懷疑自己寫的程式碼繼承結構是否正確 …
3. 沒有 dynamic array 動態陣列
這應該是目前 Vyper 設計中爭議最大的部分。沒有動態陣列代表在宣告陣列時需要宣告其長度,也就是說 Solidity 中的寫法 uint[], bool[] 等等,這些是不會出現在 Vyper 的。在 Vyper 中只能出現諸如:
# Vyper 的變數宣告方式為 變數名稱: 存取範圍(變數型態(若為陣列給長度))
values: uint256[10]participants: public(address[20])
可以看到上方的 uint256 及 address 兩陣列皆需要宣告長度,不能不宣告而使其動態地配置空間。
沒有動態陣列固然可以確保執行運算的範圍、次數,但一來動態陣列真的很方便、二來在 Solidity 有此功能而 Vyper 卻沒有的情況下可能會造成麻煩,詳見此一討論串:點我。
4. 沒有 inline assembly,程式碼中不會有組合語言
5. 沒有 function overloading,函式不會因傳入的參數數目不同而結果不同
6. 沒有 operator overloading,運算符號不會有不同於預設的自定義功能
7. 沒有無限迴圈,可免於 gas limit attack
8. 十進位定點數 decimal fixed point 而非二進位 (binary) 定點數,詳見:點我
三. 開發、開發環境設置
結論先講
開發 Vyper 的最佳姿勢目前個人認為是在本地裝上 Vyper compiler、用 Truffle 部署,並在撰寫時將檔名後加上 .py 就能有 Python 的語法高亮👌
1. 語法高亮 (syntax highlighting)
有語法高亮絕對是舒服地寫程式的第一步。
Remix 有 Vyper 的語法高亮,但一來個人目前不推薦使用 Remix 來撰寫 Vyper,原因詳見下方 4. 已知 Remix 問題;二來 Remix 的語法高亮其實也沒有很清楚,因此個人推薦:在本地開發,將檔名後加上 .py 就會有 Python 的語法高亮。
2. 本地 Vyper compiler 安裝
照官方說明使用 Python 的虛擬環境 virtualenv:
source: https://vyper.readthedocs.io/en/latest/installing-vyper.html#installing-vyper
簡單兩點提醒:
如果中間那行報錯但確實已經有 Python,則可能是版本問題。依照自己電腦上的版本改成相應的即可,ex: python3.6 改成 python3
進入虛擬環境後(檔案路徑前方應有 vyper-venv 的提示),使用此指令: vyper {檔案名稱}.vy,即可編譯 .vy 檔;使用完畢後輸入 deactivate 即可退出
3. 使用 Truffle 操作 ERC20
安裝 Truffle
Truffle 雖有冗餘的 migration 但也別無他法,畢竟 Remix 目前仍不完善 :(
下載流程可以照官方文件,使用 vyper-example:
source: https://github.com/truffle-box/vyper-example-box
由於我們會接上測試網 Ropsten,因此還要下載 truffle-hdwallet-provider:
source: https://github.com/trufflesuite/truffle-hdwallet-provider
接者就可以開始使用 Vyper 寫合約了!
發幣
由於 Vyper 的官方文件中已經有許多優質範例,因此本文希望來點不一樣但大家卻又很熟悉的…以 ERC20 為例(這千篇一律的主題xD):
用 Curve 的 ERC20 程式碼為範本,發一個幣(又要發…)
寫一個簡易賣幣合約
選擇這個主題一方面畢竟 ERC20 是以太坊的最大宗應用之一,二來有興趣的讀者可以透過讀 ERC20 的程式碼來熟悉 Vyper,並在看過本文的流程後對於用 Vyper+Truffle 來操作 ERC20 有完整的概念!
好的,首先複製一份 Curve 的 ERC20 程式碼(看到就順手拿來用),並複製到 Truffle 所在路徑的 contracts 資料夾中:https://github.com/curvefi/curve-contract/blob/pool_compound/vyper/ERC20.vy
由於第一點希望著重在跑一次流程,因此不改動合約的程式碼。
將 ERC20.vy 複製到 contracts 資料夾中後,到 migrations 資料夾開啟 2_deploy_contracts.js,首先將 require() 中的參數改為 ERC20.vy 的檔名 ERC20,再來依照自己喜好決定幣的名稱、代號、小數點位數及發行總量,輸入於 deployer.deploy() 中。
接著,為了和測試網 Ropsten 互動,需要將以下程式碼寫入 truffle-config.js。
第二行的 privateKeys 是帳號的私鑰。以下實作需要兩個帳號來操作,因此請從錢包匯入兩組私鑰(並非助憶詞)。
在第 13 行中 HDWalletProvider 此函式的第三個參數代表要用第幾個帳號最為預設帳號(部署合約等),第四個函數代表總共匯入幾組帳號。而第二個參數則是需要至 Infura 申請一個 project 來得到串接 Ropsten 的連結。這兩步驟並非本文重點,因此不詳細解說步驟,Google 搜尋關鍵字應該就會找到方法!
接著,就可以輸入以下指令來將代幣發佈到 Ropsten:
truffle deploy --network ropsten
有進入虛擬環境才可以編譯 .vy 檔,若忘記就會收到如下的錯誤訊息:
記得打開虛擬環境才能編譯 .vy 檔
成功後就可以在 contract address 中看到代幣發佈的位置,加入到 Metamask 中就可以看到。本文的例子是維尼代幣 Winnie the Coin, WTC ;)
contract address 便是 ERC20 的所在
Winnie the Coin, WTC
好了,到此測試網上又多了一個測試用的垃圾廢幣。
寫個簡易賣幣合約
賣幣合約中我想要簡單有兩個功能就好:付錢買幣 、結束銷售,以下就是程式碼。買幣的部分就不寫太詳細,固定價格為 0.01 Ether 可以買 500 代幣。
簡單說明幾點:
Solidity 的 constructor() 在 Vyper 中為 Python 風的 __init__():
函式的屬性(public, private, payable 等等)放在函式上方,與 Python 的修飾器位置相同
總之寫法跟 Python 很像,次方也一樣是用兩次乘法代表:**
變數前加上 self 代表是當前合約的變數/全域變數,因此非常容易與函式中的變數/區域變數做區隔
由於已經在第一行匯入了 ERC20 那份合約,因此透過將地址傳入合約當參數,就可以呼叫在該地址的合約:ERC20(self.tokenAddress) 。並且,可以將部署的合約存成一個變數 erc20 較方便
寫完合約後一樣要更改 migrations 資料夾中的 2_deploy_contracts.js 如下,將代幣所在的地址作為參數輸入。
由於先前已經部署過一次了,因此要重置才能再部署第二次,輸入以下指令:
truffle deploy --reset --network ropsten
部署成功之後就要來試著買幣啦!輸入以下來進入 console:
truffle console --network ropsten
成功進入後應該會看到 truffle(ropsten)> 的字樣。接著,首先取得部署的兩合約,並查看是否有返回合約資訊:
# ERC20 及 SellToken 是先前在 2_deploy_contracts.js 中的變數名稱,代表被部署的合約
let instance1 = await ERC20.deployed()instance1 # 印出 instance1 的資訊
let instance2 = await SellToken.deployed()instance2 # 印出 instance2 的資訊
再來,為了讓 SellToken 可以賣幣,要先用 ERC20 的合約匯幣到 SellToken 的合約。因此,輸入以下指令:
instance1.transfer(instance2.address, 10000)
# 這裡數字只要設為 > 500 就可以
接著,我們要利用第二個帳號去買幣(第一個帳號為預設帳號,因此就是代幣擁有者)。將帳號的資訊存入變數 accounts 中,再指定送出交易的帳號是第二個帳號。由於我個人匯入私鑰的順序是將第一個帳號存在 truffle-config.js 的 privateKeys[0]、第二個帳號存在 privateKeys[1],因此第二個帳號的地址就會在 accounts[1] 的位置:
let accounts = await web3.eth.getAccounts()
instance2.buyToken({from: accounts[1], value: 10000000000000000})
# value 為 10^16 是因為在 SellToken 的 buyToken 函式中買一次要 0.01 Ether, 即為 10^16 wei
然後應該就會在自己的第二個帳號中看到匯入的幣了~
最後,由於合約中結束銷售就是一個自殺 selfdestruct 函式,因此可以呼叫看看,第一個帳戶錢包中的錢應該會增加,因為第二個帳戶有付款買幣;並且,可以到 Ropsten 上瀏覽,應該能看到相關提示:
中間 contract 的右上角有 Self Destruct 的樣式
四. 已知 Remix 問題
Remix 目前有兩個版本,只有新版有 Vyper 的編譯器。在此整理目前遇到的問題,如果有人也遇到可以對照一下本處,可以省去很多自我懷疑xD
不會報錯
Remix 的編譯結果有時會是錯的、和本地端編譯出來的結果不同
舉上方的 SellToken 合約為例,將其複製到 Remix 中使用左邊的 Remote Compiler 有錯,但又不報錯 q_q (ERC20 的合約有在同檔案目錄)
左方有紅色三角形,代表編譯失敗,但沒有報錯訊息可以看…
getter function 竟然要花錢
用 Solidity 寫的合約,查詢 public 變數的值應該是不用消耗 gas 的,但不知何故查詢 Vyper 寫的合約的 public 變數卻要消耗 gas,如下圖…
可以看到中下方有 22026 gas 的消耗
Local compiler 無法使用
圖中的 Local Compiler 此選項,個人雖照官方文件執行 vyper-serve 但卻失敗,因此若有讀者成功希望能留個言不吝分享!
五. 結語
Vyper 作為一個比 Solidity 更新的合約語言,在寫程式碼的方面沒什麼問題,但相關的開發工具、學習資源等都遠不及 Solidity。
Vyper 主打的兩個特色:可讀性的部分相信看完上面的讀者應該已經有些感覺;安全性…小白如作者我倒是沒有感受到顯著的不同。況且 Solidity 已經發展許久,很多錯誤的寫法、知名的安全漏洞大家應該也很熟悉了,還有 Openzeppelin 提供安全合約寫法的範本,因此有待以後高人解說安全性是否真的是 Vyper 較好。
有興趣者可以查看 Vyper 的安全報告:點我,大意是目前 Vyper 的編譯器仍有許多問題待改進! (感謝 Chih-Cheng Liang 的提供)
本文對 Vyper 的介紹及其與 Solidity 的差異只講了個大概,欲知更詳細的介紹還是要麻煩讀者前往官方文件了:https://vyper.readthedocs.io/en/latest/index.html
最後,如果本文有任何錯誤,請不吝提出,我會盡快做修正;而如果我的文章有幫助到你,可以看看我的其他文章,歡迎一起交流 :)
田少谷 Shao - Medium
類 Python 的合約語言 Vyper 開發入門:與 Solidity 差異、用 Truffle 部署、ERC20 賣幣合約實做 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
6次方符號 在 一本好小說的誕生(拿起筆就能寫) Facebook 的精選貼文
【生命是一樁懸案各自表述觀察】駱以軍《明朝》#超級推薦 #2019最後一天來跟大家分享明朝
我們所處的世界,必然等同我們肉眼所見嗎?還是說,生命本身,就是一樁懸案各自表述觀察的各有見解?但即便千家百科 各有各的學科分派,最終仍難掩真相只有一個的事實存在?
本書故事是臺灣超會說故事的作家駱以軍,以中國歷史上,因瘋狂與怪異聞名的明朝,摻雜不知作者其人、傳說紛紜或民間流傳的戲劇小說與誌異資料等,佐附駱式文字招牌-從常人乍見平庸不過的生活日常,開枝想像散葉異度時空的文字炫彩,用宇宙維度的顛覆重構,及歷史轉科幻的馳騁想像,來對生命各項提出這樣的一個問號。
全書知識濃度甚高,包羅萬象的博雜浩瀚,給人一種目不暇給的感覺,甚至可視為知識長河流經的繪卷,不過提綱挈領,除卻「明朝」的走動翻飛,其實可以明湯顯祖膾炙人口的《牡丹亭》,及雨果獎長篇科幻小說獎得主劉慈欣的《三體》系列,作為理解重點。
一來,全書敘述展演的「視野」,或說人類生命歷史的存在流變,可能非是「過去-現在-未來」這樣平面直線的魚貫序列與因果推演,而是如克里斯托弗.諾蘭(Christopher Nolan)《星際效應》(Interstellar)那樣,三維甚至多維宇宙次方的呈現,彼此影響,並且相互連動牽連。
且書中大篇幅探討慾望與遺憾,但這其實與佛洛伊德心理學想傳達的概念相類-慾望沉潛在意識的冰山下,遺憾留待在人的心中成為未爆彈,但基本都是在人肉眼未可得見的地方,而這一切幾乎都只能在夢中展現-
既似〈遊園驚夢〉夢境作為成全遺憾與滿足慾望的處所,也似莊周夢蝶,人並不知,究竟是莊周夢蝶還是蝶夢莊周,滿是人與蝶、蝶與人及人蝶不分是耶非耶的錯亂。
所以書中才會說,「嚴格說,我們都是一堆墨」,誰也不知誰的真實日常,會否不過誰的小說繪卷,誰的筆下創作或實驗成果而已。是以,宇宙世界,彷彿俄羅斯娃娃的層層疊疊,觀看與被觀看間,並非是神與人,或外星與人類這樣簡單的區分可以了結。
於是,關於「存在」這件事的思考辯證(不管是不是人類),那樣浩瀚蔓延的無窮止盡,或許也只有無窮大的數學符號∞,或說神話創世,銜尾蛇(Ouroboros) 圓無止盡,生滅不息且無盡迴旋的象徵符號可以代表。
既論至此,更有一點有趣的觀察:或許可能是因為現世代,預期並寄予希冀盛世到來,卻不幸面對各項幻滅悲摧而導致厭世的遺憾,近幾年來,暢銷書榜上,屢屢得見人們對所謂歷史、神話與正統等顛覆再詮的貪饜。
不僅僅是在論述詳解上的呈現,那些佔盡人們休閒時光版面的小說戲劇等,歷史改編重詮或時光走廊的穿越變得非常常見,幾乎可說是到了滿地遍野的地步。
那麼,這個時候或許有人問,書中有書(自有或別有),且彼此世界交相跨越,這是否可成為小說的一種展演?其實,這樣的問法並不全然正確,事實上,書中有書的小說展演,在很久以前就開始了,並儼然有百花齊放的態勢。
以前曾介紹過,早期書中書的寫作技巧,往常不過是作為一種追兇的線索、謎團破獲、特殊氛圍渲染營造,或作為劇情串接,用以與他人互動的媒介。所以書中書,不管是自有一書或別有他書,它本就有由此來古典新詮、後設改編甚而氛圍發想再現的作用與存在意義。
關於此點,只要想想古往今來多少人使用神話(希臘悲劇)、民間童話(格林童話)、經典名著(莎士比亞)於創作中或改編,就可豁然開朗了,如榮獲英國布克獎的加拿大國寶級女作家瑪格麗特.愛特伍(Margaret Atwood)近期挑戰莎士比亞的《暴風雨》的《血巫孽種》(Hag-Seed),即是一例。
後續才轉作推理懸疑相當盛行的結構佈局-以書中書虛實交相出界的迷離,亦即使書中人物與書中之書的內容主角遭遇漸趨一致,而讓讀者或主角在難辨虛實中深感駭異,乍見平行的兩線,實際是兩相隱射類同遭遇與身份混淆的雙面陷阱,成為彷彿惡夢輪迴人無以相避的呼應驚心。
而在世界暢銷小說的研究耙梳裡,我發現,世界暢銷小說的結構佈局與文本類型,確實存有共同的SOP與特色元素可循,這就像是神話學大師坎伯的英雄之旅,起承轉合的冒險行經,亦如人生所歷,自有其律可循,而一些乍見不可思議或無可想像的吉光片羽,其實也都存在意義。
但或許世界暢銷小說公式自有其SOP可循(寫什麼像什麼,文本分類原則即為其特性),人們並可由此建構出大綱雛形,再另行演繹個人創意、時代流行、人物劇情等寫作技巧的曲折細膩等。
但一部藝術作品的最高境界,不僅是文學,更是古往今來藝術美學範疇的對決,那就是--當作品形神兩相對立時,形似會不如神似,神肖是更甚於形肖的排比的。
就像金庸名著《倚天屠龍記》張三豐傳授張無忌太極,「你還記得多少?」直到「我全忘了」的問答精義。
據說修練太極拳的精義,就在於「用意不用形,意在形之先」,要能突破形的囿限,意會神傳,才能無往不利,但這樣高妙的境界,顯然並非吾等凡俗之人可輕易抵達。
另,古語有言,禮教吃人,而中國明朝,又是一個極為壓抑的朝代,這也就是為何中國明清戲曲主題,雨後春筍量產類比《牡丹亭》等的劇情,這都是因為,「存天理,去人欲」的禮教束縛,太過不近於人情也太過叫人窒息了。
《明朝》是一本混雜有真實歷史與想像虛構來轉寫的科幻小說,而科幻小說的類型特色,多針對宇宙世界的存在疑義、歲月時光的遞嬗之謎、生物種族(不管在不在地球上)的繁衍爭競,還有各項生命未解或遭另詮的質疑做開展論證,它正得這樣的神髓,不能也不該以形式囿限之。
所以,最末這裡我要借作家林斯諺《馬雅任務》開首題詞所轉引、美國科幻大家菲利普.狄克(Philip K. Dick)的名語,來為這篇書評作結:「科幻小說的心理功能,在於讓讀者逃離他所居住的現實世界;它解構了時間、空間,以及現實。」《明朝》就是這樣的一個故事。
讀完全書,只能說,作家駱以軍真的是天才高妙的小說家,讀的時候總是感受到文字讓內心震撼,真的非常特殊的想像與字句精彩。
參考書目
駱以軍《明朝》,臺北:鏡文學,2019。
★真相只有一個的一樁懸案,如世界文明發生事件,可人類卻是各自表述觀察各有見解,分為神話、文學、人類、歷史、科幻、玄奇、文化、心理與社會等各學科概念。
★此處或可另參考華裔美籍作家姜峯楠(Ted Chiang)得獎顯赫的短篇小說集《妳一生的預言》(Stories of Your Life and Others)(即電影《異星入境》(Arrival)原著小說),人一生所見所歷的喜怒傷悲與事件,竟可彼此串聯一同示現。
★劉慈欣《三體》系列,因內容博雜,又有三部曲之廣,需另開新篇講,在此不另贅述;不過此一系列作為科幻小說的經典代表,特色元素的具備,倒是一樣都不少-世界(含宇宙)文明存在的探討、外星與人類的爭競友好,宇宙時間維度的遞嬗,生命浩瀚各種未解謎團等思考。