diff --git a/app/appmessage/protocol.go b/app/appmessage/protocol.go index 03ac66521..830c13e2e 100644 --- a/app/appmessage/protocol.go +++ b/app/appmessage/protocol.go @@ -13,37 +13,51 @@ import ( const ( // DefaultServices describes the default services that are supported by // the server. + // DefaultServices는 지원되는 기본 서비스를 설명합니다. + // 서버. DefaultServices = SFNodeNetwork | SFNodeBloom | SFNodeCF ) // ServiceFlag identifies services supported by a kaspa peer. +// ServiceFlag는 kaspa 피어가 지원하는 서비스를 식별합니다. type ServiceFlag uint64 const ( // SFNodeNetwork is a flag used to indicate a peer is a full node. + // ServiceFlag는 kaspa 액세서리가 지원하는 서비스를 정의합니다. SFNodeNetwork ServiceFlag = 1 << iota // SFNodeGetUTXO is a flag used to indicate a peer supports the // getutxos and utxos commands (BIP0064). + // SFNodeGetUTXO는 피어가 다음을 지원함을 나타내는 데 사용되는 플래그입니다. + // getutxos 및 utxos 명령(BIP0064). SFNodeGetUTXO // SFNodeBloom is a flag used to indicate a peer supports bloom // filtering. + // SFNodeBloom은 피어가 블룸을 지원함을 나타내는 데 사용되는 플래그입니다. + // 필터링 중입니다. SFNodeBloom // SFNodeXthin is a flag used to indicate a peer supports xthin blocks. + // SFNodeXthin은 피어가 xthin 블록을 지원함을 나타내는 데 사용되는 플래그입니다. SFNodeXthin // SFNodeBit5 is a flag used to indicate a peer supports a service // defined by bit 5. + // SFNodeBit5는 피어가 서비스를 지원함을 나타내는 데 사용되는 플래그입니다. + // 비트 5로 정의됩니다. SFNodeBit5 // SFNodeCF is a flag used to indicate a peer supports committed // filters (CFs). + // SFNodeCF는 피어가 커밋을 지원함을 나타내는 데 사용되는 플래그입니다. + // 필터(CF). SFNodeCF ) // Map of service flags back to their constant names for pretty printing. +// 서비스 플래그 맵은 예쁜 인쇄를 위해 상수 이름으로 다시 표시됩니다. var sfStrings = map[ServiceFlag]string{ SFNodeNetwork: "SFNodeNetwork", SFNodeGetUTXO: "SFNodeGetUTXO", @@ -55,6 +69,8 @@ var sfStrings = map[ServiceFlag]string{ // orderedSFStrings is an ordered list of service flags from highest to // lowest. +// OrderedSFStrings는 서비스 플래그를 가장 높은 것부터 순서대로 나열한 목록입니다. +// 최저. var orderedSFStrings = []ServiceFlag{ SFNodeNetwork, SFNodeGetUTXO, @@ -81,6 +97,7 @@ func (f ServiceFlag) String() string { } // Add any remaining flags which aren't accounted for as hex. + // 16진수로 간주되지 않는 나머지 플래그를 추가합니다. s = strings.TrimRight(s, "|") if f != 0 { s += "|0x" + strconv.FormatUint(uint64(f), 16) @@ -90,14 +107,20 @@ func (f ServiceFlag) String() string { } // KaspaNet represents which kaspa network a message belongs to. +// KaspaNet은 메시지가 속한 Kaspa 네트워크를 나타냅니다. type KaspaNet uint32 // Constants used to indicate the message kaspa network. They can also be // used to seek to the next message when a stream's state is unknown, but // this package does not provide that functionality since it's generally a // better idea to simply disconnect clients that are misbehaving over TCP. +// 메시지 kaspa 네트워크를 나타내는 데 사용되는 상수입니다. 그들은 또한 +// 스트림 상태를 알 수 없을 때 다음 메시지를 찾는 데 사용되지만, +// 이 패키지는 일반적으로 다음과 같은 기능을 제공하므로 해당 기능을 제공하지 않습니다. +// TCP를 통해 오작동하는 클라이언트의 연결을 끊는 것이 더 나은 아이디어입니다. const ( // Mainnet represents the main kaspa network. + // 메인넷은 주요 kaspa 네트워크를 나타냅니다. Mainnet KaspaNet = 0x3ddcf71d // Testnet represents the test network. @@ -112,6 +135,8 @@ const ( // bnStrings is a map of kaspa networks back to their constant names for // pretty printing. +// bnStrings는 kaspa 네트워크의 상수 이름으로 돌아가는 맵입니다. +// 예쁜 인쇄. var bnStrings = map[KaspaNet]string{ Mainnet: "Mainnet", Testnet: "Testnet", @@ -120,6 +145,7 @@ var bnStrings = map[KaspaNet]string{ } // String returns the KaspaNet in human-readable form. +// 문자열은 사람이 읽을 수 있는 형식으로 KaspaNet을 반환합니다. func (n KaspaNet) String() string { if s, ok := bnStrings[n]; ok { return s diff --git a/changelog.txt b/changelog.txt index b59da47e9..f3712866b 100644 --- a/changelog.txt +++ b/changelog.txt @@ -268,6 +268,12 @@ Non-breaking changes: * ExpectedHeaderPruningPoint fix (#1876) * Changes to libkaspawallet to support Kaspaper (#1878) * Get rid of genesis's UTXO dump (#1867) +주요 변경 사항: +* devnet 및 testnet에서 헤더 질량을 무시합니다(#1879) +* CalcSubsidy에서 사용하지 않는 인수 제거(#1877) +* ExpectedHeaderPruningPoint 수정(#1876) +* Kaspaper를 지원하기 위해 libkaspwallet 변경(#1878) +* Genesis의 UTXO 덤프 제거(#1867) Kaspad v0.11.2 - 2021-11-11 =========================== diff --git a/domain/consensus/processes/blockparentbuilder/blockparentbuilder.go b/domain/consensus/processes/blockparentbuilder/blockparentbuilder.go index adacb42a1..0c5b80f67 100644 --- a/domain/consensus/processes/blockparentbuilder/blockparentbuilder.go +++ b/domain/consensus/processes/blockparentbuilder/blockparentbuilder.go @@ -83,6 +83,7 @@ func (bpb *blockParentBuilder) BuildParents(stagingArea *model.StagingArea, } if !foundFirstParentInFutureOfPruningPoint { + // BuildParents는 향후 가지치기 지점에서 적어도 하나의 부모를 얻어야 합니다. return nil, errors.New("BuildParents should get at least one parent in the future of the pruning point") } @@ -144,6 +145,8 @@ func (bpb *blockParentBuilder) BuildParents(stagingArea *model.StagingArea, if hasReachabilityData { // If a block is in the future of one of the virtual genesis children it means we have the full DAG between the current block // and this parent, so there's no need for any indirect reference blocks, and normal reachability queries can be used. + // 블록이 가상 창세기 자식 중 하나의 미래에 있는 경우 이는 현재 블록 사이에 전체 DAG가 있음을 의미합니다. + // 및 이 부모이므로 간접 참조 블록이 필요하지 않으며 일반적인 연결 가능성 쿼리를 사용할 수 있습니다. isInFutureOfVirtualGenesisChildren, err = bpb.dagTopologyManager.IsAnyAncestorOf(stagingArea, virtualGenesisChildren, parent) if err != nil { return nil, err @@ -160,6 +163,16 @@ func (bpb *blockParentBuilder) BuildParents(stagingArea *model.StagingArea, // the virtual genesis children in the pruning point anticone. So we can check which // virtual genesis children have this block as parent and use those block as // reference blocks. + // 참조 블록은 도달 가능성 쿼리에서 다음을 확인하는 데 사용되는 블록입니다. + // 후보자는 다른 후보자의 미래에 있습니다. 대부분의 경우 이는 단지 + // 자체를 차단하지만 블록에 필요한 도달 가능성 데이터가 없는 경우 + // 대신 미래에 일부 블록을 참조로 사용합니다. + // 먼저 가지치기 지점의 미래에 부모를 추가했는지 확인하면 다음을 수행할 수 있습니다. + // 가지치기에서 일부 블록의 과거에 있는 가지치기된 후보를 알고 있습니다. + // 포인트 안티콘은 다음 중 하나의 상위(관련 수준)여야 합니다. + // 가지치기 지점 안티콘의 가상 기원 자식. 그래서 우리는 어느 것을 확인할 수 있습니다 + // 가상 제네시스 자식은 이 블록을 부모로 갖고 해당 블록을 다음과 같이 사용합니다. + // 참조 블록. var referenceBlocks []*externalapi.DomainHash if isInFutureOfVirtualGenesisChildren { referenceBlocks = []*externalapi.DomainHash{parent} @@ -217,6 +230,8 @@ func (bpb *blockParentBuilder) BuildParents(stagingArea *model.StagingArea, // We should add the block as a candidate if it's in the future of another candidate // or in the anticone of all candidates. + // 블록이 다른 후보의 미래에 있는 경우 해당 블록을 후보로 추가해야 합니다. + // 또는 모든 후보자의 반대쪽에 있습니다. if !isAncestorOfAnyCandidate || toRemove.Length() > 0 { candidatesByLevelToReferenceBlocksMap[blockLevel][*parent] = referenceBlocks } diff --git a/domain/consensus/processes/blockprocessor/validate_and_insert_block.go b/domain/consensus/processes/blockprocessor/validate_and_insert_block.go index 5d71d60e0..6091f1a50 100644 --- a/domain/consensus/processes/blockprocessor/validate_and_insert_block.go +++ b/domain/consensus/processes/blockprocessor/validate_and_insert_block.go @@ -4,6 +4,7 @@ import ( // we need to embed the utxoset of mainnet genesis here _ "embed" "fmt" + "github.com/kaspanet/kaspad/domain/consensus/model" "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" "github.com/kaspanet/kaspad/domain/consensus/ruleerrors" @@ -233,6 +234,16 @@ func (bp *blockProcessor) loadUTXODataForGenesis(stagingArea *model.StagingArea, // The actual UTXO set that fits Mainnet's genesis' UTXO commitment was removed from the codebase in order // to make reduce the consensus initialization time and the compiled binary size, but can be still // found here for anyone to verify: https://github.com/kaspanet/kaspad/blob/dbf18d8052f000ba0079be9e79b2d6f5a98b74ca/domain/consensus/processes/blockprocessor/resources/utxos.gz + // 참고: 적용된 UTXO 집합 및 다중 집합은 UTXO 약속을 충족하지 않습니다. + // 메인넷의 탄생. 그렇기 때문에 모든 블록은 제네시스 위에 구축될 것입니다. + // 잘못된 UTXO 약속도 갖게 되며 합의에 도달할 수 없습니다. + // 나머지 네트워크와 함께. + // 이것이 바로 제네시스 위에 직접 블록을 가져오는 것이 금지된 이유이며, 유일한 방법은 + // 최근 노드에 대한 증명을 요청하여 생성된 노드의 최신 상태를 얻습니다. + // 가지치기 지점. + // 메인넷 제네시스의 UTXO 공약에 맞는 실제 UTXO 세트는 순서대로 코드베이스에서 제거되었습니다. + // 합의 초기화 시간과 컴파일된 바이너리 크기를 줄이기 위해 하지만 여전히 + // 누구나 확인할 수 있도록 여기에 있습니다: https://github.com/kaspanet/kaspad/blob/dbf18d8052f000ba0079be9e79b2d6f5a98b74ca/domain/consensus/processes/blockprocessor/resources/utxos.gz bp.consensusStateStore.StageVirtualUTXODiff(stagingArea, utxo.NewUTXODiff()) bp.utxoDiffStore.Stage(stagingArea, blockHash, utxo.NewUTXODiff(), nil) bp.multisetStore.Stage(stagingArea, blockHash, multiset.New()) diff --git a/domain/consensus/processes/blockprocessor/validate_and_insert_imported_pruning_point.go b/domain/consensus/processes/blockprocessor/validate_and_insert_imported_pruning_point.go index 069af66a8..51bff7419 100644 --- a/domain/consensus/processes/blockprocessor/validate_and_insert_imported_pruning_point.go +++ b/domain/consensus/processes/blockprocessor/validate_and_insert_imported_pruning_point.go @@ -9,7 +9,7 @@ import ( func (bp *blockProcessor) validateAndInsertImportedPruningPoint( stagingArea *model.StagingArea, newPruningPointHash *externalapi.DomainHash) error { - + // 주어진 가지치기 지점이 예상되는 가지치기 지점인지 확인 log.Info("Checking that the given pruning point is the expected pruning point") isValidPruningPoint, err := bp.pruningManager.IsValidPruningPoint(stagingArea, newPruningPointHash) @@ -18,6 +18,7 @@ func (bp *blockProcessor) validateAndInsertImportedPruningPoint( } if !isValidPruningPoint { + // 유효한 가지치기 지점이 아닙니다. return errors.Wrapf(ruleerrors.ErrUnexpectedPruningPoint, "%s is not a valid pruning point", newPruningPointHash) } @@ -28,10 +29,11 @@ func (bp *blockProcessor) validateAndInsertImportedPruningPoint( } if !arePruningPointsInValidChain { + // 가지치기 지점은 유효한 "+"제네시스 체인 return errors.Wrapf(ruleerrors.ErrInvalidPruningPointsChain, "pruning points do not compose a valid "+ "chain to genesis") } - + // 새로운 가지치기 지점에 따라 합의 상태 관리자 업데이트 log.Infof("Updating consensus state manager according to the new pruning point %s", newPruningPointHash) err = bp.consensusStateManager.ImportPruningPointUTXOSet(stagingArea, newPruningPointHash) if err != nil { diff --git a/domain/consensus/processes/consensusstatemanager/add_block_to_virtual.go b/domain/consensus/processes/consensusstatemanager/add_block_to_virtual.go index da2f77a1e..59eb0f26f 100644 --- a/domain/consensus/processes/consensusstatemanager/add_block_to_virtual.go +++ b/domain/consensus/processes/consensusstatemanager/add_block_to_virtual.go @@ -83,6 +83,7 @@ func (csm *consensusStateManager) isCandidateToBeNextVirtualSelectedParent( defer log.Tracef("isCandidateToBeNextVirtualSelectedParent end for block %s", blockHash) if blockHash.Equal(csm.genesisHash) { + // "블록 %s은(는) 최초 블록이므로 "+"정의에 따라 선택된 부모" log.Debugf("Block %s is the genesis block, therefore it is "+ "the selected parent by definition", blockHash) return true, nil @@ -128,6 +129,7 @@ func (csm *consensusStateManager) calculateNewTips( defer log.Tracef("calculateNewTips end for new tip %s", newTipHash) if newTipHash.Equal(csm.genesisHash) { + // 새로운 팁은 제네시스 블록이므로 정의상 유일한 팁입니다. log.Debugf("The new tip is the genesis block, therefore it is the only tip by definition") return []*externalapi.DomainHash{newTipHash}, nil } diff --git a/domain/dagconfig/params.go b/domain/dagconfig/params.go index c6a40b42b..bf49851d7 100644 --- a/domain/dagconfig/params.go +++ b/domain/dagconfig/params.go @@ -49,6 +49,9 @@ type KType uint8 // Params defines a Kaspa network by its parameters. These parameters may be // used by Kaspa applications to differentiate networks as well as addresses // and keys for one network from those intended for use on another network. +// Params는 매개변수로 Kaspa 네트워크를 정의합니다. 이러한 매개변수는 다음과 같습니다. +// 네트워크와 주소를 구별하기 위해 Kaspa 애플리케이션에서 사용됩니다. +// 그리고 다른 네트워크에서 사용하기 위한 키 중 하나의 네트워크에 대한 키입니다. type Params struct { // K defines the K parameter for GHOSTDAG consensus algorithm. // See ghostdag.go for further details. @@ -86,11 +89,16 @@ type Params struct { // BlockCoinbaseMaturity is the number of blocks required before newly mined // coins can be spent. + // BlockCoinbaseMaturity는 새로 채굴되기 전에 필요한 블록 수입니다. + // 코인을 사용할 수 있습니다. BlockCoinbaseMaturity uint64 // SubsidyGenesisReward SubsidyMergeSetRewardMultiplier, and // SubsidyPastRewardMultiplier are part of the block subsidy equation. // Further details: https://hashdag.medium.com/kaspa-launch-plan-9a63f4d754a6 + // SubsidyGenesisReward SubsidyMergeSetRewardMultiplier 및 + // SubsidyPastRewardMultiplier는 블록 보조금 방정식의 일부입니다. + // 자세한 내용: https://hashdag.medium.com/kaspa-launch-plan-9a63f4d754a6 SubsidyGenesisReward uint64 PreDeflationaryPhaseBaseSubsidy uint64 DeflationaryPhaseBaseSubsidy uint64 @@ -104,10 +112,14 @@ type Params struct { // TimestampDeviationTolerance is the maximum offset a block timestamp // is allowed to be in the future before it gets delayed + // TimestampDeviationTolerance는 블록 타임스탬프의 최대 오프셋입니다. + // 지연되기 전에 미래에 있을 수 있습니다. TimestampDeviationTolerance int // DifficultyAdjustmentWindowSize is the size of window that is inspected // to calculate the required difficulty of each block. + // TimestampDeviationTolerance는 블록 타임스탬프의 최대 예외입니다. + // 지연되기 전에 미래에 있을 수 있습니다. DifficultyAdjustmentWindowSize int // These fields are related to voting on consensus rule changes as @@ -123,6 +135,16 @@ type Params struct { // // Deployments define the specific consensus rule changes to be voted // on. + // 이 필드는 다음과 같이 합의 규칙 변경에 대한 투표와 관련됩니다. + // BIP0009에 의해 정의됩니다. + // RuleChangeActivationThreshold는 임계값의 블록 수입니다. + // 규칙 변경에 대해 긍정적인 투표를 한 상태 재타겟 창 상태 + // 규칙 변경을 잠그려면 캐스팅해야 합니다. 일반적으로 + // 메인 네트워크의 경우 95%, 테스트 네트워크의 경우 75%입니다. + // MinerConfirmationWindow는 각 임계값의 블록 수입니다. + // 상태 변경 창. + // 배포는 투표할 특정 합의 규칙 변경 사항을 정의합니다. + // 에. RuleChangeActivationThreshold uint64 MinerConfirmationWindow uint64 @@ -131,60 +153,81 @@ type Params struct { // AcceptUnroutable specifies whether this network accepts unroutable // IP addresses, such as 10.0.0.0/8 + // AcceptUnroutable은 이 네트워크가 라우팅 불가를 허용하는지 여부를 지정합니다. + // IP 주소(예: 10.0.0.0/8) AcceptUnroutable bool // Human-readable prefix for Bech32 encoded addresses + // Bech32로 인코딩된 주소에 대한 사람이 읽을 수 있는 접두사 Prefix util.Bech32Prefix // Address encoding magics PrivateKeyID byte // First byte of a WIF private key // EnableNonNativeSubnetworks enables non-native/coinbase transactions + // EnableNonNativeSubnetworks는 비네이티브/코인베이스 거래를 활성화합니다. EnableNonNativeSubnetworks bool // DisableDifficultyAdjustment determine whether to use difficulty + // DisableDifficultyAdjustment 난이도 사용 여부를 결정합니다. DisableDifficultyAdjustment bool // SkipProofOfWork indicates whether proof of work should be checked. + // SkipProofOfWork는 작업 증명을 확인해야 하는지 여부를 나타냅니다. SkipProofOfWork bool // MaxCoinbasePayloadLength is the maximum length in bytes allowed for a block's coinbase's payload + // MaxCoinbasePayloadLength는 블록의 코인베이스 페이로드에 허용되는 최대 길이(바이트)입니다. MaxCoinbasePayloadLength uint64 // MaxBlockMass is the maximum mass a block is allowed + // MaxBlockMass는 블록에 허용되는 최대 질량입니다. MaxBlockMass uint64 // MaxBlockParents is the maximum number of blocks a block is allowed to point to + // MaxBlockParents는 블록이 가리킬 수 있는 최대 블록 수입니다. MaxBlockParents externalapi.KType // MassPerTxByte is the number of grams that any byte // adds to a transaction. + // MassPerTxByte는 임의의 바이트가 전송하는 그램 수입니다. + // 트랜잭션에 추가합니다. MassPerTxByte uint64 // MassPerScriptPubKeyByte is the number of grams that any // scriptPubKey byte adds to a transaction. + // MassPerScriptPubKeyByte는 임의의 그램 수입니다. + // scriptPubKey 바이트가 트랜잭션에 추가됩니다. MassPerScriptPubKeyByte uint64 // MassPerSigOp is the number of grams that any // signature operation adds to a transaction. + // MassPerSigOp는 임의의 그램 수입니다. + // 서명 작업이 트랜잭션에 추가됩니다. MassPerSigOp uint64 // MergeSetSizeLimit is the maximum number of blocks in a block's merge set + // MergeSetSizeLimit은 블록 병합 세트의 최대 블록 수입니다. MergeSetSizeLimit uint64 // CoinbasePayloadScriptPublicKeyMaxLength is the maximum allowed script public key in the coinbase's payload + // CoinbasePayloadScriptPublicKeyMaxLength는 코인베이스 페이로드에서 허용되는 최대 스크립트 공개 키입니다. CoinbasePayloadScriptPublicKeyMaxLength uint8 // PruningProofM is the 'm' constant in the pruning proof. For more details see: https://github.com/kaspanet/research/issues/3 + // PruningProofM은 가지치기 증명의 'm' 상수입니다. 자세한 내용은 https://github.com/kaspanet/research/issues/3을 참조하세요. PruningProofM uint64 // DeflationaryPhaseDaaScore is the DAA score after which the monetary policy switches // to its deflationary phase + // DeflationaryPhaseDaaScore는 통화 정책이 전환된 이후의 DAA 점수입니다. + // 디플레이션 단계로 DeflationaryPhaseDaaScore uint64 DisallowDirectBlocksOnTopOfGenesis bool // MaxBlockLevel is the maximum possible block level. + // MaxBlockLevel은 가능한 최대 블록 레벨입니다. MaxBlockLevel int MergeDepth uint64 @@ -192,21 +235,26 @@ type Params struct { // NormalizeRPCServerAddress returns addr with the current network default // port appended if there is not already a port specified. +// NormalizeRPCServerAddress는 현재 네트워크 기본값으로 addr을 반환합니다. +// 포트가 아직 지정되지 않은 경우 포트가 추가됩니다. func (p *Params) NormalizeRPCServerAddress(addr string) (string, error) { return network.NormalizeAddress(addr, p.RPCPort) } // FinalityDepth returns the finality duration represented in blocks +// FinalityDepth는 블록으로 표현된 최종 지속 기간을 반환합니다. func (p *Params) FinalityDepth() uint64 { return uint64(p.FinalityDuration / p.TargetTimePerBlock) } // PruningDepth returns the pruning duration represented in blocks +// PruningDepth는 블록으로 표시된 가지치기 기간을 반환합니다. func (p *Params) PruningDepth() uint64 { return 2*p.FinalityDepth() + 4*p.MergeSetSizeLimit*uint64(p.K) + 2*uint64(p.K) + 2 } // MainnetParams defines the network parameters for the main Kaspa network. +// MainnetParams는 기본 Kaspa 네트워크에 대한 네트워크 매개변수를 정의합니다. var MainnetParams = Params{ K: defaultGHOSTDAGK, Name: "c4ex-mainnet", @@ -365,6 +413,13 @@ var TestnetParams = Params{ // which are specifically specified are used to create the network rather than // following normal discovery rules. This is important as otherwise it would // just turn into another public testnet. +// SimnetParams는 Kaspa 시뮬레이션 테스트를 위한 네트워크 매개변수를 정의합니다. +// 네트워크. 이 네트워크는 다음을 제외하면 일반 테스트 네트워크와 유사합니다. +// 시뮬레이션을 수행하는 개인 그룹 내에서 개인적으로 사용하기 위한 것입니다. +// 테스트 중입니다. 기능은 유일한 노드라는 점에서 다릅니다. +// 특별히 지정된 것은 네트워크를 생성하는 데 사용됩니다. +// 일반적인 검색 규칙을 따릅니다. 그렇지 않은 경우에는 이것이 중요합니다. +// 다른 공개 테스트넷으로 전환합니다. var SimnetParams = Params{ K: defaultGHOSTDAGK, Name: "c4ex-simnet", diff --git a/stability-tests/common/mine/mine.go b/stability-tests/common/mine/mine.go index 782009804..bfc13de77 100644 --- a/stability-tests/common/mine/mine.go +++ b/stability-tests/common/mine/mine.go @@ -153,6 +153,7 @@ func mineOrFetchBlock(blockData JSONBlock, mdb *miningDB, testConsensus testapi. var random = rand.New(rand.NewSource(time.Now().UnixNano())) // SolveBlock increments the given block's nonce until it matches the difficulty requirements in its bits field +// SolveBlock은 비트 필드의 난이도 요구 사항과 일치할 때까지 주어진 블록의 nonce를 증가시킵니다. func SolveBlock(block *externalapi.DomainBlock) { mining.SolveBlock(block, random) }