nativeactions是setcode
, setabi
, newaccount
功能的函數集。這部分程式碼是hardcode在EOS系統程式碼裡的,也就說不需要部署這一步驟,所以就解決了蛋生雞,雞生蛋問題。
nativeaction是通過SET_APP_HANDLER註冊的
對應的函數名是apply_eosio_xxx,比如apply_eosio_setcode
,apply_eosio_newaccount
eosio.bios
是一個智慧合約的程式碼,是通過智慧合約部署方式繫結到eosio contract上的。那eosio.bios部署後,nativeactions部分是不是就失效了啊。確實可以這樣實現,由於setcode這些action需要永久生效,這就需要eosio.bios包含nativeactions這些函數,這樣就出現了相同一份程式碼分散在兩個模組,獨立性和維護不夠好。所以,目前的實現是通過特殊處理讓nativeactions的函數有最高優先順序,永不覆蓋,哪怕eosio.bios實現了同樣的函數(比如set_code, set_abi)。
但是eosio.system
和eosio.bios是一個級別的,都是contract, 是水火不相容的,一旦將eosio.system繫結到eosio這個賬號,eosio.bios就失效了,所以eosio.bios的函數要麼是臨時用途的,要麼就需要bios.system重新實現,比如setalimits會失效,而setpriv會在eosio.system重新實現。
這個和作業系統啟動一樣,一開始bios(bootloader)程式碼執行,然後引導system程式碼,當system載入後,bios(bootloader)程式碼失效。所以從這個設計和名字可以看出,EOS確實是在按照作業系統的邏輯設計。