2018年10月23日 星期二

在 Spring Data JPA 中使用 AUTO_INCREMENT

快速紀錄~使用 @Id 和 @GeneratedValue 就可以用自動遞增的 Primary Key 了。不過如果不想要讓 Hibernate 自己產生 ID,而是直接靠資料庫自行產生的話,可以設定 @GeneratedValue 的屬性 strategy = GenerationType.IDENTITY。

參考資料
  1. Spring Data JPA; save() auto increment primary key error
  2. JPA EclipseLink DatabaseException: 'table foo.SEQUENCE doesn't exist'

2018年10月17日 星期三

(暫存) 追蹤智能合約

之前看到人家說 web3.py 有 bug,好像追蹤不到,不過現在看 issue 似乎是在新版解決了的樣子,之後要找個時間來實驗一下。

不過如果連接的是 infura 的話,因為 infura 不支援 filter event,所以好像無法靠 Contract Events 追蹤。

參考資料
  1. Empty event log #730
  2. Event logs? Am I doing something wrong?
  3. Listen to filtered events using web3js 0.19 (provided by infura)

編譯 Solidity 智能合約

快速紀錄,因為需要讓 web3.py 使用合約,官方的範例是寫說可以用程式碼直接編譯,不過好像需要環境本身的支援,感覺很麻煩 XD。所以直接在 Windows 裝了 Solidity 的編譯程式 solc,然後執行以下的指令(假設要編譯的智能合約的檔名叫做 contract.sol):

solc --combined-json abi,bin contract.sol > contract.json

以上的指令會建立 abi,並把智能合約的原始碼編譯成 hex 表示的字串,然後寫成一個 JSON 檔。JSON 檔的格式大略會長成這樣:

{
	"contracts": {
		"./XXX.sol:XXX": {
			"abi": "....",
			"bin": "...."
		},
		"./OOO.sol:OOO": {
			"abi": "....",
			"bin": "...."
		}
	},
	"version": "0.4.25+commit.59dbf8f1.Windows.msvc"
}

在這個範例中,是假設要編譯的智能合約包含了超過一個合約,也就是智能合約會引用其他智能合約的狀況。因此編譯出來會有很多個合約一起包在這個 JSON 裡,而每個合約都會有 abi 和 bin 兩個 key,反映我們的指令要求的輸出 abi 和 bin。

參考資料
  1. Installing the Solidity Compiler
  2. Ethereum Dapp初心者之路(7): web3.eth.compile.solidity()替代方案