mirror of
https://github.com/luxfi/chains.git
synced 2026-09-24 00:26:00 +00:00
The two shims re-exported luxfi/oracle's and luxfi/relay's private vmID literals. constants.OracleVMID and constants.RelayVMID exist, agree with them, and nothing made them agree. This repo builds the plugin binary whose FILENAME is that id, so the shims now name the constant and their tests compare all three; a drift upstream fails here instead of producing a chain no node starts. cevm gets ErrNotLinked, so a caller can tell "this build has no C++ EVM" from "this input is bad". cevm/parallel's sender-recovery step returned a hard error for the first, which in a build without the library is every block, forever, and CEVM_STRICT=0 -- the documented rollback to the Go EVM -- did not reach that line. It now leaves by declineBlock like every other capability refusal. Its receipt gate asked whether a transaction carried calldata. A contract creation with empty init code carries none, so it was receipted as a value transfer: no ContractAddress, and 21000 intrinsic gas against creation's 53000, into the cumulative total the header commits to. ExecuteBlock splits into shape / dispatch / assemble so the parity-critical half needs no library to exercise. strictGPUEVM loses the sync.Once that fixed its answer at the first decline and left both branches unreachable from one process. The native build referenced gpu_execute_block and gpu_free_result, which ABI v6 removed, so nothing behind lux_cevm_native compiled at all. The three plugins print the version the VM reports rather than a second literal beside it, and the vmID the binary must be installed under: a plugin under the wrong filename is invisible and the chain simply never appears. cevm/plugin.go is gone. It located a binary at ~/work/luxcpp/evm/build/bin/cevm, a path that has never existed -- the tree is luxcpp/cevm -- claimed the lux CLI and universe Makefiles used it, which neither does, and returned "cevm" from a function called VMID. Its two tests skipped and asserted nothing. .gitignore's bare `plugin` matched every <vm>/cmd/plugin DIRECTORY, so a new file under one could not be added: git printed a hint and staged nothing. mpcvm's and bridgevm's plugin tests are written, pass, and are not in the repository. Coverage: evm 0.0 -> 85.0, evm/cevm 71.1 -> 100.0, evm/cevm/parallel 0.0 -> 86.1, oraclevm 0.0 -> 90.0, oraclevm/cmd/plugin 0.0 -> 72.2, relayvm/cmd/plugin 0.0 -> 72.2.
70 lines
2.9 KiB
Go
70 lines
2.9 KiB
Go
// Package relayvm is a thin re-export of the canonical R-Chain VM
|
|
// implementation in github.com/luxfi/relay/vm. The canonical source lives
|
|
// in luxfi/relay so the standalone `relayd` operator daemon and the
|
|
// in-luxd plugin share one code path.
|
|
package relayvm
|
|
|
|
import (
|
|
"github.com/luxfi/constants"
|
|
relayvm "github.com/luxfi/relay/vm"
|
|
"github.com/luxfi/vm/chain"
|
|
)
|
|
|
|
// Re-exported public surface — type aliases keep existing import paths working.
|
|
type (
|
|
Config = relayvm.Config
|
|
Channel = relayvm.Channel
|
|
Message = relayvm.Message
|
|
MessageReceipt = relayvm.MessageReceipt
|
|
VM = relayvm.VM
|
|
Genesis = relayvm.Genesis
|
|
SignedReceipt = relayvm.SignedReceipt
|
|
ReceiptCommit = relayvm.ReceiptCommit
|
|
Service = relayvm.Service
|
|
Factory = relayvm.Factory
|
|
DestNonceKey = relayvm.DestNonceKey
|
|
RelayVertex = relayvm.RelayVertex
|
|
)
|
|
|
|
// Service args/replies — re-exported.
|
|
type (
|
|
OpenChannelArgs = relayvm.OpenChannelArgs
|
|
OpenChannelReply = relayvm.OpenChannelReply
|
|
GetChannelArgs = relayvm.GetChannelArgs
|
|
ChannelReply = relayvm.ChannelReply
|
|
GetChannelReply = relayvm.GetChannelReply
|
|
CloseChannelArgs = relayvm.CloseChannelArgs
|
|
CloseChannelReply = relayvm.CloseChannelReply
|
|
ListChannelsArgs = relayvm.ListChannelsArgs
|
|
ListChannelsReply = relayvm.ListChannelsReply
|
|
SendMessageArgs = relayvm.SendMessageArgs
|
|
SendMessageReply = relayvm.SendMessageReply
|
|
GetMessageArgs = relayvm.GetMessageArgs
|
|
MessageReply = relayvm.MessageReply
|
|
GetMessageReply = relayvm.GetMessageReply
|
|
ReceiveMessageArgs = relayvm.ReceiveMessageArgs
|
|
ReceiveMessageReply = relayvm.ReceiveMessageReply
|
|
GetVerifiedMessageArgs = relayvm.GetVerifiedMessageArgs
|
|
GetVerifiedMessageReply = relayvm.GetVerifiedMessageReply
|
|
HealthArgs = relayvm.HealthArgs
|
|
HealthReply = relayvm.HealthReply
|
|
)
|
|
|
|
// VMID identifies R-Chain. It is constants.RelayVMID and nothing else.
|
|
//
|
|
// A vmID is an immutable one-way door: it is baked into the CreateChainTx at
|
|
// genesis, it is the plugin binary's filename, and it is what the P-Chain
|
|
// stores forever. So it is named from the one source of truth rather than
|
|
// re-exported from luxfi/relay, which declares it as a private literal
|
|
// (`ids.ID{'r','e','l','a','y','v','m'}`) that agrees with constants by
|
|
// coincidence and nothing else. This repo builds the plugin binary, so this
|
|
// repo is where the two must be proven to agree: TestVMID_IsCanonicalAndStable
|
|
// compares all three.
|
|
var VMID = constants.RelayVMID
|
|
|
|
// Factory.New satisfies the node's vms.Factory and so returns interface{}.
|
|
// What the plugin serves is a chain.ChainVM, and this is where that is
|
|
// established — a build error here rather than a type assertion that fails at
|
|
// the moment an operator starts the chain.
|
|
var _ chain.ChainVM = (*VM)(nil)
|